one-pager
/octave:one-pager - Personalized One-Pager Builder
Generate personalized, self-contained HTML one-pager documents (leave-behinds) powered by your Octave GTM knowledge base. Unlike generic templates, this skill enriches every section with real account intelligence -- company signals, persona pain points, playbook messaging, and proof points -- to create a document that feels written specifically for the recipient.
One-pagers are single scrollable pages designed to be sent after a demo, meeting, or call. They summarize why your product is a fit for this specific account. Think of it as the document you email or print, not present.
Usage
/octave:one-pager <target> [--for <occasion>] [--style <preset>]
Examples
/octave:one-pager acme.com # General one-pager for Acme
/octave:one-pager jane@acme.com --for demo-followup # Post-demo leave-behind
/octave:one-pager acme.com --for discovery # Post-discovery summary
/octave:one-pager "enterprise healthcare segment" # Segment-level one-pager
/octave:one-pager acme.com --for renewal --style soft-light # Renewal doc with specific style
/octave:one-pager jane@acme.com --for event-followup # Post-conference/event follow-up
Occasions
| Occasion | Output Focus |
|---|---|
demo-followup |
Recap what was shown, reinforce value, clear next steps |
discovery |
Summarize pain points heard, position solution fit |
intro |
General company intro tailored to the account (default) |
event-followup |
Post-conference/event personalized summary |
renewal |
Reinforce value delivered, expansion opportunities |
Instructions
When the user runs /octave:one-pager:
Step 1: Understand the Context
If not provided via flags, ask the user interactively:
Target -- "Who is this for?"
Who is this one-pager for?
Provide any of the following:
- Company domain (e.g., acme.com)
- Person email (e.g., jane@acme.com)
- Segment description (e.g., "enterprise healthcare")
Target:
Occasion -- "What's the context?"
What's the occasion for this one-pager?
1. Demo follow-up - Sent after a product demo
2. Discovery follow-up - Sent after a discovery call
3. General intro - First touch or general positioning
4. Event follow-up - Sent after a conference/event meeting
5. Renewal - Reinforcing value for an existing customer
Your choice:
Tone -- "What tone should it strike?"
What tone fits best?
1. Formal executive - Polished, concise, boardroom-ready
2. Conversational - Warm, approachable, peer-to-peer
3. Technical - Data-driven, detailed, practitioner-focused
Your choice:
Step 2: Octave Context Gathering
Based on target, occasion, and tone, use Octave MCP tools to build rich context for the one-pager. Always tell the user what you're researching and why.
Call as many tools as needed to build a complete picture. The best one-pagers come from layering multiple sources -- company enrichment + playbook messaging + proof points + conversation intel all combine to create a document that feels genuinely personalized. Don't stop at one tool when three would give you a stronger narrative.
That said, not every tool applies to every one-pager. Use your judgment about which are relevant to this specific situation. The tables below show what's available -- pick the combination that gives you the richest context for the occasion and target.
List vs Search -- when to use which:
| Tool | Purpose | Use when... |
|---|---|---|
list_all_entities({ entityType }) |
Fetch all entities of a type (minimal fields) | You want a quick inventory -- "show me all our playbooks" |
list_entities({ entityType }) |
Fetch entities with full data (paginated) | You need the actual content -- "get full proof point details" |
get_entity({ oId }) |
Deep dive on one specific entity | You found something relevant and need the complete picture |
search_knowledge_base({ query }) |
Semantic search across library + resources | You have a concept or question -- "how do we position for healthcare?" |
list_resources() / search_resources({ query }) |
Uploaded docs, URLs, Google Drive files | You need reference material, uploaded assets, or source docs |
Rule of thumb: Use list_* when you know what type of thing you want. Use search_* when you know what topic you're looking for.
Follow-up one-pagers -- ground them in what actually happened:
If this one-pager follows a previous interaction (demo, discovery call, event meeting), pull findings and events to anchor the narrative in real data rather than generic positioning:
list_findings({ query: "<company or contact>", startDate: "<relevant period>" })-- surfaces what was actually said in calls: objections raised, features requested, pain points confirmed, competitor mentionslist_events({ filters: { accounts: ["<account_oId>"] } })-- deal stage changes, meetings held, emails sent -- shows the journey so farget_event_detail({ eventOId })-- deep dive on specific events (e.g., the demo, the discovery call) to pull exact context
This turns a generic "here's why we're a fit" document into "here's what we heard from you, and here's how we address it" -- much more compelling for the recipient.
For Account-Specific One-Pagers
Start with company and person enrichment, then pull positioning context:
| What you need | Tool | When to use |
|---|---|---|
| Company profile | enrich_company({ companyDomain }) |
Almost always -- gives industry, size, tech stack, signals |
| Person deep-dive | enrich_person({ person: { email, firstName, lastName, companyDomain } }) |
When a specific person is the recipient |
| Key contacts | find_person({ searchMode: "people", companyDomain, fuzzyTitles }) |
When you need to identify the right stakeholder(s) |
| ICP fit scoring | qualify_company({ companyDomain }) |
When you need to frame "why us" for this account |
| Matching playbook | search_knowledge_base({ query: "<industry> <persona>", entityTypes: ["playbook"] }) |
To find the best-fit messaging framework |
| Playbook + value props | get_playbook({ oId, includeValueProps: true }) |
After finding a relevant playbook -- gets full content + value props |
| Value props | list_value_props({ playbookOId }) |
Fetch value props for a specific playbook |
| Proof points | list_entities({ entityType: "proof_point" }) |
Fetch proof points with full data -- metrics, quotes, logos |
| References | list_entities({ entityType: "reference" }) |
Fetch customer references with full details |
| Topic-specific proof | search_knowledge_base({ query: "<industry> results", entityTypes: ["proof_point", "reference"] }) |
When you need proof points about a specific topic or industry |
| Competitive context | search_knowledge_base({ query: "<signals>", entityTypes: ["competitor"] }) |
When competitor is mentioned or likely in the deal |
| Recent intel | list_findings({ query: "<company>", startDate: "<90 days ago>" }) |
Conversation-based insights for follow-up docs |
| Deal events | list_events({ filters: { accounts: ["<account_oId>"] } }) |
Deal progression for follow-up context |
| Event details | get_event_detail({ eventOId }) |
Deep dive on specific interactions |
| Synthesized prep | generate_call_prep({ companyDomain }) |
When you want a single comprehensive brief to work from |
| Uploaded assets | search_resources({ query: "<topic>" }) |
Relevant uploaded docs or reference materials |
For Segment-Level One-Pagers
When the target is a segment description rather than a specific company:
| What you need | Tool | When to use |
|---|---|---|
| Matching playbook | search_knowledge_base({ query: "<segment description>", entityTypes: ["playbook"] }) |
Find the playbook for this segment |
| Playbook + value props | get_playbook({ oId, includeValueProps: true }) |
Full messaging framework for the segment |
| Personas | list_entities({ entityType: "persona" }) |
Understand who the typical buyer is in this segment |
| Segments | list_all_entities({ entityType: "segment" }) |
Quick scan to match the description to a defined segment |
| Proof points | list_entities({ entityType: "proof_point" }) |
Fetch proof points relevant to this segment |
| References | list_entities({ entityType: "reference" }) |
Customer references in this segment |
| Products | list_entities({ entityType: "product" }) |
Product capabilities relevant to segment needs |
| Use cases | list_all_entities({ entityType: "use_case" }) |
Use cases that resonate with this segment |
| Uploaded resources | search_resources({ query: "<segment topic>" }) |
Relevant uploaded collateral |
Output of this step: Present a content outline to the user for approval:
ONE-PAGER OUTLINE: [Title]
===========================
Target: [Company / Person / Segment]
Occasion: [Demo follow-up / Discovery / Intro / Event / Renewal]
Tone: [Formal / Conversational / Technical]
---
PROPOSED SECTIONS
-----------------
1. HEADER
- "Prepared for [Company]"
- Date, your company logo
2. THE CHALLENGE
- [Pain point 1 from enrichment/findings]
- [Pain point 2 from enrichment/findings]
3. OUR APPROACH
- [Value prop 1 from playbook, tailored]
- [Value prop 2 from playbook, tailored]
- [Value prop 3 from playbook, tailored]
4. KEY DIFFERENTIATORS
- [Differentiator 1 — brief description]
- [Differentiator 2 — brief description]
- [Differentiator 3 — brief description]
5. PROOF POINTS
- [Customer result / metric 1]
- [Customer result / metric 2]
- [Quote or reference if available]
6. NEXT STEPS
- [CTA based on occasion]
- Contact info
---
Octave Sources Used:
- Company profile: [Company name] — [key insights]
- Playbook: [Playbook name] — [messaging angle]
- Proof points: [N] references pulled
- Findings: [N] recent signals (if follow-up)
---
Does this outline look good? I can:
1. Proceed to style selection and generation
2. Add or remove sections
3. Change the messaging angle
4. Adjust the tone or emphasis
Wait for user approval before proceeding.
Step 3: Style Selection
One-pagers use the same 12 style presets and brand extraction system as the deck skill. See STYLE_PRESETS.md for full CSS variable definitions.
Ask the user:
How would you like to style the one-pager?
1. Pick from presets — 12 styles from dark executive to light minimal
2. Use my brand — extract from my website or provide brand assets
3. Auto-pick — I'll choose based on the occasion and tone
4. Surprise me
Your choice:
Option 1: Preset Picker -- Show the same preset table from the deck skill (see /octave:deck Step 4, Option 2).
Option 2: Brand Extraction -- Follow the same brand discovery flow from the deck skill (see /octave:deck Step 3). Supports browser-use tier, WebFetch tier, and manual fallback. Confirm brand config with user before proceeding.
Option 3: Auto-Pick -- Map occasion + tone to recommended presets:
| Occasion + Tone | Recommended Preset |
|---|---|
| Demo follow-up, formal | midnight-pro |
| Demo follow-up, conversational | soft-light |
| Discovery, formal | executive-dark |
| Discovery, conversational | swiss-modern |
| Intro, formal | midnight-pro |
| Intro, conversational | soft-light |
| Intro, technical | electric-studio |
| Event follow-up | aurora-gradient |
| Renewal, formal | executive-dark |
| Renewal, conversational | soft-light |
Tell the user what you picked and why. Let them override.
Step 4: Generate HTML
Build a single, self-contained HTML file. No external dependencies except Google Fonts. This is a single scrollable document -- NOT slides.
Output Directory
Every one-pager gets its own folder under .octave-one-pagers/:
.octave-one-pagers/
└── <kebab-case-name>-<YYYY-MM-DD>/
└── <name>.html
Example: /octave:one-pager acme.com produces .octave-one-pagers/acme-one-pager-2026-02-11/acme-one-pager.html
The entire .octave-one-pagers/ directory is in .gitignore -- nothing here gets committed.
HTML Architecture
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[One-Pager Title]</title>
<!-- Google Fonts (preconnect + stylesheet) -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=[fonts]&display=swap" rel="stylesheet">
<style>
/* === CSS Variables (from chosen preset) === */
:root { ... }
/* === Reset & Base === */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--font-body);
background: var(--bg);
color: var(--text-primary);
line-height: 1.6;
}
/* === Page Container (narrower than deck) === */
.page {
max-width: 800px;
margin: 0 auto;
padding: clamp(2rem, 5vw, 4rem) clamp(1.5rem, 4vw, 3rem);
}
/* === Typography (all clamp-based) === */
.heading-1 { font-size: clamp(1.75rem, 4vw, 2.75rem); }
.heading-2 { font-size: clamp(1.25rem, 2.5vw, 1.75rem); }
.heading-3 { font-size: clamp(1rem, 1.8vw, 1.25rem); }
.body-text { font-size: clamp(0.875rem, 1.3vw, 1rem); }
.body-sm { font-size: clamp(0.75rem, 1.1vw, 0.875rem); }
/* === Section Spacing === */
.section { margin-bottom: clamp(2rem, 4vh, 3rem); }
.section-title {
font-family: var(--font-display);
color: var(--brand-primary);
margin-bottom: clamp(0.75rem, 1.5vh, 1.25rem);
}
/* === Components === */
.card { ... }
.metric-card { ... }
.proof-quote { ... }
.cta-block { ... }
.divider { ... }
/* === Print Styles === */
@media print {
body { background: white; color: #1a1a1a; }
.page { max-width: 100%; padding: 0.5in; }
.card { break-inside: avoid; border: 1px solid #e5e5e5; }
.section { break-inside: avoid; }
a { color: inherit; text-decoration: underline; }
}
/* === Responsive === */
@media (max-width: 600px) {
.grid-3 { grid-template-columns: 1fr; }
.grid-2 { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<div class="page">
<!-- Header -->
<!-- The Challenge -->
<!-- Our Approach -->
<!-- Key Differentiators -->
<!-- Proof Points -->
<!-- Next Steps -->
</div>
</body>
</html>
Key differences from the deck skill's HTML:
- No scroll snap -- natural scrolling, single continuous page
- No navigation dots or progress bar -- not a presentation
- No slide-level animations -- subtle entrance animations are fine, but no Intersection Observer per-section
- Narrower container --
max-width: 800px(vs deck's 1100px) - Print-friendly -- includes
@media printstyles for PDF/print output - No
overflow: hiddensections -- content flows naturally
Document Sections
Header:
<header class="section header">
<!-- Logo if available (from brand extraction or Octave workspace) -->
<img src="[logo-url]" alt="[Company]" class="logo" />
<h1 class="heading-1">[Document Title]</h1>
<p class="body-text text-secondary">Prepared for [Target Company] | [Date]</p>
</header>
The Challenge:
<section class="section">
<h2 class="heading-2 section-title">The Challenge</h2>
<p class="body-text">
[2-3 sentences about their pain points, drawn from enrichment data,
findings, or persona pain points. Specific to this account.]
</p>
</section>
Our Approach:
<section class="section">
<h2 class="heading-2 section-title">Our Approach</h2>
<div class="value-props">
<div class="value-prop">
<h3 class="heading-3">[Value Prop Headline]</h3>
<p class="body-text text-secondary">[1-2 sentences tailored to their situation]</p>
</div>
<!-- Repeat for 3-4 value props -->
</div>
</section>
Key Differentiators:
<section class="section">
<h2 class="heading-2 section-title">Why [Your Company]</h2>
<div class="grid-3">
<div class="card">
<h3 class="heading-3">[Differentiator]</h3>
<p class="body-sm text-secondary">[1-2 sentences]</p>
</div>
<!-- 3 cards max -->
</div>
</section>
Proof Points:
<section class="section">
<h2 class="heading-2 section-title">Results</h2>
<div class="proof-points">
<div class="metric-card">
<span class="big-number">[Metric Value]</span>
<span class="body-sm text-secondary">[Metric Label]</span>
</div>
<!-- 2-3 metrics or quotes -->
</div>
<!-- Optional quote -->
<blockquote class="proof-quote">
"[Customer quote]"
<cite>-- [Name, Title, Company]</cite>
</blockquote>
</section>
Next Steps:
<section class="section cta-block">
<h2 class="heading-2 section-title">Next Steps</h2>
<p class="body-text">[Clear CTA based on occasion]</p>
<div class="contact-info">
<p class="body-sm">[Name] | [Email] | [Phone]</p>
<p class="body-sm">[Meeting link if available]</p>
</div>
</section>
Content Density Rules
Keep it tight. A one-pager should be scannable in under 2 minutes:
| Section | Max Content |
|---|---|
| Header | Company name + title + date + "Prepared for" |
| The Challenge | 2-3 sentences max |
| Our Approach | 3-4 value props, each 1-2 sentences |
| Key Differentiators | 3 cards max, each heading + 1-2 sentences |
| Proof Points | 2-3 metrics or quotes |
| Next Steps | 1 CTA + contact info |
If content exceeds these limits, prioritize ruthlessly. The one-pager is a teaser, not a whitepaper.
Step 5: Delivery
After generating the HTML file:
- Open the one-pager in the default browser
- Present a summary:
ONE-PAGER READY
================
Folder: .octave-one-pagers/<name>-<date>/
File: .octave-one-pagers/<name>-<date>/<name>.html
Style: [Preset name or "Custom Brand"]
Size: [file size]
Viewing:
- Open in any browser -- single scrollable page
- Print-friendly -- Cmd+P / Ctrl+P for clean printout
- Email as attachment or save as PDF
Customization tips:
- Colors: Edit the :root CSS variables at the top of the file
- Content: Each <section class="section"> is one block
- Fonts: Change the Google Fonts <link> and font-family values
- Layout: Adjust max-width in .page for wider/narrower output
---
Want me to:
1. Adjust content or messaging
2. Change the style/colors
3. Export as PDF (print dialog)
4. Create a version for a different contact at the same company
5. Create a full presentation deck for this account (/octave:deck)
6. Done
MCP Tools Used
Research & Enrichment
enrich_company- Full company intelligence profileenrich_person- Full person intelligence reportfind_person- Find contacts at a company by title/rolequalify_company- ICP fit scoring for a companyqualify_person- ICP fit scoring for a personfind_company- Find companies matching criteria
Library -- Fetching Entities
list_all_entities- Quick scan of all entities of a type (minimal fields, no pagination)list_entities- Fetch entities with full data and pagination (proof points, references, personas, etc.)get_entity- Deep dive on one specific entityget_playbook- Retrieve a playbook with full content and value propslist_value_props- Value propositions for a specific playbook
Library -- Searching
search_knowledge_base- Semantic search across library entities and resourceslist_resources- Browse uploaded docs, URLs, and Google Drive filessearch_resources- Semantic search across uploaded resources
Intelligence & Signals
list_findings- Recent conversation findings and insightslist_events- Deal events (won, lost, created, etc.)get_event_detail- Full details for a specific event
Content Generation
generate_call_prep- Synthesized prep brief for accountsgenerate_content- Generate positioning or messaging content
Brand & Style
list_brand_voices- Available brand voices in workspacelist_writing_styles- Available writing styles in workspace
Error Handling
Octave Connection Failed:
Could not connect to your Octave workspace.
The one-pager builder can still work without Octave -- you'll provide the content manually, and I'll handle structure, style, and HTML generation.
To reconnect: check your MCP configuration or run
/octave:workspace status
Company/Person Not Found:
I couldn't find detailed intelligence for [target].
Options:
- Proceed with what we have -- I'll use general positioning from your library
- Try a different domain or email
- Provide the content manually and I'll build the one-pager
No Matching Playbook:
No playbook matches this audience profile directly.
I'll use your general value props and positioning. After the one-pager is built, consider creating a playbook for this segment:
/octave:library create playbook
No Proof Points Available:
No proof points found matching this account's industry or segment.
Options:
- Proceed without the proof points section
- Use general proof points from your library
- Provide customer results manually and I'll format them
No Findings for Follow-Up:
No conversation findings found for [target] in the recent period.
This means I'll build the one-pager from enrichment data and library content rather than grounding it in specific past conversations. You can provide meeting notes or context manually if you have them.
Related Skills
/octave:deck- Full presentation deck (when one page isn't enough)/octave:research- Deeper research on the account/octave:brief- Internal account dossier (vs external leave-behind)/octave:proposal- Formal business case/octave:microsite- Personalized web page for ABM
More from octavehq/lfgtm
abm
Account-based planning with stakeholder mapping, persona matching, and coordinated outreach strategy. Use when user says "plan for [company]", "account plan", "stakeholder map", "ABM strategy", or mentions targeting a specific named company.
6brief
Account dossier and call prep document rendered as a scannable HTML reference page for internal use. Use when user says "brief me on [company]", "account dossier", "call prep doc", "background on [person]", or asks for an internal reference document. Do NOT use for customer-facing documents — use /octave:one-pager or /octave:proposal instead.
5proposal
Formal business case and proposal generator that produces customer-facing HTML documents with ROI framing and implementation details. Use when user says "create a proposal", "business case", "proposal for [company]", "formal pitch", or asks for a closing document.
5enablement
Generate sales enablement materials — cheat sheets, objection guides, discovery question banks, competitive sheets, and onboarding kits from your library. Use when user says "cheat sheet", "objection guide", "discovery questions", "onboarding kit", "enablement materials", or asks for quick-reference sales tools.
5microsite
Personalized ABM microsite builder that generates self-contained HTML landing pages using GTM intelligence. Use when user says "microsite for [company]", "personalized landing page", "ABM page", or asks for a personalized web page for a target account.
5prospector
Find, enrich, and qualify prospects against your library's ICP criteria. Use when user says "find prospects", "who should I target", "find VPs at [company]", "build a list", "prospect for", or asks to find people matching ICP. Do NOT use for single-account deep research — use /octave:research instead.
5