{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Webhooks","siteUrl":"https://docs.omno.com"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"webhooks","__idx":0},"children":["Webhooks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Webhooks deliver real-time transaction status changes to your server. They are the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["single source of truth"]}," for final outcomes — never rely on redirects or client-side events."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["⚠️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warning:"]}," Credit or debit a player balance only after a webhook (or a GET on the transaction) confirms the final status. Browser redirects and SDK events can be lost or spoofed."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"configure-webhooks","__idx":1},"children":["Configure webhooks"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log in to the Omno Dashboard."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Go to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developers → Webhooks"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create Webhook"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fill in the fields: ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name"]}," (internal identifier) and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Webhook URL"]}," (the endpoint that receives events)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Hook Type"]},": Transaction."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select which transaction events to receive."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Choose an authorization method if you want one."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can monitor delivery under ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Developers → Webhooks"]},": full request payloads, your server's responses, and the delivery status of each attempt."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"which-events-trigger-a-webhook","__idx":2},"children":["Which events trigger a webhook"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You subscribe to the transaction events relevant to your integration — such as creation, processing updates, success, failure/timeout and refund updates. Each selected event fires a webhook when the transaction reaches that state. Your Omno integration team shares the exact event list and payload samples during integration."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"handling-requirements","__idx":3},"children":["Handling requirements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Respond quickly"]}," — do heavy processing asynchronously."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Process idempotently"]}," — the same transaction can arrive more than once."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Handle out-of-order statuses"]}," — never downgrade a final status. The one exception is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TIMEOUT → SUCCESS"]}," for a pay-in (a late provider callback); accept that upgrade. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/concepts/transaction-lifecycle"},"children":["Transaction lifecycle"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["On any doubt, GET the transaction"]}," to fetch the authoritative status."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"delivery-and-retries","__idx":4},"children":["Delivery and retries"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Omno retries a failed delivery ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["up to 10 times"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your Omno integration team shares the payload schema, signature/authorization options, retry schedule and delivery details during integration."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"test-transactions","__idx":5},"children":["Test transactions"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A transaction processed by a test provider is identified by its test-provider ID (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantPspId"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["processorPspId"]}," on the transaction). See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/testing"},"children":["Testing in production"]},"."]},{"$$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 test provider."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"build-it-","__idx":6},"children":["Build it →"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/concepts/transaction-lifecycle"},"children":["Transaction lifecycle"]}," · ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/apis/webhooks"},"children":["Other APIs → Webhooks reference"]}]}]}]},"headings":[{"value":"Webhooks","id":"webhooks","depth":1},{"value":"Configure webhooks","id":"configure-webhooks","depth":2},{"value":"Which events trigger a webhook","id":"which-events-trigger-a-webhook","depth":2},{"value":"Handling requirements","id":"handling-requirements","depth":2},{"value":"Delivery and retries","id":"delivery-and-retries","depth":2},{"value":"Test transactions","id":"test-transactions","depth":2},{"value":"Build it →","id":"build-it-","depth":2}],"frontmatter":{"title":"Webhooks","description":"Webhooks are Omno's source of truth for final outcomes — how to configure them, handle them idempotently and out of order, and verify with a GET.","seo":{"title":"Webhooks"}},"lastModified":"2026-11-06T11:46:00.427Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/concepts/webhooks","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}