Incentable

Connect Braze Webhooks to Prize Draws

Set up Braze webhooks so campaigns and Canvas steps enter members into an Incentable prize draw, with no entry form.

Connect Braze Webhooks to Prize Draws

Who this is for: Marketing ops and Braze admins who want Braze to enter a customer into a prize draw when a campaign or Canvas step fires, for example after a purchase, a sign-up or a milestone.
Time to complete: About 30 minutes (plus QA), once an Incentable prize draw and a Braze integration are set up.

Beta. Prize draw entry by webhook is available to beta programs. Field names and responses may change before general release.

Overview

When a Braze campaign or Canvas step runs, Braze sends an HTTP webhook to Incentable. Incentable finds the member (or creates them as Pending), adds the entries to the prize draw, and records the request in your integration's Activity log. If the prize draw's Entry received email is turned on, Incentable emails the entrant to confirm.

The customer never fills in a form. Their Braze profile supplies their details, and your Braze trigger decides when they qualify.

Every entry goes through the same rules as an entry added in the Admin dashboard: the prize draw must be Active and inside its entry period, per-member and per-submission entry limits apply, and excluded members are rejected.

This is a custom webhook from Braze → Incentable. It is not a Braze Alloy partner connector, and Incentable does not call Braze for this flow.

Prerequisites

Braze

RequirementNotes
Webhooks enabled on your Braze packageAvailability depends on your Braze contract. If Webhooks is not visible, ask your Braze account manager or customer success manager.
Permission to create a Webhook Campaign or Canvas webhook stepNeeded to configure the call to Incentable.
A defined triggerCustom event (for example, purchase completed) or Canvas entry / step criteria after the customer qualifies.

Incentable

RequirementNotes
A prize draw in the programSet to Active with an entry period that covers your campaign dates. Use Test mode during QA so test entries are kept out of live draws.
A Braze (or Custom API) integrationWith Prize Draws: Write permission. Read is optional and only needed to look up submissions.
Optional: Default prize drawIf set on the integration, Braze does not need to send prizeDrawId in every payload.

Get credentials from Incentable

  1. Log in to the Incentable Admin Dashboard.
  2. Select the program that runs the prize draw (API keys are scoped to a single program).
  3. Open Integrations and add (or open) a Braze integration. A Custom API integration also works if you are calling from your own system rather than Braze.
  4. Under Permissions & Configuration → Prize Draws, confirm Write is on. New Braze integration keys have it on by default.
  5. Optionally choose a Default Prize Draw on the same card and save.
  6. Generate the API key and store it in a secure password manager.
Security: Treat the API key as a secret. Put it only in the Braze webhook Authorization header. Never put the API key in the webhook URL. Prefer Braze secrets / credential fields if your workspace supports them.

Find the prize draw ID

If you are not using a default prize draw, you need the prize draw's ID for the webhook body. In the Admin dashboard, open the prize draw, go to the Entries tab and click API. The Prize draw ID is shown with a copy button.

The Braze integration settings page has an Example body button next to the prize draw webhook. It gives you a ready-made body with Braze Liquid already filled in.

Endpoint Braze should call

ItemValue
MethodPOST
Path/prizedraws/entries
Full URLhttps://us-central1-incentable-app-37d9c.cloudfunctions.net/externalApi/api/v1/external/prizedraws/entries

The URL is also shown on the Braze integration's settings page under Connection.

Headers

HeaderRequiredValue
AuthorizationYesBearer <YOUR_API_KEY>
Content-TypeYesapplication/json
Idempotency-KeyRecommendedStable unique string for this entry. Body idempotencyKey takes precedence over this header; externalRef is used if neither is sent.

Request body for the Braze webhook composer

Fields

The body uses the same fields as the Prize Draw Entries API — see that page for every field, type and limit. The ones that matter most in Braze:

  • member.email, member.firstname, member.lastname — required; map them from the Braze profile.
  • prizeDrawId — required unless a Default Prize Draw is set on the integration.
  • quantity — optional, 1–400 (default 1); prize draw entry limits also apply.
  • externalRef — required for Braze (or idempotencyKey / an Idempotency-Key header); unique per prize draw.
Braze-friendly input. Braze Liquid renders values as text. Incentable accepts a whole number in quotes for quantity (for example "2"), and treats an empty value (a Braze attribute that is not set) as not supplied rather than an error.
Incentable fieldSuggested Braze source
member.email{{${email_address}}}
member.firstname{{${first_name}}}
member.lastname{{${last_name}}}
member.accountKey{{${user_id}}} or a custom attribute holding your CRM id
member.mobile{{${phone_number}}} or a custom attribute
prizeDrawIdFixed string, or omit if a default prize draw is configured
quantityFixed number, or an event property such as {{event_properties.${entries}}}
externalRefMust be unique per entry moment — e.g. campaign/Canvas id + user id + order or event id
metadataFixed values or Liquid, e.g. {{campaign.${name}}}
A stable reference is required. Braze may retry on 408, 429 and 5XX, and without a stable reference a retry would add a second set of entries. Requests from a Braze integration with no externalRef, idempotencyKey or Idempotency-Key header are rejected with 400 REFERENCE_REQUIRED before anything is created. Braze does not retry a 400, so a missing reference shows up in your test send rather than as duplicate entries.

Choosing accountKey

Prefer, in order:

  1. {{${user_id}}} — always present in Braze, stable, no custom attribute setup.
  2. Custom attribute — when you already sync a CRM id into Braze and want Incentable to match on the same key.
  3. Omit — Incentable matches or creates by email only (works, but weaker if emails change).

One entry per qualifying event, fixed prize draw:

{
  "prizeDrawId": "YOUR_PRIZE_DRAW_ID",
  "member": {
    "email": "{{${email_address}}}",
    "firstname": "{{${first_name}}}",
    "lastname": "{{${last_name}}}",
    "accountKey": "{{${user_id}}}"
  },
  "quantity": 1,
  "externalRef": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${order_id}}}",
  "idempotencyKey": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${order_id}}}",
  "metadata": {
    "campaign": "{{campaign.${name}}}"
  }
}

Advanced body (entries vary per event)

Entries from an event property, for example one entry per $50 spent calculated in Braze. Adjust property names to match your workspace:

{
  "member": {
    "email": "{{${email_address}}}",
    "firstname": "{{${first_name}}}",
    "lastname": "{{${last_name}}}",
    "accountKey": "{{custom_attribute.${account_key}}}"
  },
  "quantity": "{{event_properties.${entries}}}",
  "externalRef": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${order_id}}}",
  "idempotencyKey": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${order_id}}}",
  "metadata": {
    "orderId": "{{event_properties.${order_id}}}",
    "store": "{{event_properties.${store}}}"
  }
}

This example omits prizeDrawId, so it uses the Default Prize Draw set on the integration.

Static JSON sample (for smoke tests)

{
  "prizeDrawId": "YOUR_PRIZE_DRAW_ID",
  "member": {
    "email": "jane.doe@example.com",
    "firstname": "Jane",
    "lastname": "Doe",
    "accountKey": "CRM-100245"
  },
  "quantity": 2,
  "externalRef": "braze-qa-2026-10-20-001",
  "idempotencyKey": "braze-qa-2026-10-20-001",
  "metadata": { "source": "qa" }
}

Braze setup steps

Aligns with Braze's Create a webhook flow. Exact UI labels can vary by Braze version.

  1. Create a Webhook Campaign, or add a Webhook component in a Canvas.
  2. Webhook URL: paste the prize draw entry endpoint from above.
  3. HTTP method: POST.
  4. Request headers:
    • Authorization: Bearer <YOUR_API_KEY>
    • Content-Type: application/json
    • Optional but recommended: Idempotency-Key with the same Liquid expression as externalRef.
  5. Request body: choose JSON / raw body and paste the simple body (or the advanced body if entries vary).
  6. Compose / personalization: preview with a test user so email, name, quantity and externalRef look correct.
  7. Delivery / trigger:
    • Campaign: action-based on a custom event (for example, purchase completed), or
    • Canvas: place the webhook step after the qualification path.
  8. Optional multichannel: add a Braze email or push in the same campaign/Canvas, for example "You're in the draw!". Turn off the prize draw's Entry received email in Incentable if you don't want the entrant to get two confirmations.
  9. Save, run a test send, then launch.

How Braze retries interact with prize draw responses

Braze retries only for certain HTTP responses (for example 408, 429, 5XX). Most other responses, including 401 and other 4XX, are not retried. See Braze's Response codes and retry logic.

Incentable responseBraze typically…What you should do
201 CreatedSuccess, no retryDone — entries were added.
200 OK (idempotent replay)Success, no retrySafe — the earlier submission is returned and no entries are added.
400 / 401 / 403 / 404 / 409 / 422Usually not retriedFix config or payload; check Braze webhook / Message Activity logs and the Incentable integration's Activity log.
408 / 429 / 5XXMay retryYou must use a stable externalRef (and/or Idempotency-Key) so retries do not add duplicate entries.
Host-level deferral: If most webhook requests to Incentable are failing, Braze may temporarily defer all sends to that host until a cooldown ends. Fix the root cause, wait for the cooldown, then retest.

Success response

A successful request returns 201 with the submissionId, the number of entries added, the member's total entries and a test flag. A replay of the same idempotency key returns 200 with the original payload and adds nothing. Field-by-field details are on the Prize Draw Entries API page.

Idempotency & duplicates

ConceptRule
externalRef uniquenessUnique per prize draw. The same externalRef can be used in a different prize draw.
Choosing a Braze-side keyUse something that will not change on retry, e.g. braze-{campaign_or_canvas_id}-{user_id}-{order_or_event_id}. Avoid timestamps or random values.
Idempotency-Key / idempotencyKeyPrefer the same stable value as externalRef. The API resolves: body idempotencyKey → Idempotency-Key header → externalRef. Braze integrations must send at least one; Custom API callers without one get no duplicate protection.
201 vs 200201 = new entries. 200 = safe replay of a completed submission with the same idempotency key.
409DUPLICATE_EXTERNAL_REF — entries with this externalRef already exist in this prize draw. The response details.submissionId gives the original submission. Braze typically does not retry 409.

Look up a submission (optional)

Braze does not need this, but it is useful for support and reconciliation. It requires Prize Draws: Read on the integration — see Look up a submission.

Troubleshooting

Start in Braze Message Activity / webhook error logs, then check the Incentable integration's Activity log. Every request, including rejected ones, is recorded there. The Prize Draw Entries API page lists every error code.

Status / codePlain languageWhat to fix
400 validationMissing member fields, or quantity not a whole number.Check Liquid (empty email or names), and that quantity renders as a whole number.
400 REFERENCE_REQUIREDA Braze request had no externalRef, idempotencyKey or Idempotency-Key header.Add a stable externalRef to the webhook body. Check the Liquid isn't rendering it empty.
400 NO_PRIZE_DRAW_SPECIFIEDNo prizeDrawId in the body and no default on the integration.Add prizeDrawId, or set a Default Prize Draw on the integration.
401Invalid or missing API key.Fix Authorization: Bearer …. Braze will not keep retrying most 401s.
403 PERMISSION_DENIEDThe key lacks Prize Draws Write (or Read for lookups).Ask Incentable to enable the permission on the integration.
404Prize draw not found in this program.Confirm the prizeDrawId (or default) belongs to the same program as the API key.
409 DUPLICATE_EXTERNAL_REFThat externalRef was already used in this prize draw.Expected on a true duplicate. Use a new externalRef only when you intend a new submission.
422 PROMOTION_NOT_ACTIVEThe prize draw is Draft, Closed or otherwise not Active.Set the prize draw to Active.
422 PROMOTION_NOT_OPEN / PROMOTION_CLOSEDThe request arrived before the entry period opened or after it closed.Check the prize draw's open and close dates against your campaign schedule.
422 ENTRANT_EXCLUDEDThe member has been excluded from this prize draw.Expected — excluded members cannot enter. Review exclusions in the Admin dashboard if unexpected.
422 LIMIT_EXCEEDEDOver the per-member or per-submission entry limit. details.limitBreaches lists which.Lower quantity, or review the prize draw's entry limits.
429Rate limit reached for the key.Braze retries with backoff. If it persists, ask Incentable about the key's rate-limit tier.
Braze defers the hostMany failures caused Braze to pause sends to Incentable.Fix the root cause, wait for the cooldown, then retest.

Test plan

  1. Put the prize draw in Test mode and make sure it is Active and inside its entry period.
  2. In Braze, send a test webhook for a QA user with a unique externalRef (for example braze-qa-<date>-001).
  3. Confirm:
    • Braze shows a successful webhook delivery (201).
    • The entries appear on the prize draw's Entries tab with source API.
    • The request shows as allocated in the integration's Activity log.
    • The QA inbox receives the entry confirmation (if the Entry received email is on).
  4. Retry simulation: send again with the same externalRef and idempotency key. Expect 200 or 409, and no new entries.
  5. Send with a bad API key. Expect 401, and confirm Braze does not keep retrying.
  6. Send once with externalRef removed. Expect 400 REFERENCE_REQUIRED and no entries.
  7. Before launch, turn Test mode off on the prize draw. Test entries are not included in live draws.

Pre-launch checklist

  • Braze package includes Webhooks
  • Webhook Campaign or Canvas webhook step created
  • Trigger / Canvas path matches the moment a customer should be entered
  • Braze integration created in Incentable with Prize Draws: Write
  • API key stored securely; used only in the Authorization header
  • Prize draw Active, entry period covers the campaign, entry limits reviewed
  • Default Prize Draw set or prizeDrawId included in the Braze body
  • Liquid maps email, first name and last name correctly
  • Stable unique externalRef (and matching idempotencyKey / Idempotency-Key) on every send
  • Test send: 201, entries visible in Incentable, Activity log shows allocated
  • Same-key resend: 200 or 409, no extra entries
  • Bad-auth test: 401, no Braze retry loop
  • Decided which confirmation the entrant gets: Incentable email, Braze message, or both
  • Prize draw Test mode turned off for go-live