Incentable

Connect Braze Webhooks to RewardStar

Set up Braze webhooks so campaigns and Canvas steps issue RewardStar gift cards via the Incentable Custom API.

Connect Braze Webhooks to RewardStar Cards

Who this is for: Marketing ops and Braze admins who want Braze to issue a RewardStar gift card when a campaign or Canvas step fires.
Time to complete: About 30–60 minutes (plus QA), once Incentable credentials and a RewardStar card template are ready.

Overview

When a Braze campaign or Canvas step runs, Braze sends an automated HTTP webhook to Incentable’s Custom API. Incentable issues a RewardStar gift card, emails the recipient the card (with a redeem link), and the recipient completes redemption in the RewardStar redeem flow.

Optionally, in the same Braze multichannel campaign, you can also send a Braze push or email (for example, “Your gift card is on the way”) so the user hears from you in Braze as well as from Incentable/RewardStar.

This is a custom webhook from Braze → Incentable. It is not a Braze Alloy partner connector, and it is not an Incentable event webhook into Braze.

Braze’s own docs describe a similar pattern: when a user hits a milestone or earns points, use webhooks plus your existing API to credit a reward to their account. See Create a webhook.

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, reward earned / points threshold) or Canvas entry / step criteria after the user qualifies.

Incentable / RewardStar

RequirementNotes
Active RewardStar card templateWith produced denominations (card images produced for the amounts you will issue).
Program fund fundedOr use the card in test mode for QA (test mode does not draw down the fund).
Custom API key with rewardStar: writeRequired to issue cards. Add rewardStar: read if you will look up cards later.
Optional: Default RewardStar cardIf set on the Custom API integration (defaultRewardStarCardId), Braze does not need to send cardId in every payload.

Get credentials from Incentable

  1. Log in to the Incentable Admin Dashboard.
  2. Select the program you want to issue RewardStar cards for (API keys are scoped to a single program).
  3. Open Integrations and select (or create) your Custom API integration.
  4. Enable RewardStar permissions:
    • Write — required to issue cards (rewardStar: write)
    • Read — optional, for looking up issued cards (rewardStar: read)
  5. Generate the API key and store it in a secure password manager.
  6. Optionally set Default RewardStar card so Braze payloads can omit cardId.
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.

Endpoint Braze should call

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

The Custom API base URL is also shown under Integrations in the Admin dashboard. See the RewardStar API reference for full field and response details.

Direction: Braze → Incentable (outbound webhook). Incentable does not call Braze for this flow.

Headers

HeaderRequiredValue
AuthorizationYesBearer <YOUR_API_KEY>
Content-TypeYesapplication/json
Idempotency-KeyRecommendedStable unique string for this issue attempt. If omitted, the API falls back to body idempotencyKey, then externalRef, then a random value.

Request body for the Braze webhook composer

Field reference

FieldRequiredDefaultDescription
memberYesRecipient object (see below).
member.emailYesRecipient email. Used for delivery and member match/create.
member.firstnameYesFirst name.
member.lastnameYesLast name.
member.accountKeyNoExternal account id. If provided, Incentable matches the member by accountKey first, then by email.
member.mobileNoMobile number.
denominationYesFace value in dollars (number). Must match a produced denomination on the RewardStar card.
expiryDaysNo90Days until expiry. Integer from 30 to 365.
cardIdConditionalRewardStar card template id. Required unless a default card is configured on the integration.
externalRefStrongly recommendedYour unique reference for this card. Max 255 chars. Unique per cardId (not program-wide). Critical for Braze retries.
idempotencyKeyRecommendedFalls back to header / externalRef / randomMax 255 chars. Prefer the same stable value as externalRef, or send Idempotency-Key header.
Incentable fieldSuggested Braze source
member.email{{${email_address}}}
member.firstname{{${first_name}}}
member.lastname{{${last_name}}}
member.accountKeyCustom attribute, e.g. {{custom_attribute.${account_key}}}
member.mobile{{${phone_number}}} or a custom attribute
denominationEvent property or custom attribute, e.g. {{event_properties.${gift_card_amount}}} — or a fixed number
cardIdFixed string, or omit if default card is configured
externalRefMust be unique per card issue — e.g. Canvas/campaign + user id + reward id on the trigger event
expiryDaysUsually leave default 90, or set a fixed integer
Always set a stable externalRef. Braze may retry on 408, 429, and 5XX. Without a stable key, a retry can issue a second card.

Static JSON sample (for smoke tests)

{
  "member": {
    "email": "jane.doe@example.com",
    "firstname": "Jane",
    "lastname": "Doe",
    "accountKey": "CRM-100245",
    "mobile": "+61400000000"
  },
  "denomination": 50,
  "expiryDays": 90,
  "cardId": "YOUR_REWARDSTAR_CARD_ID",
  "externalRef": "braze-qa-2026-07-22-001",
  "idempotencyKey": "braze-qa-2026-07-22-001"
}

Liquid-templated JSON sample (paste into Braze)

Adjust attribute / event property names to match your Braze workspace. Keep externalRef unique for every intended card.

{
  "member": {
    "email": "{{${email_address}}}",
    "firstname": "{{${first_name}}}",
    "lastname": "{{${last_name}}}",
    "accountKey": "{{custom_attribute.${account_key}}}",
    "mobile": "{{${phone_number}}}"
  },
  "denomination": {{event_properties.${gift_card_amount}}},
  "expiryDays": 90,
  "cardId": "YOUR_REWARDSTAR_CARD_ID",
  "externalRef": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${reward_id}}}",
  "idempotencyKey": "braze-{{campaign.${api_id}}}-{{${user_id}}}-{{event_properties.${reward_id}}}"
}
If you configured a default RewardStar card in Incentable, you can omit cardId. Prefer the same string for externalRef and idempotencyKey (or the Idempotency-Key header).

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 Incentable issue 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 Liquid sample. Confirm personalization resolves from the user profile and/or trigger event properties.
  6. Compose / personalization: preview with a test user so email, name, denomination, and externalRef look correct.
  7. Delivery / trigger:
    • Campaign: action-based on a custom event (example: reward earned, points threshold reached), or
    • Canvas: place the webhook step after the qualification path.
  8. Optional multichannel: add a Braze email or push in the same campaign/Canvas to tell the user their gift card is on the way (Incentable still sends the RewardStar card email with the redeem link).
  9. Save, run a test send, then launch.

Official Braze guide: Create a webhook

How Braze retries interact with RewardStar responses

Braze retries only for certain HTTP responses (for example 408, 429, 5XX). Most other responses — including 401 Unauthorized and other 4XX — are not retried. Retry-After and X-Rate-Limit-* only affect backoff when the response is already retry-eligible; they do not create retries for non-retriable errors.

Full Braze table: Response codes and retry logic.

Incentable responseBraze typically…What you should do
201 CreatedSuccess, no retryDone — a new card was issued.
200 OK (idempotent replay)Success, no retrySafe — same prior issuance returned; no second card.
400 / 401 / 403 / 404 / 409 / 422 (most 4XX)Usually not retriedFix config/payload; check Braze webhook / Message Activity logs.
402 insufficient fundUsually not retriedTop up the program fund, or use test mode for QA.
408 / 429 / 5XXMay retryYou must use a stable externalRef (and/or Idempotency-Key) so retries do not create duplicate cards.
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 (auth, payload, fund, card setup), wait for the cooldown, then retest.

Success response fields

On success, Incentable returns JSON shaped like:

{
  "data": {
    "id": "issued-card-document-id",
    "status": "issued",
    "amount": 50,
    "expiresAt": "2026-10-20T00:00:00.000Z",
    "redeemUrl": "https://redeem.rewardstarcard.com/?t=...",
    "isTest": false,
    "externalRef": "braze-..."
  },
  "memberId": "member-document-id",
  "memberCreated": false,
  "message": "RewardStar card issued successfully"
}
FieldMeaning
data.idIssued card id (RewardStar code document id).
data.statusUsually issued.
data.amountFace value issued.
data.expiresAtExpiry timestamp (ISO 8601).
data.redeemUrlOne-time redeem link — returned on issue only.
data.isTesttrue if the card template is in test mode.
data.externalRefEcho of your reference (if provided).
memberIdMatched or newly created member id.
memberCreatedtrue if Incentable created a Pending member for this request.

Notes

  • redeemUrl is returned on issue (POST) only. GET /rewardstar/cards/{id} lookup does not return redeemUrl.
  • Braze usually does not need to store redeemUrl if Incentable emails the card to the recipient.
  • 201 = new issue. 200 = idempotent replay of a previous issuance (same completed idempotency key).

Idempotency & duplicates

Because Braze may retry on 408 / 429 / 5XX, design every webhook body so a retry cannot mint a second card.

ConceptRule
externalRef uniquenessUnique per cardId, not across the whole program. The same externalRef can exist on a different RewardStar card template.
Choosing a Braze-side keyUse something that will not change on retry: e.g. braze-{campaign_or_canvas_id}-{user_id}-{reward_or_event_id}. Avoid timestamps or random values that regenerate on each attempt.
Idempotency-Key / idempotencyKeyPrefer the same stable value as externalRef. The API resolves: body idempotencyKeyIdempotency-Key header → externalRef → random.
201 vs 200201 = new card. 200 = safe replay of a completed issuance for the same idempotency key.
409Conflict — either a card with this externalRef already exists for this cardId (DUPLICATE_EXTERNAL_REF), or an issuance is still in progress for the idempotency key (IDEMPOTENCY_IN_PROGRESS). Braze typically does not retry 409. For an already-issued duplicate, treat as “card already exists” (response may include existing card summary without redeemUrl).

Troubleshooting

Start in Braze Message Activity / webhook error logs for the campaign or Canvas step, then map the HTTP status:

Status / signalPlain languageWhat to fix
400 validation / NO_CARD_SPECIFIEDPayload missing required fields, bad types, or no cardId and no default card on the integration.Check Liquid (empty names/email), denomination as a number, and set cardId or configure a default RewardStar card.
401Invalid or missing API key.Fix Authorization: Bearer …. Braze will not keep retrying most 401s — correct the key and resend.
403API key lacks rewardStar: write.Update key permissions in Incentable Integrations.
402 / INSUFFICIENT_FUNDProgram fund balance too low for face value + fees.Top up the fund, or use a test-mode card for QA.
404RewardStar card template not found.Confirm cardId (or default) is correct for this program.
409 / DUPLICATE_EXTERNAL_REFThat externalRef was already used for this cardId.Expected on a true duplicate. Use a new externalRef only when you intend a new card.
409 / IDEMPOTENCY_IN_PROGRESSA prior attempt with the same idempotency key is still processing.Wait briefly; look up by externalRef if needed (rewardStar: read). Do not invent a new key for the same reward.
422 SETUP_INCOMPLETE_CATALOGUECard has no gift card catalogue assigned.Finish RewardStar card setup in Incentable.
422 SETUP_INCOMPLETE_DENOMINATIONSNo produced denomination images.Produce card images for the template.
422 SETUP_INCOMPLETE_CLIENT_NAMEClient name missing in branding.Complete branding setup.
422 DENOMINATION_NOT_PRODUCEDRequested amount exists in config but that denomination image was not produced.Produce that denomination, or send a produced amount.
Braze defers the hostMany failures to Incentable caused Braze to pause sends to this host.Fix the root cause, wait for cooldown, then retest.

Test plan

  1. Prefer a RewardStar card in test mode so QA does not draw down the fund.
  2. In Braze, send a test webhook to a known inbox with a unique externalRef (for example braze-qa-<date>-001).
  3. Confirm:
    • Braze shows a successful webhook delivery (201).
    • Recipient receives the Incentable/RewardStar email.
    • Card appears issued in Incentable (and isTest: true if using test mode).
  4. Replay / retry simulation: send again with the same externalRef and same idempotency key.
    • Expect either 200 (idempotent replay) or 409 (duplicate externalRef) — both mean no second card was created. Confirm only one card exists.
  5. Intentionally send with a bad API key.
    • Expect 401.
    • Confirm Braze does not keep retrying that failure (per Braze 4XX rules).
  6. Optional: trigger a real Canvas/campaign path with a QA user before go-live.

Pre-launch checklist

  • Braze package includes Webhooks (confirmed with Braze AM/CSM if needed)
  • Webhook Campaign or Canvas webhook step created
  • Trigger / Canvas path matches the intended reward moment
  • Incentable Custom API key created; rewardStar: write enabled
  • API key stored securely; used only in Authorization header (not in the URL)
  • RewardStar card template active; denominations produced; branding complete
  • Program fund funded or test mode used for QA then switched for production
  • Default RewardStar card set or cardId included in the Braze body
  • Liquid maps email, first name, last name, denomination correctly
  • Stable unique externalRef (and matching idempotencyKey / Idempotency-Key) on every send
  • Test send: 201, email received, one card issued
  • Same-key resend: 200 or 409, still only one card
  • Bad-auth test: 401, no Braze retry loop
  • Optional Braze email/push copy reviewed for the multichannel campaign
  • Owners know where to check Braze Message Activity and Incentable Integrations activity