{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Testing in Production","siteUrl":"https://docs.omno.com"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"testing-in-production","__idx":0},"children":["Testing in Production"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["OMNO provides a single production environment. You test by processing real API calls against ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["fake PSPs"]}," that OMNO configures on your production account."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test transactions are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["not"]}," charged or billed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fake PSPs return predefined statuses and controlled responses so you can simulate each outcome."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["When testing is finished, OMNO ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["removes"]}," the fake PSPs from your configuration."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"request-test-setup","__idx":1},"children":["Request test setup"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Contact OMNO to have fake PSPs configured on your account. In the Dashboard the fake providers appear under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Payment Providers → Add Provider → Authorize"]},", for example:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fake Card Pay-In"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fake APM Pay-In"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fake Card Pay-Out"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fake APM Pay-Out"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After authorization, make sure each provider is configured in the Router and active."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["[TBD: exact process / contact for requesting fake PSP setup]"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"identifying-test-transactions","__idx":2},"children":["Identifying test transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A transaction processed by a fake PSP has ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantPspId"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["processorPspId"]}," equal to the fake PSP ID provided by OMNO. Check this field (via webhook payload or the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.omno.com/apis"},"children":["GET transaction endpoint"]},") before touching balances."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["⚠️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warning:"]}," Never credit or debit real player balances for transactions processed by a fake PSP."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"simulating-outcomes","__idx":3},"children":["Simulating outcomes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fake PSP decides the outcome from a controlled input value: the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["CVC"]}," for cards, or a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3-digit value in the recipient field"]}," for APMs."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"cashier-card-apm-crypto","__idx":4},"children":["Cashier (card, APM, crypto)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Card"]}," — use these test cards (fake PSP only):"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Purpose"},"children":["Purpose"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Card number"},"children":["Card number"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Expiry"},"children":["Expiry"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"CVC"},"children":["CVC"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Success"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4539148803436467"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["12/29"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["123"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Failure (before PSP)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["6011111111111117"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["12/29"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["123"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3DS challenge"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["378282246310005"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["12/29"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["123"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cardholder name can be any value. For 3DS, you are redirected to a simulated provider page where you choose the final outcome."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Card decline simulation by CVC:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"CVC"},"children":["CVC"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Result"},"children":["Result"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["001"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["General card decline"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["004"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card expired"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["005"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card inactive or blocked"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["011"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Insufficient funds"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["013"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid card number"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["015"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["CVV check failed"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["026"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction marked as fraud"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["033"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Provider timeout"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["034"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Provider rejected request"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["040"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Service unavailable"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["APM"]}," — the fake APM PSP uses the same 3-digit codes as card declines, but the value is entered in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["recipient field"]}," instead of the CVC."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Crypto"]}," — [TBD: how to simulate success/decline/pending/timeout for crypto in the Cashier]"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"direct-link-apm-crypto-wallet-payout","__idx":5},"children":["Direct Link (APM, crypto wallet, payout)"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["APM"]}," — provide the 3-digit outcome code in the recipient field, as above."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Crypto wallet"]}," — [TBD: how to simulate crypto wallet outcomes for Direct Link]"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Payout"]}," — use the payout decline codes below."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"payment-page-legacy-card-apm","__idx":6},"children":["Payment Page (Legacy) (card, APM)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Card and APM behave as in the Cashier: CVC codes for cards, recipient-field codes for APMs."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"payout-confirm--reject","__idx":7},"children":["Payout confirm / reject"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Payout decline simulation:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Code"},"children":["Code"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Result"},"children":["Result"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["002"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction not allowed"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["004"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card expired"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["005"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card inactive"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["011"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Insufficient funds"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["013"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid card number"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["016"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid amount or currency"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["026"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Marked as fraud"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["033"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Transaction timeout"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["034"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Rejected by provider"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["040"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Service unavailable"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For payouts requiring manual approval, exercise both ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.omno.com/apis"},"children":["confirm and reject"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"outcome-coverage","__idx":8},"children":["Outcome coverage"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Outcome"},"children":["Outcome"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"How to simulate"},"children":["How to simulate"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Success"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Success card / valid input (see above)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Decline (by PSP)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["CVC / recipient decline codes above."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Failure (before PSP)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Failure card, or routing/provider restriction."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Pending → async final status"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["[TBD: how to simulate a pending-then-async-final outcome per flow]"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Timeout"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card CVC ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["033"]},", payout code ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["033"]},". [TBD: confirm timeout simulation for APM/crypto]"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3DS (card)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Card ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["378282246310005"]}," (see above)."]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["ℹ️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["Failures"]}," occur before the PSP (routing or provider restrictions); ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["declines"]}," are returned by the PSP layer; ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["success"]}," depends on valid input and routing eligibility."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"going-live-checklist","__idx":9},"children":["Going-live checklist"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These steps are the testing-and-go-live part of ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/getting-started/how-onboarding-works"},"children":["How Onboarding Works"]},"."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," OMNO has removed the fake PSPs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Live PSPs are configured and routers are verified."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Webhook handling is verified, including idempotency and out-of-order statuses."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Balance-crediting logic ignores fake PSP IDs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"input","attributes":{"checked":false,"type":"checkbox","readOnly":true},"children":[]}," Final status is taken only from webhooks or the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://docs.omno.com/apis"},"children":["GET transaction endpoint"]},"."]}]}]},"headings":[{"value":"Testing in Production","id":"testing-in-production","depth":1},{"value":"Request test setup","id":"request-test-setup","depth":2},{"value":"Identifying test transactions","id":"identifying-test-transactions","depth":2},{"value":"Simulating outcomes","id":"simulating-outcomes","depth":2},{"value":"Cashier (card, APM, crypto)","id":"cashier-card-apm-crypto","depth":3},{"value":"Direct Link (APM, crypto wallet, payout)","id":"direct-link-apm-crypto-wallet-payout","depth":3},{"value":"Payment Page (Legacy) (card, APM)","id":"payment-page-legacy-card-apm","depth":3},{"value":"Payout confirm / reject","id":"payout-confirm--reject","depth":3},{"value":"Outcome coverage","id":"outcome-coverage","depth":3},{"value":"Going-live checklist","id":"going-live-checklist","depth":2}],"frontmatter":{"seo":{"title":"Testing in Production"}},"lastModified":"2026-10-12T06:54:23.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/getting-started/testing-in-production","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}