Retail, Loyalty programme 1.0.0
| Template | Retail, tpl_5bbd0ae3e79a |
|---|---|
| Variant | Loyalty programme |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 15 seconds |
Example video
The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.
What it accepts
A loyalty card or app programme: a headline, how it works in two to four steps, up to six perks, up to three figures such as points per euro or what members saved, the card or the app, and a call to join. The clip is as long as the steps need. metaData is the post's title, descriptions and hashtags and is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the programme, how it works, what members get, the figures and the call to join. | |
clipData.kicker | text | up to 32 characters | Kicker: A short line above the headline, such as Free to join. | |
clipData.headline | text | yes | up to 60 characters | Headline: What the programme gives, in a sentence. |
clipData.subline | text | up to 100 characters | Subline: A sentence under the headline. | |
clipData.cardName | text | up to 24 characters | Programme name: The name on the card or in the app, such as Greenleaf Rewards. Left out, the brand's name. | |
clipData.picture | image | media:// file from the media library, alt text up to 120 characters | Picture: Your card's design, or a screen of the app (with the phone in the look). Without one, the card or the app is drawn in your brand's colours. | |
clipData.stepsTitle | text | up to 32 characters | Steps title: A heading over the steps, such as How it works. | |
clipData.steps | list | yes | at least 2, up to 4 | How it works: Two to four steps, in order; the clip gets almost two seconds longer for each. |
clipData.steps[] | group | Step | ||
clipData.steps[].icon | enum | check, circle-check, x, arrow-right, arrow-up-right, plus, star, heart, thumbs-up, sparkles, zap, clock, calendar, map-pin, info, triangle-alert, lightbulb, target, award, crown, gem, flame, timer, list-checks, clipboard-check, badge-check, hand-heart, rocket, trophy, megaphone, bell, qr-code, ticket, gift, key-round, book-open, graduation-cap, house, phone, mail, globe, users, user, shopping-cart, shopping-bag, tag, truck, store, apple, coffee, croissant, carrot, fish, wine, pizza, utensils, baby, shirt, scissors, package, circle-percent, sprout, cake-slice, smartphone | Icon: A line icon for the step. | |
clipData.steps[].title | text | yes | up to 36 characters | Step: What to do. |
clipData.steps[].detail | text | up to 70 characters | Detail: One line more about it. | |
clipData.perksTitle | text | up to 32 characters | Perks title: A heading over the perks, such as Members get. | |
clipData.perks | list | at least 0, up to 6 | Perks: Up to six things members get. Left out, the clip goes from the steps to the figures. | |
clipData.perks[] | group | Perk | ||
clipData.perks[].icon | enum | check, circle-check, x, arrow-right, arrow-up-right, plus, star, heart, thumbs-up, sparkles, zap, clock, calendar, map-pin, info, triangle-alert, lightbulb, target, award, crown, gem, flame, timer, list-checks, clipboard-check, badge-check, hand-heart, rocket, trophy, megaphone, bell, qr-code, ticket, gift, key-round, book-open, graduation-cap, house, phone, mail, globe, users, user, shopping-cart, shopping-bag, tag, truck, store, apple, coffee, croissant, carrot, fish, wine, pizza, utensils, baby, shirt, scissors, package, circle-percent, sprout, cake-slice, smartphone | Icon: A line icon for the perk. | |
clipData.perks[].title | text | yes | up to 32 characters | Perk: The perk, in a few words. |
clipData.perks[].detail | text | up to 48 characters | Detail: A line more about it. | |
clipData.currency | text | up to 3 characters | Currency: The ISO code money figures are in, such as EUR, GBP, USD or CHF. | |
clipData.figures | list | at least 0, up to 3 | Figures: Up to three numbers that show what it is worth, such as points per euro or what members saved. Each counts up to exactly the value sent. | |
clipData.figures[] | group | Figure | ||
clipData.figures[].value | number | yes | 2 decimals | Value: The number. |
clipData.figures[].unit | text | up to 12 characters | Unit: What it counts, such as points or %. Left out for money. | |
clipData.figures[].money | boolean | Money: Written as an amount in the currency above. | ||
clipData.figures[].label | text | yes | up to 60 characters | Label: What the number means. |
clipData.cta | group | Call to action: The button at the end and the line under it, such as a web address, a handle or a phone number. | ||
clipData.cta.label | text | yes | up to 28 characters | Button: What the button says. |
clipData.cta.detail | text | up to 48 characters | Line under it: An address, a handle, a phone number. | |
clipData.disclaimer | text | up to 120 characters | Small print: Terms that must be shown with the programme. | |
clipData.look | group | Look: How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default. | ||
clipData.look.theme | enum | brand, light, dark, bold | Theme: Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page. | |
clipData.look.pace | enum | calm, standard, punchy | Pace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts. | |
clipData.look.corners | enum | square, soft, round | Corners: The shape of cards, pictures and buttons. | |
clipData.look.align | enum | start, centre | Text alignment: Where the text lines up. | |
clipData.look.carrier | enum | card, phone | Shown on: Card: a membership card, your picture as its face or drawn in your colours. Phone: a phone with your app screen, or one drawn in your colours. | |
clipData.look.numbered | boolean | Number the steps: Each step's badge shows its number, with the icon beside the step; off, the badge shows the icon. | ||
clipData.look.logo | enum | auto, free | Logo: The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose. | |
metaData | group | Meta data: Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data. | ||
metaData.title | text | up to 100 characters | Title: Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes. | |
metaData.captionTiny | text | up to 200 characters | Tiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionShort | text | up to 500 characters | Short description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionMedium | text | up to 1500 characters | Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok): Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionLong | text | up to 4000 characters | Long description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.hashtags | list | up to 15 | Hashtags: Written without the #. Up to 15, which every platform takes. | |
metaData.hashtags[] | text | up to 60 characters | Hashtag |
locales carries other languages: under each language code, the parts of clipData and metaData that differ, laid over the default, so a language with no copy still renders.
A picture is always a file from your media library: media:// followed by its id or its name.
Anything the table does not list is refused, and so is anything over its limit, with a 422 that
names the field.
The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Kicker",
"description": "A short line above the headline, such as Free to join."
},
"headline": {
"type": "string",
"maxLength": 60,
"title": "Headline",
"description": "What the programme gives, in a sentence."
},
"subline": {
"type": "string",
"maxLength": 100,
"title": "Subline",
"description": "A sentence under the headline."
},
"cardName": {
"type": "string",
"maxLength": 24,
"title": "Programme name",
"description": "The name on the card or in the app, such as Greenleaf Rewards. Left out, the brand's name."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "Your card's design, or a screen of the app (with the phone in the look). Without one, the card or the app is drawn in your brand's colours."
},
"stepsTitle": {
"type": "string",
"maxLength": 32,
"title": "Steps title",
"description": "A heading over the steps, such as How it works."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice",
"smartphone"
],
"title": "Icon",
"description": "A line icon for the step.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice",
"Smartphone"
]
},
"title": {
"type": "string",
"maxLength": 36,
"title": "Step",
"description": "What to do."
},
"detail": {
"type": "string",
"maxLength": 70,
"title": "Detail",
"description": "One line more about it."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 2,
"maxItems": 4,
"title": "How it works",
"description": "Two to four steps, in order; the clip gets almost two seconds longer for each."
},
"perksTitle": {
"type": "string",
"maxLength": 32,
"title": "Perks title",
"description": "A heading over the perks, such as Members get."
},
"perks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice",
"smartphone"
],
"title": "Icon",
"description": "A line icon for the perk.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice",
"Smartphone"
]
},
"title": {
"type": "string",
"maxLength": 32,
"title": "Perk",
"description": "The perk, in a few words."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Detail",
"description": "A line more about it."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Perk"
},
"minItems": 0,
"maxItems": 6,
"title": "Perks",
"description": "Up to six things members get. Left out, the clip goes from the steps to the figures."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The ISO code money figures are in, such as EUR, GBP, USD or CHF."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Value",
"description": "The number."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "What it counts, such as points or %. Left out for money."
},
"money": {
"type": "boolean",
"title": "Money",
"description": "Written as an amount in the currency above."
},
"label": {
"type": "string",
"maxLength": 60,
"title": "Label",
"description": "What the number means."
}
},
"required": [
"value",
"label"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "Figures",
"description": "Up to three numbers that show what it is worth, such as points per euro or what members saved. Each counts up to exactly the value sent."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "Terms that must be shown with the programme."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"carrier": {
"type": "string",
"enum": [
"card",
"phone"
],
"title": "Shown on",
"description": "Card: a membership card, your picture as its face or drawn in your colours. Phone: a phone with your app screen, or one drawn in your colours.",
"enumNames": [
"A card",
"A phone"
]
},
"numbered": {
"type": "boolean",
"title": "Number the steps",
"description": "Each step's badge shows its number, with the icon beside the step; off, the badge shows the icon."
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"required": [
"headline",
"steps"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the programme, how it works, what members get, the figures and the call to join."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
},
"locales": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Kicker",
"description": "A short line above the headline, such as Free to join."
},
"headline": {
"type": "string",
"maxLength": 60,
"title": "Headline",
"description": "What the programme gives, in a sentence."
},
"subline": {
"type": "string",
"maxLength": 100,
"title": "Subline",
"description": "A sentence under the headline."
},
"cardName": {
"type": "string",
"maxLength": 24,
"title": "Programme name",
"description": "The name on the card or in the app, such as Greenleaf Rewards. Left out, the brand's name."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "Your card's design, or a screen of the app (with the phone in the look). Without one, the card or the app is drawn in your brand's colours."
},
"stepsTitle": {
"type": "string",
"maxLength": 32,
"title": "Steps title",
"description": "A heading over the steps, such as How it works."
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice",
"smartphone"
],
"title": "Icon",
"description": "A line icon for the step.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice",
"Smartphone"
]
},
"title": {
"type": "string",
"maxLength": 36,
"title": "Step",
"description": "What to do."
},
"detail": {
"type": "string",
"maxLength": 70,
"title": "Detail",
"description": "One line more about it."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Step"
},
"minItems": 2,
"maxItems": 4,
"title": "How it works",
"description": "Two to four steps, in order; the clip gets almost two seconds longer for each."
},
"perksTitle": {
"type": "string",
"maxLength": 32,
"title": "Perks title",
"description": "A heading over the perks, such as Members get."
},
"perks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"icon": {
"type": "string",
"enum": [
"check",
"circle-check",
"x",
"arrow-right",
"arrow-up-right",
"plus",
"star",
"heart",
"thumbs-up",
"sparkles",
"zap",
"clock",
"calendar",
"map-pin",
"info",
"triangle-alert",
"lightbulb",
"target",
"award",
"crown",
"gem",
"flame",
"timer",
"list-checks",
"clipboard-check",
"badge-check",
"hand-heart",
"rocket",
"trophy",
"megaphone",
"bell",
"qr-code",
"ticket",
"gift",
"key-round",
"book-open",
"graduation-cap",
"house",
"phone",
"mail",
"globe",
"users",
"user",
"shopping-cart",
"shopping-bag",
"tag",
"truck",
"store",
"apple",
"coffee",
"croissant",
"carrot",
"fish",
"wine",
"pizza",
"utensils",
"baby",
"shirt",
"scissors",
"package",
"circle-percent",
"sprout",
"cake-slice",
"smartphone"
],
"title": "Icon",
"description": "A line icon for the perk.",
"enumNames": [
"Check",
"Circle check",
"X",
"Arrow right",
"Arrow up right",
"Plus",
"Star",
"Heart",
"Thumbs up",
"Sparkles",
"Zap",
"Clock",
"Calendar",
"Map pin",
"Info",
"Triangle alert",
"Lightbulb",
"Target",
"Award",
"Crown",
"Gem",
"Flame",
"Timer",
"List checks",
"Clipboard check",
"Badge check",
"Hand heart",
"Rocket",
"Trophy",
"Megaphone",
"Bell",
"Qr code",
"Ticket",
"Gift",
"Key round",
"Book open",
"Graduation cap",
"House",
"Phone",
"Mail",
"Globe",
"Users",
"User",
"Shopping cart",
"Shopping bag",
"Tag",
"Truck",
"Store",
"Apple",
"Coffee",
"Croissant",
"Carrot",
"Fish",
"Wine",
"Pizza",
"Utensils",
"Baby",
"Shirt",
"Scissors",
"Package",
"Circle percent",
"Sprout",
"Cake slice",
"Smartphone"
]
},
"title": {
"type": "string",
"maxLength": 32,
"title": "Perk",
"description": "The perk, in a few words."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Detail",
"description": "A line more about it."
}
},
"required": [
"title"
],
"additionalProperties": false,
"title": "Perk"
},
"minItems": 0,
"maxItems": 6,
"title": "Perks",
"description": "Up to six things members get. Left out, the clip goes from the steps to the figures."
},
"currency": {
"type": "string",
"maxLength": 3,
"title": "Currency",
"description": "The ISO code money figures are in, such as EUR, GBP, USD or CHF."
},
"figures": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Value",
"description": "The number."
},
"unit": {
"type": "string",
"maxLength": 12,
"title": "Unit",
"description": "What it counts, such as points or %. Left out for money."
},
"money": {
"type": "boolean",
"title": "Money",
"description": "Written as an amount in the currency above."
},
"label": {
"type": "string",
"maxLength": 60,
"title": "Label",
"description": "What the number means."
}
},
"required": [
"value",
"label"
],
"additionalProperties": false,
"title": "Figure"
},
"minItems": 0,
"maxItems": 3,
"title": "Figures",
"description": "Up to three numbers that show what it is worth, such as points per euro or what members saved. Each counts up to exactly the value sent."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "Terms that must be shown with the programme."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"carrier": {
"type": "string",
"enum": [
"card",
"phone"
],
"title": "Shown on",
"description": "Card: a membership card, your picture as its face or drawn in your colours. Phone: a phone with your app screen, or one drawn in your colours.",
"enumNames": [
"A card",
"A phone"
]
},
"numbered": {
"type": "boolean",
"title": "Number the steps",
"description": "Each step's badge shows its number, with the icon beside the step; off, the badge shows the icon."
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the programme, how it works, what members get, the figures and the call to join."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
}
},
"additionalProperties": false
},
"propertyNames": {
"enum": [
"aa",
"ab",
"ae",
"af",
"ak",
"am",
"an",
"ar",
"as",
"av",
"ay",
"az",
"ba",
"be",
"bg",
"bi",
"bm",
"bn",
"bo",
"br",
"bs",
"ca",
"ce",
"ch",
"co",
"cr",
"cs",
"cu",
"cv",
"cy",
"da",
"de",
"dv",
"dz",
"ee",
"el",
"en",
"eo",
"es",
"et",
"eu",
"fa",
"ff",
"fi",
"fj",
"fo",
"fr",
"fy",
"ga",
"gd",
"gl",
"gn",
"gu",
"gv",
"ha",
"he",
"hi",
"ho",
"hr",
"ht",
"hu",
"hy",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"io",
"is",
"it",
"iu",
"ja",
"jv",
"ka",
"kg",
"ki",
"kj",
"kk",
"kl",
"km",
"kn",
"ko",
"kr",
"ks",
"ku",
"kv",
"kw",
"ky",
"la",
"lb",
"lg",
"li",
"ln",
"lo",
"lt",
"lu",
"lv",
"mg",
"mh",
"mi",
"mk",
"ml",
"mn",
"mr",
"ms",
"mt",
"my",
"na",
"nb",
"nd",
"ne",
"ng",
"nl",
"nn",
"no",
"nr",
"nv",
"ny",
"oc",
"oj",
"om",
"or",
"os",
"pa",
"pi",
"pl",
"ps",
"pt",
"qu",
"rm",
"rn",
"ro",
"ru",
"rw",
"sa",
"sc",
"sd",
"se",
"sg",
"si",
"sk",
"sl",
"sm",
"sn",
"so",
"sq",
"sr",
"ss",
"st",
"su",
"sv",
"sw",
"ta",
"te",
"tg",
"th",
"ti",
"tk",
"tl",
"tn",
"to",
"tr",
"ts",
"tt",
"tw",
"ty",
"ug",
"uk",
"ur",
"uz",
"ve",
"vi",
"vo",
"wa",
"wo",
"xh",
"yi",
"yo",
"za",
"zh",
"zu",
"zh-CN",
"zh-TW",
"pt-BR"
]
}
}
},
"required": [
"clipData"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
Ask Reelwire for the same document yourself, without signing in:
curl "http://localhost:4000/v1/formats/template/tpl_5bbd0ae3e79a?variant=Loyalty%20programme&version=1.0.0"
Delivery JSON
Your own system sends this to one of your streams, POST /v1/stream, and every channel listening to
that stream draws it with its template. data is the document described above; a stream with an
empty field map passes it to the template unchanged. Try it first on POST /v1/stream/validate,
which answers the same without publishing anything. Streams and feeds
explains the rest, including how to map a document of your own shape instead.
{
"streamId": "st_your_stream_id",
"eventId": "01M2SQMKK3G1NVFXV31DCBVB95",
"occurredAt": "2026-09-23T07:00:00Z",
"locale": "en",
"data": {
"clipData": {
"kicker": "Free to join",
"headline": "Collect points on every shop and save all year round",
"subline": "Scan the app or your card at the till and your points add up on their own, in every store.",
"cardName": "Greenleaf Rewards",
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"stepsTitle": "How it works",
"steps": [
{
"icon": "smartphone",
"title": "Get the app or the card",
"detail": "Free in the app stores, or ask for the card at any till"
},
{
"icon": "qr-code",
"title": "Scan it at the till",
"detail": "Every euro you spend is a point, in store and online"
},
{
"icon": "gift",
"title": "Swap points for vouchers",
"detail": "500 points are a 5 euro voucher, ready in the app"
}
],
"perksTitle": "Members also get",
"perks": [
{
"icon": "tag",
"title": "Members' prices every week",
"detail": "On fifty products, new every Monday"
},
{
"icon": "cake-slice",
"title": "A birthday treat",
"detail": "A cake of your choice on us"
},
{
"icon": "truck",
"title": "Free delivery",
"detail": "On orders over 40 euros"
},
{
"icon": "sparkles",
"title": "Double points days",
"detail": "Announced first in the app"
}
],
"currency": "EUR",
"figures": [
{
"unit": "point",
"label": "for every euro you spend, in store and online",
"value": 1
},
{
"label": "voucher for every 500 points you collect",
"money": true,
"value": 5
},
{
"label": "saved on average by our members last year",
"money": true,
"value": 148
}
],
"cta": {
"label": "Join for free",
"detail": "greenleaf.example/rewards"
},
"disclaimer": "Points have no cash value. Vouchers valid for 90 days. Full terms at greenleaf.example/rewards.",
"look": {
"theme": "brand",
"pace": "standard",
"corners": "round",
"align": "start",
"carrier": "phone",
"numbered": true,
"logo": "auto"
}
},
"metaData": {
"title": "Greenleaf Rewards: collect points on every shop",
"captionTiny": "Greenleaf Rewards is free: a point for every euro, vouchers from 500 points, members' prices every week and a birthday treat.",
"captionShort": "Collect points on every shop and save all year round. Greenleaf Rewards is free: get the app or the card, scan it at the till and swap 500 points for a 5 euro voucher. Members also get weekly members' prices, a birthday treat and free delivery over 40 euros.",
"captionMedium": "Collect points on every shop and save all year round with Greenleaf Rewards. It is free to join: get the app from the app stores or ask for the card at any till, scan it when you pay and every euro you spend is a point, in store and online. 500 points are a 5 euro voucher, ready in the app. Members also get members' prices on fifty products every week, a birthday cake on us, free delivery on orders over 40 euros and double points days. Last year our members saved 148 euros on average.",
"captionLong": "Collect points on every shop and save all year round with Greenleaf Rewards. It is free to join: download the app from the app stores, or ask for the card at any till. Scan it when you pay and every euro you spend is a point, in store and online, and your points add up on their own. 500 points are a 5 euro voucher, ready in the app the moment you reach them. Members also get members' prices on fifty products, new every Monday, a birthday cake of their choice on us, free delivery on orders over 40 euros and double points days, announced first in the app. Last year our members saved 148 euros on average. Points have no cash value and vouchers are valid for 90 days; the full terms are on our website.",
"hashtags": [
"greenleafrewards",
"loyalty",
"greenleafmarket",
"savemoney"
]
}
}
}
The delivery names no version: which build draws it is the channel's choice, the newest of its
variant or the one it is pinned to. eventId is a ULID you make once per event: sending the same
one again changes nothing. occurredAt is when the thing happened, not when you sent it. locale
is the language of the text in data, and data.locales carries other languages beside it.