Tech and industry (Software and SaaS), Case study 1.0.0
| Template | Tech and industry (Software and SaaS), tpl_fe11839b9ed7 |
|---|---|
| Variant | Case study |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 16 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.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip 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.section | text | up to 28 characters | Section: What the post is about, on a chip at the end of the header, such as Customer story or Case study. | |
clipData.customer | group | yes | Customer: 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.name | text | yes | up to 40 characters | Name: The customer's name, on its tile where no logo is sent. |
clipData.customer.logo | image | media:// file from the media library, alt text up to 120 characters | Logo: The customer's logo, shown whole on a plate. Use it only with the customer's permission. | |
clipData.customer.sector | text | up to 40 characters | Sector: The customer's sector and size, under their logo or name, such as Logistics, 1,200 people. | |
clipData.headline | text | yes | up to 72 characters | Headline: The story in a line, the result first, such as How Northwind Freight answers customers three times faster. |
clipData.challengeLabel | text | up to 24 characters | Challenge's label: A word or two over the challenge, such as The challenge. | |
clipData.challenge | text | up to 140 characters | Challenge: What the customer had to solve, in a line. | |
clipData.results | list | yes | at least 1, up to 3 | Results: 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[] | group | Result | ||
clipData.results[].value | number | yes | 4 decimals | Figure: The figure, drawn exactly as sent with the decimals it was sent with. |
clipData.results[].unit | text | up to 16 characters | Unit: After the figure, such as %, x or hours. A unit starting with % or x stays on the figure. | |
clipData.results[].label | text | yes | up to 48 characters | What it is: What the figure is, in a few words. |
clipData.results[].basis | text | yes | up to 120 characters | How it was measured: The data behind the figure and its period, such as Median first reply, March against August 2026. |
clipData.quote | group | Quote: 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.text | text | yes | up to 220 characters | Quote: Their words, without quotation marks: they are drawn. |
clipData.quote.name | text | up to 40 characters | Name: Who said it. | |
clipData.quote.role | text | up to 56 characters | Role: Their role at the customer, such as Head of customer service. | |
clipData.quote.picture | image | media:// file from the media library, alt text up to 120 characters | Portrait: Their portrait, in a rounded square beside the name. Left out, a plain tile stands in. | |
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, an app, a phone number. | |
clipData.footnote | text | up to 300 characters | Small 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.look | group | Look: 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.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.logo | enum | auto, free | Logo: 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.logoSize | enum | auto, small, large | Logo 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. | |
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 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.