The Taxi system All exhibits →

Built because: “reusable email templates and content components” and “establishing quality standards”

Taxi for Email is a template builder. I write one master template that declares the modules and their fields. Marketers build each send by dropping modules into zones and filling the fields, then export to Braze. They never touch the HTML.

At Dentsu I helped expand, build and maintain the SkyShowtime master template in Taxi for Email from early 2025 to mid 2026. The Braze layer sits inside the template: content blocks, catalogs, custom attributes and the Liquid abort checks that stop a send when a rail comes back blank. The result was a system non-technical marketers could assemble on-brand and could not break.

One Taxi for Email master template. Every send is built by dropping modules into three zones, filling their fields and exporting to Braze. Thirteen modules read a content-source dropdown; the API-driven sources inject a rail engine block and abort the send when a rail comes back blank. Plan details and social links come from Braze catalogs keyed by country.

53modules
2,287fields
12content blocks
5catalogs
31abort checks
7content sources

Counted from the source, 2026-09-20. Field types: number 389 · color 300 · href 299 · checkbox 296 · rich 258 · dropdown 213 · text 201 · src 197 · align 71 · code 54 · hidden 9. Zones: Header, content, footer. Translation tags: 258. Page background #000000, email background #1D123C: the formatting module’s two colour fields.

One module, HeroTitleCTA, shows how the whole template thinks. A marketer picks where the content comes from. The module then keeps only the markup for that choice, pulls the titles and images in at send time, and refuses to send if something essential is missing.

The stage above is its CUSTOM_CONTENT branch, the one where the marketer types everything in. The other six branches use the same table markup and fetch their content from Braze.

  • The marketer’s controlsEvery colour, padding, size and alignment is a Taxi field. On export each one becomes an attribute on the HTML, so nobody edits code.
  • Show or hideCheckboxes such as SubCHK (subheader) and showStreamNow remove a whole row when unticked.
  • Where the content comes fromOne dropdown, contentSource, with seven options: from a live content rail to fully custom copy. A rail is a named list of titles curated in Atom, SkyShowtime’s content platform, the same list that fills a row on the app’s home screen; the email stores only the rail’s name and Braze fetches the current titles at send time.
  • Only one branch survivesEach source has its own block of markup. A rule on the wrapper deletes every block except the chosen one.
  • Picking the railA second dropdown lists the rails the email can use, or a code field takes a custom rail name.
  • Pulling the content inThe rail name is handed to a Braze content block, which returns the titles and images when the email is sent.
  • Refuse to send when it’s wrongIf the first image is blank, or a single-title send gets more than one title, the send is aborted with a message instead of going out broken.
  • Different people, different buttonsThe My list button only renders for people outside the win-back segment.
  • Two button styles from one fieldThe borderChk checkbox switches the second button between a filled button and a one-pixel outline.

Real source, lines 8680 to 10012 of the master template, the whole module. Rail names replaced with RAIL_A, RAIL_B; URLs, imagery and prices removed.

All 53 modules in source order. Sources is the number of options in the module’s content-source dropdown; uses lists the Braze constructs found inside the module.

#ModuleLabelFieldsSourcesUsesWhat it does
1formattingDesign formatting2Page and email background colours for the whole template.
2prHdrPreheader11translationHidden preheader line, translation-tagged, with colour and padding controls.
3hdrLogoHeader logo11content_blocksHeader logo image and link; pulls the winback My list CTA logic block.
42ColCTASeeMore2 Column with CTAs + See More496content_blocks, translation, abort_message, cta_cohortTwo columns of image, title, synopsis, See more and two CTAs.
5SingleColHeroSingle Column Hero with CTAs216content_blocks, translation, abort_message, cta_cohortFull-width hero image with Stream now and My list CTAs.
62ColumnsImageCopyCTA2 Columns Image Copy CTA266content_blocks, translation, abort_message, cta_cohortTwo image columns with copy and CTAs from a rail or custom input.
74ColumnsImageCopyCTA4 Columns Image Copy CTA466content_blocks, translation, abort_message, cta_cohortFour titles in a two-by-two grid with copy and CTAs.
86ColumnsImageCopyCTA6 Columns Image Copy CTA666content_blocks, translation, abort_message, cta_cohortSix titles in a three-by-two grid with copy and CTAs.
93ColumnsImageCopyCTA3 Columns Image Copy CTA566content_blocks, translation, abort_message, cta_cohortThree titles in a row with synopsis, See more and CTAs.
10SingleColHeroSynopsisSingle Column Hero Synopsis246content_blocks, translation, abort_message, cta_cohortHero image, synopsis copy and two CTAs for one title.
115ImageGrid5 Image Grid356content_blocks, translation, abort_messageOne hero image over a two-by-two grid: five titles, five images.
12HeroTitleCTAHero + Title + CTA957content_blocks, translation, abort_message, cta_cohort16:9 hero, title block, subheader toggle, two CTAs; seven content sources.
132ColumnArticleImage2 Columns Image with CTAs546content_blocks, translation, abort_message, cta_cohortTwo rows of 3:4 image beside title, synopsis, See more and CTAs.
14Atom_1ColumnArticleImageLEFT_SingleTitleATOM1 Column Article / Image Left / CTA326content_blocks, translation, abort_message, cta_cohortImage left, title, synopsis, See more and CTAs on the right.
15Atom_1ColumnArticleImageRIGHT_SingleTitleATOM1 Column Article / Image Right / CTA326content_blocks, translation, abort_message, cta_cohortImage right, title, synopsis, See more and CTAs on the left.
16FeatureModule_ATOMSingleTitle_universalFeature Module366content_blocks, translation, abort_messageSingle-title feature: full-width image, keyline and synopsis; API or custom.
17ModSPModule Spacer2Vertical spacer with height and background colour.
18keylineGradient Keyline6Gradient keyline image row with padding and background colour.
19keylineCurvedCurved Gradient Keyline5Curved gradient keyline image row.
20fwImgModFull-width Image13translationFull-width image with link, alt and mobile alternate; translation-tagged.
21headlineModHeadline13translationStandalone headline with colour, size, mobile size and optional link.
22textCTAModText Article and CTA48translationText article: headline, copy and CTA, with My list and translation toggles.
232colimgL2 Column Article Image54translationTwo-column article, image beside copy, image alignment and padding fields.
242colimgSqr2 Column Article Square Image42Two-column article with a square image beside title and info copy.
25Mod06Module 06 – Image & CTA21Image with copy and an Add to calendar CTA per mail client.
26Mod7E2 Columns Img / copy / CTA52Two columns of image, copy and CTA with alternate mobile images.
27ModPlanPckr_v3Plan Picker Content Block0content_blocksInjects the plan picker content block; no local fields.
28featureModFeature Module54content_blocks, translation, abort_messageHeadline, copy, full-width image, second copy and CTA; optional rail title.
29imgCTAHeadline Image with Padding + CTA66content_blocks, translation, abort_messageHeadline over a padded image with CTA; rail and recommendations toggles.
302imgColCTAImage Columns with CTAs154catalog_items, content_blocks, translation, abort_messageTwo image columns with headline, copy and CTAs; rail, catalog and See more toggles.
31ModPlValST_RModule Plan Value Standard76catalog_itemsStandard plan value grid, rebrand catalog; four icons with captions per country.
32ModPlValSTAds_RModule Plan Value Standard with Ads70catalog_itemsStandard with ads plan value grid, rebrand catalog per country.
33ModPlValPrem_RModule Plan Value Premium76catalog_itemsPremium plan value grid, rebrand catalog per country.
34ModPlValSTModule Plan Value Standard60catalog_itemsStandard plan: headline, copy, four icon captions, terms; catalog per country.
35ModPlValSTAdsModule Plan Value Standard with Ads54catalog_itemsStandard with ads plan grid; catalog copy per country.
36ModPlValPremModule Plan Value Premium60catalog_itemsPremium plan grid; catalog copy per country.
37TitleArtCentTitle & Articles Centered61Centred title over numbered article rows.
38ChPlsChange Plans Module51Change plans: headline, numbered steps and a CTA.
39titlArtCTATitle & Articles & CTA89Title, numbered article rows with divider lines and a CTA.
40ComThMonComing this month223Coming this month: up to eight dated rows, each with its own CTA type.
41highlightModHighlighted Title & Copy17Highlighted title and copy on a coloured panel.
42faqModFAQ76FAQ rows with question, answer, arrow icons and divider lines.
43socialsBigSocials - Image / Title / Copy + Icons Big61catalog_itemsImage, title, copy and large social icons from a translations catalog.
44socialsThinSocials - Copy / Icons Thin65catalog_itemsCopy and small social icons from a translations catalog.
45quoteQuote26Quotation with header, attribution and location.
46appModSST App Module45catalog_itemsApp promotion: headline, image, copy and store icons from the app catalog.
47appstoresModSST App Store Icons14catalog_itemsApp store and Play store badges with links from the app catalog.
48studiosModStudios Module12Headline over a row of studio logos.
49C_HTMLC_HTML : CUSTOM HTML CODE1Raw custom HTML code field.
50C_LIQUIDC_LIQUID: CUSTOM LIQUID SCRIPT1Raw custom Liquid script field; %20 fixed by hand after export.
51CBlocksC_BLOCK: Content Block Liquid Tags5Content block Liquid tag picker: rail name and block number.
52footerCblockFooter Content Blocks2content_blocksFooter content block dropdown: marketing or service footer.
53disclaimerDisclaimer Text9Disclaimer text with colour, size, mobile size and padding.

Module names and labels are the author’s own naming and are shown as written. Descriptions are derived from each module’s fields and markup.

Braze layer

Content blocks (12)

  • 2ColumnArticleImage_AtomRails_titleHeader_Snippet
  • 2ImageColumnswithCTAs_SeeMore_ATOM_Snippet
  • ComingSoon_engine_multi_email_universal
  • FORYOU_engine_multi_email_universal
  • Marketing_Footer_Rebrand
  • Module_Translations_CC_v1
  • PlanPicker_Rebrand_Logic
  • RAILS_engine_multi_email
  • RAILS_engine_multi_email_universal
  • Service_Footer_Rebrand
  • SingleTitleATOM_Engine_multi_email_universal
  • Winback_MyList_CTA_Logic

Catalogs (5)

  • Movie_Night_Master
  • PlanValue_Modules_Catalog
  • Plan_Modules_ST_W_Ads_ST_PREM_V2
  • SST_App_Module_Catalog
  • social_translations

Custom attributes (3)

  • {{${email_address}}} 19 uses
  • {{${country}}} 11 uses
  • custom_attribute.${optOutId} 6 uses

Liquid guards

  • abort_message · 31 checks across 16 modules
  • translation tags · 258, one per translatable field, in 21 modules
  • cta_cohort != 'winback_prospect' · 76 branches hiding the My list CTA
  • catalog_items · 11 lookups, keyed on the country attribute
  • content_blocks · 79 references to the 12 blocks