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”
.png)
- 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.)
.png)
- 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)
.png)
- 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.
2. INDEXED Body Paragraphs
For fine-grained control over body text placement, you can assign each paragraph to its own frame.
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.
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)?
.png)
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.
.png)
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)
.png)
Using Script Labels:
- Name frames anything you want. Then add script labels with the same {slot}_{role} format
- story1_headline
- story1_byline
- Story1_body
.png)
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