GWS Template Design Specification
Guide for designing Google Slides and Google Docs templates that work with the
generate-doc.pydocument 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
| Placeholder | Description | Example Value |
|---|---|---|
{{CLIENT_NAME}} | Client/prospect name | Acme Corp |
{{PROPOSAL_DATE}} | Proposal date | April 11, 2026 |
{{REPORT_DATE}} | Report date | April 11, 2026 |
{{DATE}} | Generic date | April 11, 2026 |
{{CONSULTANT}} | Consultant name | Dmitri Zasage |
{{COMPANY_SIZE}} | Employee count | 50-200 |
{{INDUSTRY}} | Client industry | Healthcare |
{{ENGAGEMENT_TYPE}} | Service type | Operational 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)
| Placeholder | Description | Replacement Method |
|---|---|---|
{{LOGO}} | Company logo | replaceAllShapesWithImage with CENTER_INSIDE |
{{HEADSHOT}} | Consultant headshot | replaceAllShapesWithImage with CENTER_CROP |
{{CLIENT_LOGO}} | Client company logo | replaceAllShapesWithImage 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
| Name | Hex | RGB | Usage |
|---|---|---|---|
| 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
| Font | Usage | Google Fonts |
|---|---|---|
| Playfair Display | Display headings, slide titles | Yes (available in Google Slides) |
| Montserrat | Body text, descriptions, bullets | Yes (available in Google Slides) |
| Libre Baskerville | Accent text, quotes, callouts | Yes (available in Google Slides) |
Font Sizing Guidelines
| Element | Google Slides | Google Docs |
|---|---|---|
| Main title | 36-44pt Playfair Display | 24-28pt Playfair Display |
| Subtitle | 18-24pt Montserrat | 16-18pt Montserrat |
| Section heading | 24-28pt Playfair Display | 18-20pt Playfair Display |
| Body text | 14-16pt Montserrat | 11-12pt Montserrat |
| Caption/note | 10-12pt Libre Baskerville | 9-10pt Libre Baskerville |
| Footer | 8-10pt Montserrat | 8pt Montserrat |
3. Slide Layouts (Google Slides — 16:9)
Proposal Template Slides
| # | Layout | Background | Key Elements |
|---|---|---|---|
| 1 | Title Slide | Navy gradient | Logo (top-left), {{CLIENT_NAME}} (center), {{PROPOSAL_DATE}} (bottom), copper accent line |
| 2 | About Solanasis | Parchment | Logo, company overview, {{CONSULTANT}} bio snippet |
| 3 | Challenge / Why Now | Navy | Industry-specific challenge text, {{INDUSTRY}} reference |
| 4 | Proposed Solution | Parchment | {{ENGAGEMENT_TYPE}} as heading, scope description cards |
| 5 | Methodology | Parchment/Navy split | Process steps with icons |
| 6 | Timeline | Parchment | Phase timeline graphic, milestones |
| 7 | Deliverables | Parchment | Deliverable cards with descriptions |
| 8 | Investment | Navy | {{PRICING}} in copper, value propositions |
| 9 | Team | Parchment | {{HEADSHOT}}, bio, qualifications |
| 10 | Next Steps / CTA | Navy | Contact 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)
| Section | Key Placeholders |
|---|---|
| Cover page | Logo, {{CLIENT_NAME}}, {{REPORT_DATE}}, {{ENGAGEMENT_TYPE}} |
| Executive Summary | {{EXECUTIVE_SUMMARY}} |
| Findings Table | {{FINDINGS}} (or individual {{FINDING_N}} entries) |
| Recommendations | {{RECOMMENDATIONS}} |
| Risk Matrix | Static template (risk levels are part of findings) |
| Appendix | Methodology description, Solanasis background |
4. Template Design Rules
-
Placeholder visibility: Place placeholders in normal text boxes with visible text. Do NOT hide them in notes or comments —
replaceAllTextonly works on visible content. -
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. -
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. ThereplaceAllShapesWithImageAPI replaces the entire text box with an image. -
No placeholder in headers/footers (Docs): Google Docs
replaceAllTextdoes NOT replace text in headers, footers, or footnotes. Place all placeholders in the document body. -
Test before deploying: After creating a template, test it with
generate-doc.py --dry-runto verify all placeholders are recognized, then run a real generation to confirm formatting. -
Version templates: When updating a template, create a copy first. Store both IDs in
template_ids.json(with the old one commented in a_deprecatedfield) until the new version is verified. -
Public image URLs required (Slides): Image URLs for
replaceAllShapesWithImagemust 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 usehttps://drive.google.com/uc?id=FILE_ID&export=downloadas the imageUrl. -
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:
- Get the file ID from the Google Drive URL:
https://docs.google.com/presentation/d/FILE_ID/edit - Update
solanasis-scripts/config/template_ids.jsonwith the real file ID - List all placeholders used in the template in the
placeholdersarray - Test with:
secret run solanasis-scripts -- python generate-doc.py --dry-run TYPE --client "Test"
Last updated: 2026-04-11