Skip to content

Webhooks & Push Notifications

Webhooks let your site notify the outside world the moment something happens — post a launch announcement into your community Discord, feed a Slack channel with orders and instant win alerts, get a push notification on your phone when a customer requests a withdrawal, or send signed JSON notifications to a system your own developer runs. This page covers creating endpoints, setting up phone notifications with Pushover, customising messages with template variables, sending tests, and diagnosing failed deliveries.

Where to find it: Admin → Webhooks (/admin/webhooks)

Choose a destination type

Every webhook endpoint sends to one of four destination types, chosen as the first step when you create it. The type determines the payload format and what you can customise:

  • Discord — posts rich embeds (coloured cards with a title and body) straight into a Discord channel. Best for community announcements: new competitions, draw results, instant win celebrations.
  • Slack — posts formatted Block Kit messages (header plus body with mrkdwn formatting) into a Slack channel. Best for internal team feeds: orders coming in, draws completing.
  • Pushover — sends real push notifications to your (and your team's) phones via the Pushover app. Best for the admin alerts: things that need a person to notice, wherever they are. See Set up Pushover.
  • Custom URL — sends a raw JSON payload, signed with HMAC-SHA256, to any HTTPS address. This is the option for your own developer or a third-party system that needs machine-readable event data.

Discord, Slack and Pushover endpoints get a Messages customisation feature; Custom URL endpoints send a fixed JSON structure instead.

Create a webhook endpoint

  1. Go to Admin → Webhooks and click Create Endpoint.
  2. Choose your destination type — Discord, Slack, Pushover or Custom URL. (Picked the wrong one? Click Change type at the top of the form to go back.)
  3. Fill in the Endpoint Details:
    • URL (Discord, Slack and Custom URL) — where deliveries are sent. See below for where to find Discord and Slack URLs. Custom URLs must be valid HTTPS addresses.
    • Application Token and User or Group Key (Pushover) — see Set up Pushover.
    • Description (optional) — a short label so you can tell endpoints apart in the list, e.g. "#competition-alerts channel" or "Admin phones (ops group)".
  4. Under Events, tick which events this endpoint should receive. At least one is required — see Events you can subscribe to.
  5. (Discord, Slack and Pushover) A Message Customisation section appears for each event you ticked. Leave everything blank to use the built-in default messages, or see Customise messages.
  6. Click Create Endpoint. You land on the endpoint's detail page, where it's a good idea to send a test straight away.

Get a Discord webhook URL

In Discord, open your server's Server Settings → Integrations → Webhooks, create a webhook for the channel you want messages in, and copy its URL (it starts https://discord.com/api/webhooks/...). Paste that into the Discord Webhook URL field.

Get a Slack webhook URL

In Slack, go to Apps → Incoming Webhooks, add an incoming webhook for your chosen channel, and copy the URL (it starts https://hooks.slack.com/services/...). Paste that into the Slack Webhook URL field.

Set up Pushover

Pushover (pushover.net) is a small paid app — a one-off purchase per phone, with a free 30-day trial — that turns webhooks into proper push notifications. Setup takes about five minutes:

  1. Create a Pushover account at pushover.net and install the Pushover app on your phone. Each admin who wants alerts does the same with their own account.
  2. Register an application at pushover.net/apps/build — name it after your site so notifications are clearly branded. Copy the application's API token. Every application includes 10,000 free messages a month, which is plenty for admin alerts.
  3. Choose your recipients:
    • Just you — copy the user key shown on your Pushover dashboard.
    • Your team — create a delivery group at pushover.net/groups/build, add each admin's Pushover account to it, and copy the group key. Adding or removing a team member later is done on Pushover's site — you never need to touch the endpoint again.
  4. In the admin panel, create an endpoint with the Pushover type and paste the Application Token and the User or Group Key. The keys are checked with Pushover when you save, so a typo is caught immediately.
  5. Tick your events (the admin alerts are the natural fit), save, and hit Send Test — phones should buzz within seconds.

Your keys are stored securely and shown masked after saving. To replace one later, paste a new value over the masked field on the Settings tab; leave it blank to keep the current key.

A quota note: the 10,000 free messages per month belong to your application. Admin alerts won't dent that, but if your site takes hundreds of orders a day, think twice before pointing a Pushover endpoint at Order Payment Completed — the announcement events suit Discord and Slack channels better, and your phone will thank you.

Events you can subscribe to

Each endpoint can subscribe to any combination of events. They come in two groups.

Announcements

Celebration-style updates that are safe for public community channels:

EventFires when
Competition LaunchedA competition first becomes visible, active and playable
Competition Draw CompletedCompetition winners are selected
Order Payment CompletedA payment completes successfully
Instant Win ClaimedA customer wins an instant prize after purchasing tickets

Admin alerts

Operational alerts for you and your team. Each carries an amber Sensitive badge in the event picker:

EventFires when
Withdrawal RequestedA customer requests a cash withdrawal that needs your review
Competition Sold OutThe final ticket sells before the end date — ready for its draw
Competition EndedA competition reaches its end date
Prize Choice MadeA winner chooses between their prize and a cash or credit alternative
Order Fulfilment FailedA payment was taken but tickets could not be issued after several attempts — needs urgent review
Ticket Count MismatchAn integrity check finds an order with a different number of tickets than expected
ID Verification SubmittedA customer submits identity documents for review
New ReferralA new customer signs up using a referral code. The alert never says whether the pair was flagged for review — check the Referrals page for that
Referral Reward GrantedA referral qualifies and both customers receive their site credit reward. Notes when it was qualified manually by an operator

Where you send admin alerts is entirely your choice — any event works with any destination, and nothing is blocked. The Sensitive badge is a recommendation: these alerts describe customer activity (withdrawal requests, identity submissions, order problems) that would read oddly in a community feed, so most operators point them at a private team channel or a Pushover endpoint. If you tick one on a Discord, Slack or Custom URL endpoint, the form shows a gentle reminder to double-check the channel is private; Pushover endpoints skip the reminder, since their recipients are by definition the people you added.

Whatever you choose, the alerts are written to be safe if seen: customer names appear as a first name and last initial (the same style as your public winners ticker), never emails, and the ID verification alert says only that a submission needs review — it never includes anything from the documents.

A few things worth knowing:

  • Instant wins are grouped per checkout. If a customer wins several instant prizes in one purchase, that sends a single notification covering all of them — not one message per prize. The {{prize.list}} variable always lists every prize won, so nothing is dropped from multi-prize wins.
  • There is no general customer-signup eventNew Referral covers signups that used a referral code; beyond that, the events above are the full list.
  • Need a different event? Use the Let us know link under the events list on the create and edit forms to ask — new events are considered on request.

For context on the events themselves, see Competitions, Winners, Orders and Referrals.

Customise messages

For Discord, Slack and Pushover endpoints you can override how each event's message looks. The fields appear per event — on the create form once you've ticked events, and afterwards on the endpoint's Messages tab.

  • Discord — per event you can set a Title (up to 256 characters), a Body (up to 4,096 characters), and an Embed Colour. Pick one of the five colour presets (Green, Blue, Red, Gold, Purple) or type your own hex code (e.g. #2ECC71).
  • Slack — per event you can set a Header (up to 150 characters) and a Body (up to 3,000 characters). The body supports Slack mrkdwn formatting: *bold*, _italic_ and `code`.
  • Pushover — per event you can set a Title (up to 250 characters) and a Message (up to 1,024 characters). Notifications are plain text — no colours or formatting — and each carries a link straight to the relevant admin page.

Any field you leave empty falls back to the built-in default message, so you only need to fill in what you want to change. On an existing endpoint, click Save Messages on the Messages tab to apply your changes; on the create form, customisations save when you create the endpoint.

Use template variables

Template variables like {{competition.title}} are replaced with real values when each message sends. Under every event's body field there's an expandable Available variables list showing each variable with a description and example — click a variable to insert it into the body at your cursor.

Variables differ per event:

Competition Launched{{competition.title}}, {{competition.id}}, {{competition.slug}}, {{competition.url}} (the public competition page), {{competition.price}} (per ticket), {{competition.maxTickets}}, {{competition.endDate}}, {{competition.launchedAt}}.

Competition Draw Completed{{competition.title}}, {{competition.id}}, {{winners.count}}, {{winners.list}} (formatted list with names and ticket numbers), {{winners.names}} (comma-separated names).

Order Payment Completed{{order.id}}, {{order.amount}}, {{order.itemCount}}, {{order.items}} (formatted list), {{payment.completedAt}}.

Instant Win Claimed{{winner.name}}, {{win.count}} (prizes won in this checkout), {{prize.list}} (every prize, one per line), {{prize.total}} (combined cash and credit value), {{competition.title}} (shows "multiple competitions" if the wins span more than one), {{order.id}}, {{claim.claimedAt}}.

Withdrawal Requested{{user.name}}, {{withdrawal.amount}}, {{withdrawal.requestedAt}}.

Competition Sold Out{{competition.title}}, {{competition.id}}, {{tickets.sold}}, {{tickets.max}}.

Competition Ended{{competition.title}}, {{competition.id}}, {{competition.slug}}, {{competition.endDate}}.

Prize Choice Made{{winner.name}}, {{prize.title}}, {{competition.title}}, {{choice}} (CASH, CREDIT or PRIZE).

Order Fulfilment Failed{{order.id}}, {{order.number}}, {{failure.reason}}, {{failure.attempts}}.

Ticket Count Mismatch{{order.id}}, {{order.number}}, {{tickets.expected}}, {{tickets.actual}}.

ID Verification Submitted{{user.name}}, {{request.id}}, {{images.count}}.

New Referral{{referrer.name}}, {{referee.name}}, {{referral.code}}.

Referral Reward Granted{{referrer.name}}, {{referee.name}}, {{reward.amount}} (site credit granted to each customer), {{referral.trigger}} (PURCHASE, VERIFICATION or MANUAL).

Customer names in variables are always the shortened display style (e.g. "John S."), never full names or emails.

Send a test webhook

Always test a new endpoint before relying on it:

  1. Open the endpoint from the Webhooks list and stay on the Settings tab.
  2. Click Send Test.
  3. A result banner appears: either Test webhook delivered successfully (your destination accepted it — check the Discord/Slack channel or your receiving system) or Test webhook delivery enqueued (it's queued and on its way; check the Deliveries tab shortly to confirm the outcome).

Send Test is greyed out? The endpoint must be active to send a test — tick the Active checkbox on the Settings tab and click Save Changes first. A note below the buttons reminds you of this when the endpoint is inactive.

Edit an endpoint

Open any endpoint from the Webhooks list by clicking its URL. (Admins with webhook management permission also get a view action on the row; read-only admins use the URL link.) The detail page is tabbed:

  • Settings — change the URL (or, on Pushover endpoints, replace the keys) and description, toggle Active, and change which events the endpoint receives (at least one must stay ticked). Click Save Changes to apply.
  • Messages — Discord, Slack and Pushover endpoints; per-event message customisation as described above.
  • Deliveries — the delivery history, covered below.

For URL-based endpoints the destination type isn't a separate setting — it's detected automatically from the URL. If you change the URL on the Settings tab to a different platform's webhook address (say, from Slack to Discord), the endpoint's type and message format follow the new URL. Pushover endpoints are the exception: they have no editable URL, and they stay Pushover endpoints for life — create a new endpoint if you need a different destination type.

Pause or resume an endpoint

To stop deliveries temporarily without losing the endpoint's configuration or history, deactivate it:

  • From the list — use the deactivate action (circled ✕ icon) on the endpoint's row; the same spot shows an activate action (circled ✓) when it's inactive.
  • From the endpoint — untick Active on the Settings tab and click Save Changes.

While inactive, the endpoint receives no deliveries and shows an Inactive status badge in the list. Reactivate it the same way — events that occurred while it was paused are not sent retrospectively.

Delete an endpoint

From the Webhooks list, use the delete action on the endpoint's row and confirm. This permanently deletes the endpoint and all of its delivery history, and cannot be undone. If you only need a break, pause it instead.

Find an endpoint in the list

The Webhooks list shows each endpoint's URL (with a Discord, Slack or Pushover badge and your description underneath), its subscribed events, an Active/Inactive status badge, and when its last delivery happened with a green (success) or red (failure) dot — or "Never" if nothing has been sent yet. Use the search box to filter by URL and the status filter (All / Active / Inactive) to narrow the list; results page 20 at a time. A description is especially worth setting on Pushover endpoints, since their URL column is always the same delivery address.

Check deliveries and diagnose failures

Health at a glance

Three stat cards at the top of the Webhooks list summarise webhook health across all endpoints:

  • Total Endpoints — how many endpoints are currently active, out of the total configured.
  • Deliveries Today — successful deliveries out of total deliveries today.
  • Failure Rate — today's failure percentage. The card highlights red whenever any delivery has failed today; 0% is what healthy looks like.

If the failure rate is up, check each endpoint's Last Delivery dot in the list to find the one with a red indicator, then open its Deliveries tab.

Inspect an endpoint's delivery history

Open the endpoint and switch to the Deliveries tab. Each row shows:

  • Event — which event triggered the delivery.
  • StatusCompleted (delivered successfully), Pending (queued or in flight, no response yet), or Failed (the destination returned an error).
  • Code — the HTTP response code from the destination (green for success codes, red for errors).
  • Attempt — which try this was, out of 3. Failed deliveries are retried automatically, so a single event can appear as several rows with rising attempt numbers.
  • Duration — how long the destination took to respond.
  • Delivered At — when the attempt happened.

Filter by status (All / Success / Failed) or by event to narrow things down; the history paginates 20 rows at a time.

See exactly what was sent

Click any delivery row to open the Delivery Details panel. It shows the event, status, response code, duration, attempt number and timestamp, plus the full Payload that was sent and the Response Body your destination returned. The response body is usually the fastest route to a root cause — Discord, Slack and custom systems all explain in their response why they rejected a delivery.

Custom URL endpoints and signatures

If your developer is building a receiver for a Custom URL endpoint, two things matter:

  • HTTPS is required — the URL field only accepts valid HTTPS addresses.
  • Payloads are signed with HMAC-SHA256 — every delivery carries a signature your developer can verify to confirm it genuinely came from your site and wasn't tampered with.

Your developer can use the Deliveries tab to see the exact JSON payload for each event while building, and the Send Test button to trigger deliveries on demand.

Troubleshooting

Messages aren't appearing in my Discord or Slack channel. Open the endpoint's Deliveries tab. If deliveries show Failed, click a row and read the response body — the most common cause is a webhook URL that was deleted or regenerated on the Discord/Slack side, in which case create a fresh webhook URL there and update the endpoint's URL on the Settings tab. If there are no deliveries at all, check the endpoint is Active and subscribed to the right events, then use Send Test.

The Send Test button is greyed out. The endpoint is inactive. Tick Active on the Settings tab, save, then test.

The Failure Rate card has gone red. At least one delivery failed today. Find the endpoint with a red Last Delivery dot in the list, open its Deliveries tab filtered to Failed, and read the response bodies. If the destination is permanently gone, either fix the URL or pause the endpoint so it stops generating failures.

A delivery shows Pending. It's queued or awaiting a response — no result yet. Refresh the Deliveries tab shortly; it will settle to Completed or Failed.

A single event appears multiple times in the delivery history. That's the automatic retry at work: a failed delivery is retried automatically, up to 3 attempts in total, and each attempt is logged as its own row with its attempt number. Pushover endpoints are slightly different: rejections from the push service (a revoked key, an exhausted monthly quota, an invalid message) are final and are not retried, because retrying can never succeed — the delivery log shows the reason in the response details.

Push notifications stopped arriving on my phone. Open the endpoint's Deliveries tab and read a failed row's details. The two usual causes: a key was revoked or regenerated on the Pushover side (paste the new key over the masked field on the Settings tab), or the application's 10,000 message monthly quota ran out (check usage on the Pushover dashboard; quotas reset monthly). Also worth checking: the recipient's Pushover subscription is active and their phone allows notifications from the Pushover app.

Pushover rejected my keys when saving. The keys are validated with Pushover before the endpoint saves. Double-check you pasted the application's API token (not your user key) in the first field and your user or group key in the second — they're different strings, and each lives on a different Pushover page.

I can't see the Create Endpoint button, or the fields are greyed out. Your admin account doesn't have webhook management permission — you can view endpoints and their deliveries, but not change them. Deleting endpoints needs a further, separate permission. Ask the account owner to adjust your admin permissions.

We missed events while the endpoint was paused or broken — can they be resent? No. There's no resend or redeliver control; deliveries only happen (with automatic retries) at the time the event fires. Fix the endpoint, send a test to confirm it's healthy, and future events will flow again.