BOLD InDesign Plugin: Template Designer Guide

Written By Spandana Patnam (Administrator)

Updated at November 3rd, 2026

How to build InDesign page templates for automated CMS content placement

Overview:

The BOLD InDesign plugin enables dynamic content placement from the CMS into your page templates. A single page template contains multiple story slots (story1, story2, story3, etc.). When placing stories, users select which CMS story goes into which slot, and the plugin automatically populates all the content frames in that slot based on your frame mapping.

This guide covers:

  • Multi-slot template architecture
  • The unified slot-role mapping model
  • Two ways to encode mappings: Layer Names vs. Script Labels
  • Element types (single, indexed, multiple)
  • Step-by-step template creation
  • Best practices and troubleshooting

How the Plugin Works

Plugin User Workflow
When a plugin user places a story:

  • They toggle a switch to select the mapping encoding: "Layer Name" or “Script Label”

     
  • Based on that selection, the plugin discovers available slots on the page by reading either frame names or script labels
  • For each CMS story, a dropdown shows the available slots (story1, story2, story3, etc.)

     
  • User selects which slot to place the story into
  • Plugin automatically populates all identifiable frames in that slot with the story conten

Designer Responsibility
You create a single page template with multiple story slots, each containing frames for different content elements. Every frame must express a mapping using ONE of two encoding methods:

  • Encoding 1: Layer Names - Name frames using {slot}_{role} pattern (e.g., story1_headline)

     
  • Encoding 2: Script Labels - Store {slot}_{role} in the frame's script label (e.g., story1_headline)

Both methods use the exact same mapping format. The plugin will discover your slots based on whichever encoding you choose.

The Mapping Format
Every frame in your template must express a mapping using this format:
{slot}_{role}

  • Slot: Which story position is this frame for? (story1, story2, story3, etc.)
  • Role: What type of content does this frame hold? (headline, byline, body, image, caption, etc.)

Examples of the format:

  • story1_headline
  • story2_byline
  • story3_body
  • story1_quote_attribution

Note: Underscores in the role name are read as spaces. So story1_quote_attribution becomes slot story1, role "quote attribution".

Encoding Method 1: Layer Names
Express the mapping directly in the frame name. Simply name your frames using the {slot}_{role} format.
Example:

  • In InDesign, name the frame: story1_headline

Advantages:

  • Straightforward and visible in the InDesign Layers panel
  • Easiest method to set up

Choosing Your Encoding Method
Both methods work identically - they just store the same {slot}_{role} mapping in different places. Choose based on your workflow:
Layer Names:

  • Use if you prefer naming directly in the Layers panel
  • Simpler setup process

Script Labels:

  • Use if you prefer flexible frame naming
  • Useful when you need to organize frames by visual hierarchy rather than naming

Element Types and Mapping

The plugin handles three categories of elements within each slot:

1. SINGLE Elements (one per story)
These elements appear exactly once per story slot. If you create multiple frames with the same role, only the topmost frame (by vertical position on the page) will be filled. The rest remain blank.

Element

Role Name

Maps To

Headline

headline, head

story.headline

Author name

author_name, byline, author

story[author-name]

Author role

author_role

author's contributor-role.name

Subheadline

subheadline, subhead, deck

story.subheadline

Kicker

kicker, overline

story.kicker

Summary

summary

story's first summary element

Body text

body, text, copy

all body paragraphs combined

Hero image caption

hero_image_caption

story[hero-image-caption]

Hero image attribution

hero_image_attribution

story[hero-image-attribution]

2. INDEXED Body Paragraphs
For fine-grained control over body text placement, you can assign each paragraph to its own frame.

Element

Role Name

Maps To

Paragraph 1

text1

1st body paragraph

Paragraph 2

text2

2nd body paragraph

Paragraph N

textN

Nth body paragraph

This is useful when you want each paragraph to have its own font treatment, size, or spacing within a story slot.

3. MULTIPLE Elements (variable quantities)

These elements can appear multiple times per story. Create as many frames as you need - the plugin fills them in reading order (top to bottom). The first frame receives the first item, the second frame receives the second item, etc.

Element

Role Name

Maps To

Quote text

quote

each quote metadata.content

Quote attribution

quote_attribution

each quote metadata.attribution

Blurb

blurb

each blurb element text

Block quote text

block_quote

each blockquote metadata.content

Block quote attribution

block_quote_attribution

each blockquote metadata.attribution

Big fact

big_fact

each bigfact metadata.content

Big fact attribution

big_fact_attribution

each bigfact metadata.attribution

Q&A Question

question

each Q&A question text

Q&A Answer

answer

each Q&A answer text

Q&A Question attr.

question_attribution

each question interviewer.name

Q&A Answer attr.

answer_attribution

each answer interviewee.name

Image caption

image_caption

caption per image in order

Image attribution

image_attribution

attribution per image in order

4. Images

Images are positioned in order within each story slot:

  • 1st frame = Hero image
  • 2nd frame = First inline image
  • 3rd frame = Second inline image
  • Nth frame = Nth inline image

Role name: image
Create as many image frames as you expect images. Unused frames stay empty.

Step-by-Step Template Creation

Step 1: Plan Your Multi-Slot Layout

Decide how many story slots your page template will have:

  • How many stories will this template hold? (story1, story2, story3?)
  • For each slot, which elements do you need? (headline, image, body, quotes?)
  • Will stories have 1 image or multiple? 1 quote or many?
  • Do body texts need paragraph-by-paragraph control (indexed) or combined (single)?

Step 2: Choose Your Encoding Method

Decide whether you will use Layer Names or Script Labels to express your {slot}_{role} mappings. You must choose one method for your template.

Step 3: Create Frames for Story Slot 1

Using Layer Names:

  • Create text frames and name them using {slot}_{role}:
    • story1_headline
    • story1_byline
    • story1_body
    • story1_quote (create multiple frames if needed)

Using Script Labels:

  • Name frames anything you want. Then add script labels with the same {slot}_{role} format
    • story1_headline
    • story1_byline
    • Story1_body

Step 4: Create Image Frames for Story Slot 1

Create image/placeholder frames:

  • Using Layer Names: name them story1_image, story1_image_caption, story1_image_attribution
  • Using Script Labels: add script labels story1_image, story1_image_caption, story1_image_attribution

Step 5: Repeat for Additional Story Slots

For story2, story3, etc., repeat Steps 3-4 using story2_, story3_, etc. prefixes.

Example page layout with 3 story slots:

story1_headline
story1_byline
story1_image
story1_body
--- (divider)
story2_headline
story2_image
story2_body
--- (divider)
story3_headline
story3_byline
story3_body

Step 6: Test Your Template

Before using in production:

  • Save and close the template
  • Use the plugin to load test stories
  • Toggle the switch to match your encoding method (Layer Name or Script Label)
  • Verify that available slots appear in the dropdowns (story1, story2, story3)
  • Place stories into different slots and verify content populates correctly
  • Check text overflow, image scaling, and spacing
  • Adjust font sizes, padding, or frame dimensions as needed

Best Practices

  • Be consistent with naming or labeling. story1_headline is different from story1_Headline.
  • Use standard role names from the provided reference tables. The plugin expects exact matches.
  • For multiple elements (quotes, images, etc.), stack frames vertically in reading order (top to bottom). The plugin fills them in this order.
  • Clearly separate story slots on your page with dividers or whitespace so they are visually distinct.
  • Set appropriate minimum heights on text frames to avoid overflow. Use text threading or auto-fit where possible.
  • For images, set the frame fill to "Fit proportionally" to prevent distortion.
  • Create placeholder content with realistic text length so you can design for edge cases.
  • Document your template layout in a brief for your team or client.
  • Use master pages to maintain consistency across multiple pages or templates.
  • Keep template file names descriptive (e.g., "Page1-FeatureStory-Template").

Troubleshooting Common Issues

Slots not appearing in the plugin dropdown

  • Check that your frame names or script labels match the {slot}_{role} format exactly with no typos
  • Verify the plugin switch is set to the correct encoding method matching your template
  • Ensure frames are not locked or hidden in InDesign

Content not appearing in frames

  • Check role names for typos or case mismatches
  • Verify the frame is a text or image frame (not a group or path)
  • Ensure the CMS story has the required fields (e.g., if no hero image exists, image frames stay empty)

Multiple frames of the same role filling unexpectedly

  • Remember: "Single" elements (headline, byline) only fill the topmost frame
  • For "Multiple" elements, ensure frames are stacked vertically in the order you want them filled
  • Check that you haven't accidentally created extra frames with the same role

Images distorted or not fitting properly

  • Set image frame fill option to “Fit proportionally”
  • Ensure frame aspect ratio matches expected image dimensions

Text overflowing or being cut off

  • Increase frame height or enable text threading
  • Use auto-fit options (InDesign Preferences - Type)
  • Test with longer content to find the breaking point

Quick Reference

The {slot}_{role} Mapping Format
This format is used identically in both Layer Names and Script Labels:

  • Layer Names method: Set frame name to story1_headline
  • Script Labels method: Set frame script label to story1_headline

Common role names for story1:
story1_headline
story1_byline
story1_body
story1_image
story1_image_caption
story1_image_attribution
story1_quote
story1_quote_attribution