Branding the redemption page
Make reward emails and the redemption experience yours.
Recipients should recognize you, not the platform. Three fields control what they see, on your account:
| Field | Where it shows |
|---|---|
senderName | Email sender line and "sent you a reward" heading |
logoUrl | Email header |
brandColor | Buttons and accents on the redemption page |
Read your current branding
curl https://paybilt-rewards-api.fly.dev/v1/account \
-H "Authorization: Bearer $REWARDLY_KEY"Update it
curl -X PATCH https://paybilt-rewards-api.fly.dev/v1/account/branding \
-H "Authorization: Bearer $REWARDLY_KEY" \
-H "Content-Type: application/json" \
-d '{
"senderName": "Acme Loyalty",
"logoUrl": "https://acme.com/logo.png",
"brandColor": "#635BFF"
}'Only the fields you include are changed. brandColor must be a 6-digit hex
value; pass null for logoUrl or senderName to clear them.
Changes apply to every redemption page immediately — including links already in recipients' inboxes — and to emails sent from then on.
Customize merchant emails
Owners and admins can open Settings → Email templates to edit the reward invite and cards-ready messages. Members can inspect the source, variables, and rendered preview, but cannot save or reset templates.
The studio stores preview data separately from delivery data. Preview values only control the sample shown in the editor. Every delivered email uses the current merchant, reward, recipient, and issued-card records loaded by the worker.
Supported variables
Both templates support:
{{recipient.firstName}}{{merchant.name}}{{merchant.senderName}}{{merchant.logoUrl}}{{merchant.brandColor}}{{reward.type}}{{reward.redemptionUrl}}
Reward invite templates also support:
{{reward.amount}}{{reward.message}}{{reward.expirationDate}}
Cards-ready templates also support:
{{reward.remainingAmount}}{{reward.isPartial}}{{cards.count}}{{cards.items}}, an iterable card list
Inside the cards loop, each item exposes {{name}}, {{brandName}},
{{amount}}, {{currency}}, and {{imageUrl}}. Those item variables are not
valid outside the loop.
Exact block syntax
Variables are HTML-escaped. Only if and each blocks are accepted:
{{#if reward.message}}
<blockquote>{{reward.message}}</blockquote>
{{else}}
<p>A reward is waiting for you.</p>
{{/if}}{{#each cards.items}}
<p>
{{brandName}} — {{name}} — {{amount}} {{currency}}
</p>
{{/each}}Blocks take exactly one variable. Triple braces, partials, custom helpers,
subexpressions, data variables such as @index, prototype access, and unknown
variables are rejected. Card item fields must use their short names inside the
cards.items loop, as shown above.
Security restrictions
Templates are compiled on the API and again immediately before delivery.
Rewardli rejects scripts, forms and form controls, frames, embedded objects,
SVG, audio/video, event-handler attributes, unsupported HTML tags or
attributes, CSS imports, external fonts, unsafe CSS expressions, and
javascript:, data:, protocol-relative, or plain-HTTP URLs. Links and images
must use absolute HTTPS URLs. Subjects must be plain text on one line and no
longer than 200 characters. Source HTML is limited to 64 KB and rendered HTML
to 100 KB.
The preview uses the same renderer and sanitizer as delivery, then displays the result in a scriptless, navigation-restricted iframe with a restrictive Content Security Policy. Rewardli appends its compliance footer after sanitization, so template source cannot remove or replace it.
If a saved custom template cannot render during delivery, the worker records the failure and sends the canonical Rewardli template instead.
Reset to the Rewardli default
Reset to default deletes the merchant override for the selected email. The canonical Rewardli source and preview samples take effect immediately; a later edit creates revision 1 of a new override. Saves and resets use revision checks, so the studio asks you to reload instead of overwriting another administrator's newer changes.
Per-reward personality
Branding is account-wide, but each reward carries its own message, shown
prominently on the intro screen. Use it for the personal touch:
{ "message": "Casey, thanks for a great first year on the team!" }