GWS Template Design Specification

Guide for designing Google Slides and Google Docs templates that work with the generate-doc.py document generation workflow.


1. Placeholder Naming Convention

All placeholders use the {{DOUBLE_CURLY_UPPERCASE}} format:

  • Delimiters: Double curly braces {{ }}
  • Case: UPPER_SNAKE_CASE inside the braces
  • No spaces: {{CLIENT_NAME}} not {{ CLIENT_NAME }}
  • Match case: The generation script uses matchCase: true — placeholders are case-sensitive

Standard Placeholders

PlaceholderDescriptionExample Value
{{CLIENT_NAME}}Client/prospect nameAcme Corp
{{PROPOSAL_DATE}}Proposal dateApril 11, 2026
{{REPORT_DATE}}Report dateApril 11, 2026
{{DATE}}Generic dateApril 11, 2026
{{CONSULTANT}}Consultant nameDmitri Zasage
{{COMPANY_SIZE}}Employee count50-200
{{INDUSTRY}}Client industryHealthcare
{{ENGAGEMENT_TYPE}}Service typeOperational Resilience Baseline
{{PRICING}}Engagement pricing$15,000
{{EXECUTIVE_SUMMARY}}Executive summary text(multi-line)
{{FINDINGS}}Assessment findings(multi-line)
{{RECOMMENDATIONS}}Recommendations text(multi-line)
{{KEY_QUALIFICATIONS}}Key qualifications(multi-line)
{{CONTACT_INFO}}Contact information(multi-line)

Image Placeholders (Slides Only)

PlaceholderDescriptionReplacement Method
{{LOGO}}Company logoreplaceAllShapesWithImage with CENTER_INSIDE
{{HEADSHOT}}Consultant headshotreplaceAllShapesWithImage with CENTER_CROP
{{CLIENT_LOGO}}Client company logoreplaceAllShapesWithImage with CENTER_INSIDE

Image placeholders: Create a text box with the placeholder text inside it. The replaceAllShapesWithImage API replaces the entire shape with the image, maintaining the shape’s position and size.

Custom Placeholders

When creating new templates, follow this naming pattern:

  • Prefix with the section: {{SECTION_FIELD}} (e.g., {{SCOPE_DESCRIPTION}}, {{TIMELINE_PHASE1}})
  • Use descriptive names that clearly indicate the content
  • Document all custom placeholders in the template’s entry in config/template_ids.json

2. Brand Constants

Colors

NameHexRGBUsage
Navy#020532(2, 5, 50)Primary backgrounds, headers
Deep Navy#091652(9, 22, 82)Secondary backgrounds
Copper#C47A3D(196, 122, 61)Accent, CTAs, highlights
Copper Hover#D4945E(212, 148, 94)Interactive hover states
Parchment#FEF9F1(254, 249, 241)Light backgrounds, body areas
Warm Stone#F0EBE4(240, 235, 228)Secondary light backgrounds
Charcoal#111827(17, 24, 39)Body text on light backgrounds
White#FFFFFF(255, 255, 255)Text on dark backgrounds
Slate Blue#374273(55, 66, 115)Subtle accents, borders

Fonts

FontUsageGoogle Fonts
Playfair DisplayDisplay headings, slide titlesYes (available in Google Slides)
MontserratBody text, descriptions, bulletsYes (available in Google Slides)
Libre BaskervilleAccent text, quotes, calloutsYes (available in Google Slides)

Font Sizing Guidelines

ElementGoogle SlidesGoogle Docs
Main title36-44pt Playfair Display24-28pt Playfair Display
Subtitle18-24pt Montserrat16-18pt Montserrat
Section heading24-28pt Playfair Display18-20pt Playfair Display
Body text14-16pt Montserrat11-12pt Montserrat
Caption/note10-12pt Libre Baskerville9-10pt Libre Baskerville
Footer8-10pt Montserrat8pt Montserrat

3. Slide Layouts (Google Slides — 16:9)

Proposal Template Slides

#LayoutBackgroundKey Elements
1Title SlideNavy gradientLogo (top-left), {{CLIENT_NAME}} (center), {{PROPOSAL_DATE}} (bottom), copper accent line
2About SolanasisParchmentLogo, company overview, {{CONSULTANT}} bio snippet
3Challenge / Why NowNavyIndustry-specific challenge text, {{INDUSTRY}} reference
4Proposed SolutionParchment{{ENGAGEMENT_TYPE}} as heading, scope description cards
5MethodologyParchment/Navy splitProcess steps with icons
6TimelineParchmentPhase timeline graphic, milestones
7DeliverablesParchmentDeliverable cards with descriptions
8InvestmentNavy{{PRICING}} in copper, value propositions
9TeamParchment{{HEADSHOT}}, bio, qualifications
10Next Steps / CTANavyContact info, {{CONSULTANT}} name, meeting link

One-Pager Template (Google Docs)

Single page with:

  • Header: Logo + {{CLIENT_NAME}} + {{DATE}}
  • Left column: {{HEADSHOT}} + key qualifications
  • Right column: Service description, {{ENGAGEMENT_TYPE}}, value proposition
  • Footer: Contact info, Solanasis branding

Assessment Report Template (Google Docs)

SectionKey Placeholders
Cover pageLogo, {{CLIENT_NAME}}, {{REPORT_DATE}}, {{ENGAGEMENT_TYPE}}
Executive Summary{{EXECUTIVE_SUMMARY}}
Findings Table{{FINDINGS}} (or individual {{FINDING_N}} entries)
Recommendations{{RECOMMENDATIONS}}
Risk MatrixStatic template (risk levels are part of findings)
AppendixMethodology description, Solanasis background

4. Template Design Rules

  1. Placeholder visibility: Place placeholders in normal text boxes with visible text. Do NOT hide them in notes or comments — replaceAllText only works on visible content.

  2. One placeholder per text box (Slides): For best results, each {{PLACEHOLDER}} should be the only content in its text box if it represents a major content block. Inline placeholders (e.g., “Dear {{CLIENT_NAME}}”) work fine for short substitutions.

  3. Image placeholders (Slides): Create a text box of the desired image size, type the placeholder text (e.g., {{LOGO}}), and style it distinctively (e.g., red text) so it is obvious during design. The replaceAllShapesWithImage API replaces the entire text box with an image.

  4. No placeholder in headers/footers (Docs): Google Docs replaceAllText does NOT replace text in headers, footers, or footnotes. Place all placeholders in the document body.

  5. Test before deploying: After creating a template, test it with generate-doc.py --dry-run to verify all placeholders are recognized, then run a real generation to confirm formatting.

  6. Version templates: When updating a template, create a copy first. Store both IDs in template_ids.json (with the old one commented in a _deprecated field) until the new version is verified.

  7. Public image URLs required (Slides): Image URLs for replaceAllShapesWithImage must be publicly accessible from Google’s servers. URLs behind Cloudflare WAF/bot protection return 403. Workaround: Upload images to Google Drive, make them publicly shared, and use https://drive.google.com/uc?id=FILE_ID&export=download as the imageUrl.

  8. Text overflow for variable-length content (Slides): For Slides text boxes containing variable-length content (like {{EXECUTIVE_SUMMARY}}), enable “Shrink text on overflow” in the text box properties, or size the text box generously. Long content clips at the text box boundary by default.


5. Template Registration

After creating a template in Google Drive:

  1. Get the file ID from the Google Drive URL: https://docs.google.com/presentation/d/FILE_ID/edit
  2. Update solanasis-scripts/config/template_ids.json with the real file ID
  3. List all placeholders used in the template in the placeholders array
  4. Test with: secret run solanasis-scripts -- python generate-doc.py --dry-run TYPE --client "Test"

Last updated: 2026-04-11