Skip to main content

Retail, Loyalty programme 1.0.0

TemplateRetail, tpl_5bbd0ae3e79a
VariantLoyalty programme
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length15 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.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the programme, how it works, what members get, the figures and the call to join.
clipData.kickertextup to 32 charactersKicker: A short line above the headline, such as Free to join.
clipData.headlinetextyesup to 60 charactersHeadline: What the programme gives, in a sentence.
clipData.sublinetextup to 100 charactersSubline: A sentence under the headline.
clipData.cardNametextup to 24 charactersProgramme name: The name on the card or in the app, such as Greenleaf Rewards. Left out, the brand's name.
clipData.pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: 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.stepsTitletextup to 32 charactersSteps title: A heading over the steps, such as How it works.
clipData.stepslistyesat least 2, up to 4How it works: Two to four steps, in order; the clip gets almost two seconds longer for each.
clipData.steps[]groupStep
clipData.steps[].iconenumcheck, 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, smartphoneIcon: A line icon for the step.
clipData.steps[].titletextyesup to 36 charactersStep: What to do.
clipData.steps[].detailtextup to 70 charactersDetail: One line more about it.
clipData.perksTitletextup to 32 charactersPerks title: A heading over the perks, such as Members get.
clipData.perkslistat least 0, up to 6Perks: Up to six things members get. Left out, the clip goes from the steps to the figures.
clipData.perks[]groupPerk
clipData.perks[].iconenumcheck, 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, smartphoneIcon: A line icon for the perk.
clipData.perks[].titletextyesup to 32 charactersPerk: The perk, in a few words.
clipData.perks[].detailtextup to 48 charactersDetail: A line more about it.
clipData.currencytextup to 3 charactersCurrency: The ISO code money figures are in, such as EUR, GBP, USD or CHF.
clipData.figureslistat least 0, up to 3Figures: 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[]groupFigure
clipData.figures[].valuenumberyes2 decimalsValue: The number.
clipData.figures[].unittextup to 12 charactersUnit: What it counts, such as points or %. Left out for money.
clipData.figures[].moneybooleanMoney: Written as an amount in the currency above.
clipData.figures[].labeltextyesup to 60 charactersLabel: What the number means.
clipData.ctagroupCall 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.labeltextyesup to 28 charactersButton: What the button says.
clipData.cta.detailtextup to 48 charactersLine under it: An address, a handle, a phone number.
clipData.disclaimertextup to 120 charactersSmall print: Terms that must be shown with the programme.
clipData.lookgroupLook: 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.themeenumbrand, light, dark, boldTheme: 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.paceenumcalm, standard, punchyPace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.
clipData.look.cornersenumsquare, soft, roundCorners: The shape of cards, pictures and buttons.
clipData.look.alignenumstart, centreText alignment: Where the text lines up.
clipData.look.carrierenumcard, phoneShown 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.numberedbooleanNumber the steps: Each step's badge shows its number, with the icon beside the step; off, the badge shows the icon.
clipData.look.logoenumauto, freeLogo: 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.
metaDatagroupMeta 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.titletextup to 100 charactersTitle: 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.captionTinytextup to 200 charactersTiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionShorttextup to 500 charactersShort description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionMediumtextup to 1500 charactersMedium 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.captionLongtextup to 4000 charactersLong description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.hashtagslistup to 15Hashtags: Written without the #. Up to 15, which every platform takes.
metaData.hashtags[]textup to 60 charactersHashtag

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.