Skip to main content

Tech and industry (Software and SaaS), Case study 1.0.0

TemplateTech and industry (Software and SaaS), tpl_fe11839b9ed7
VariantCase study
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length16 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 customer story in a bento of rounded tiles: the customer's logo or name and its sector, the headline on a tile of your colour, the challenge in a line, one to three results as big figures, each counting up to exactly what you send with how it was measured, and a quote with its author. Twelve seconds with one result, 1.8 more for each further one. metaData is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn in the clip: the section, the customer, the headline, the challenge, the results with how each was measured, the quote, the call to action and the small print.
clipData.sectiontextup to 28 charactersSection: What the post is about, on a chip at the end of the header, such as Customer story or Case study.
clipData.customergroupyesCustomer: Who the story is about: their logo on a tile of its own (or their name, where no logo is sent) with their sector under it.
clipData.customer.nametextyesup to 40 charactersName: The customer's name, on its tile where no logo is sent.
clipData.customer.logoimagemedia:// file from the media library, alt text up to 120 charactersLogo: The customer's logo, shown whole on a plate. Use it only with the customer's permission.
clipData.customer.sectortextup to 40 charactersSector: The customer's sector and size, under their logo or name, such as Logistics, 1,200 people.
clipData.headlinetextyesup to 72 charactersHeadline: The story in a line, the result first, such as How Northwind Freight answers customers three times faster.
clipData.challengeLabeltextup to 24 charactersChallenge's label: A word or two over the challenge, such as The challenge.
clipData.challengetextup to 140 charactersChallenge: What the customer had to solve, in a line.
clipData.resultslistyesat least 1, up to 3Results: One to three results, each a big figure on a tile of its own, counting up to exactly what you send in its turn, with what it is and how it was measured. A result is never shown without how it was measured.
clipData.results[]groupResult
clipData.results[].valuenumberyes4 decimalsFigure: The figure, drawn exactly as sent with the decimals it was sent with.
clipData.results[].unittextup to 16 charactersUnit: After the figure, such as %, x or hours. A unit starting with % or x stays on the figure.
clipData.results[].labeltextyesup to 48 charactersWhat it is: What the figure is, in a few words.
clipData.results[].basistextyesup to 120 charactersHow it was measured: The data behind the figure and its period, such as Median first reply, March against August 2026.
clipData.quotegroupQuote: What somebody at the customer says, on a tile of its own with their portrait, name and role, read in its own turn after the results.
clipData.quote.texttextyesup to 220 charactersQuote: Their words, without quotation marks: they are drawn.
clipData.quote.nametextup to 40 charactersName: Who said it.
clipData.quote.roletextup to 56 charactersRole: Their role at the customer, such as Head of customer service.
clipData.quote.pictureimagemedia:// file from the media library, alt text up to 120 charactersPortrait: Their portrait, in a rounded square beside the name. Left out, a plain tile stands in.
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, an app, a phone number.
clipData.footnotetextup to 300 charactersSmall print: What must be said with the post, shown from the first frame to the last above your brand's footer line: that results are the customer's own and may differ, trademarks. A long one is set smaller, never cut.
clipData.lookgroupLook: How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, standard pace, round corners, text at the start.
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.logoenumauto, freeLogo: The style's own: the logo on a small plate 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.
clipData.look.logoSizeenumauto, small, largeLogo size: Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.
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 400 schema_validation error that names the field.

The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"section": {
"type": "string",
"maxLength": 28,
"title": "Section",
"description": "What the post is about, on a chip at the end of the header, such as Customer story or Case study."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "The customer's name, on its tile where no logo is sent."
},
"logo": {
"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": "Logo",
"description": "The customer's logo, shown whole on a plate. Use it only with the customer's permission."
},
"sector": {
"type": "string",
"maxLength": 40,
"title": "Sector",
"description": "The customer's sector and size, under their logo or name, such as Logistics, 1,200 people."
}
},
"required": [
"name"
],
"additionalProperties": false,
"title": "Customer",
"description": "Who the story is about: their logo on a tile of its own (or their name, where no logo is sent) with their sector under it."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The story in a line, the result first, such as How Northwind Freight answers customers three times faster."
},
"challengeLabel": {
"type": "string",
"maxLength": 24,
"title": "Challenge's label",
"description": "A word or two over the challenge, such as The challenge."
},
"challenge": {
"type": "string",
"maxLength": 140,
"title": "Challenge",
"description": "What the customer had to solve, in a line."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Figure",
"description": "The figure, drawn exactly as sent with the decimals it was sent with."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "After the figure, such as %, x or hours. A unit starting with % or x stays on the figure."
},
"label": {
"type": "string",
"maxLength": 48,
"title": "What it is",
"description": "What the figure is, in a few words."
},
"basis": {
"type": "string",
"maxLength": 120,
"title": "How it was measured",
"description": "The data behind the figure and its period, such as Median first reply, March against August 2026."
}
},
"required": [
"value",
"label",
"basis"
],
"additionalProperties": false,
"title": "Result"
},
"minItems": 1,
"maxItems": 3,
"title": "Results",
"description": "One to three results, each a big figure on a tile of its own, counting up to exactly what you send in its turn, with what it is and how it was measured. A result is never shown without how it was measured."
},
"quote": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 220,
"title": "Quote",
"description": "Their words, without quotation marks: they are drawn."
},
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "Who said it."
},
"role": {
"type": "string",
"maxLength": 56,
"title": "Role",
"description": "Their role at the customer, such as Head of customer service."
},
"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": "Portrait",
"description": "Their portrait, in a rounded square beside the name. Left out, a plain tile stands in."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Quote",
"description": "What somebody at the customer says, on a tile of its own with their portrait, name and role, read in its own turn after the results."
},
"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, an app, 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."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Small print",
"description": "What must be said with the post, shown from the first frame to the last above your brand's footer line: that results are the customer's own and may differ, trademarks. A long one is set smaller, never cut."
},
"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"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate 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"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, standard pace, round corners, text at the start."
}
},
"required": [
"customer",
"headline",
"results"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the customer, the headline, the challenge, the results with how each was measured, the quote, the call to action and the small print."
},
"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": {
"section": {
"type": "string",
"maxLength": 28,
"title": "Section",
"description": "What the post is about, on a chip at the end of the header, such as Customer story or Case study."
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "The customer's name, on its tile where no logo is sent."
},
"logo": {
"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": "Logo",
"description": "The customer's logo, shown whole on a plate. Use it only with the customer's permission."
},
"sector": {
"type": "string",
"maxLength": 40,
"title": "Sector",
"description": "The customer's sector and size, under their logo or name, such as Logistics, 1,200 people."
}
},
"additionalProperties": false,
"title": "Customer",
"description": "Who the story is about: their logo on a tile of its own (or their name, where no logo is sent) with their sector under it."
},
"headline": {
"type": "string",
"maxLength": 72,
"title": "Headline",
"description": "The story in a line, the result first, such as How Northwind Freight answers customers three times faster."
},
"challengeLabel": {
"type": "string",
"maxLength": 24,
"title": "Challenge's label",
"description": "A word or two over the challenge, such as The challenge."
},
"challenge": {
"type": "string",
"maxLength": 140,
"title": "Challenge",
"description": "What the customer had to solve, in a line."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "number",
"title": "Figure",
"description": "The figure, drawn exactly as sent with the decimals it was sent with."
},
"unit": {
"type": "string",
"maxLength": 16,
"title": "Unit",
"description": "After the figure, such as %, x or hours. A unit starting with % or x stays on the figure."
},
"label": {
"type": "string",
"maxLength": 48,
"title": "What it is",
"description": "What the figure is, in a few words."
},
"basis": {
"type": "string",
"maxLength": 120,
"title": "How it was measured",
"description": "The data behind the figure and its period, such as Median first reply, March against August 2026."
}
},
"required": [
"value",
"label",
"basis"
],
"additionalProperties": false,
"title": "Result"
},
"minItems": 1,
"maxItems": 3,
"title": "Results",
"description": "One to three results, each a big figure on a tile of its own, counting up to exactly what you send in its turn, with what it is and how it was measured. A result is never shown without how it was measured."
},
"quote": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 220,
"title": "Quote",
"description": "Their words, without quotation marks: they are drawn."
},
"name": {
"type": "string",
"maxLength": 40,
"title": "Name",
"description": "Who said it."
},
"role": {
"type": "string",
"maxLength": 56,
"title": "Role",
"description": "Their role at the customer, such as Head of customer service."
},
"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": "Portrait",
"description": "Their portrait, in a rounded square beside the name. Left out, a plain tile stands in."
}
},
"additionalProperties": false,
"title": "Quote",
"description": "What somebody at the customer says, on a tile of its own with their portrait, name and role, read in its own turn after the results."
},
"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, an app, 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."
},
"footnote": {
"type": "string",
"maxLength": 300,
"title": "Small print",
"description": "What must be said with the post, shown from the first frame to the last above your brand's footer line: that results are the customer's own and may differ, trademarks. A long one is set smaller, never cut."
},
"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"
]
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on a small plate 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"
]
},
"logoSize": {
"type": "string",
"enum": [
"auto",
"small",
"large"
],
"title": "Logo size",
"description": "Standard is the style's own size. Small draws the logo a fifth smaller, with its plate. Large draws it a quarter larger wherever the style has room for it, and at the standard size where it has none.",
"enumNames": [
"Standard",
"Small",
"Large"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same six switches in every format (theme, pace, corners, alignment, logo, logo size). Leave any out for the package's default: the brand's colours, standard pace, round corners, text at the start."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the section, the customer, the headline, the challenge, the results with how each was measured, the quote, the call to action and the small print."
},
"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_fe11839b9ed7?variant=Case%20study&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": {
"section": "Customer story",
"customer": {
"logo": {
"alt": "Northwind Freight's logo",
"url": "media://example-logo.png"
},
"name": "Northwind Freight",
"sector": "Logistics, 1,200 people"
},
"headline": "How Northwind Freight answers customers three times faster",
"challengeLabel": "The challenge",
"challenge": "Requests came in by email, chat and phone, and nobody could see which ones were still waiting.",
"results": [
{
"unit": "x",
"basis": "Median time to first reply, March against August 2026",
"label": "faster first replies",
"value": 3
},
{
"unit": "%",
"basis": "Weekly average, first quarter against third quarter 2026",
"label": "fewer requests left open at week's end",
"value": 62
},
{
"unit": "hours",
"basis": "Time tracking of 48 agents, July to September 2026",
"label": "saved per agent every week",
"value": 9.5
}
],
"quote": {
"name": "Sofia Brandt",
"role": "Head of customer service",
"text": "We used to start every morning by searching three inboxes. Now the whole team sees one queue, and nothing waits longer than an hour.",
"picture": {
"alt": "Sofia Brandt",
"url": "media://example-badge.png"
}
},
"cta": {
"label": "Read the full story",
"detail": "flowbase.example/customers"
},
"footnote": "Results are Northwind Freight's own, measured as stated, and yours may differ. Flowbase is a trademark of Flowbase Inc.",
"look": {
"logo": "auto",
"pace": "standard",
"align": "start",
"theme": "brand",
"corners": "round",
"logoSize": "auto"
}
},
"metaData": {
"title": "How Northwind Freight answers customers three times faster",
"captionTiny": "Northwind Freight now answers customers three times faster, with 62% fewer requests left open at the end of a week. Their story:",
"captionShort": "How Northwind Freight answers customers three times faster: requests from email, chat and phone now land in one Flowbase queue. First replies are three times faster, 62% fewer requests stay open at the end of a week, and each agent saves 9.5 hours a week.",
"captionMedium": "How Northwind Freight answers customers three times faster. Requests came in by email, chat and phone, and nobody could see which ones were still waiting. With every request in one Flowbase queue and rules that route them to the right person, the median time to a first reply fell to a third between March and August 2026, 62% fewer requests stay open at the end of a week, and each of their 48 agents saves 9.5 hours a week. \"Nothing waits longer than an hour,\" says Sofia Brandt, head of customer service.",
"captionLong": "How Northwind Freight answers customers three times faster. The logistics company's 1,200 people take requests from shippers by email, chat and phone, and until this spring nobody could see which ones were still waiting. They brought every channel into one Flowbase queue and set up rules that route each request to the right team and escalate the ones that wait too long. The results, measured by Northwind: the median time to a first reply fell to a third between March and August 2026, 62% fewer requests stay open at the end of a week (first quarter against third quarter), and time tracking of 48 agents shows 9.5 hours saved per agent every week. \"We used to start every morning by searching three inboxes. Now the whole team sees one queue, and nothing waits longer than an hour,\" says Sofia Brandt, head of customer service. Read the full story on our site.",
"hashtags": [
"customerstory",
"casestudy",
"saas",
"customerservice",
"productivity"
]
}
}
}

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.