Content Ideas Generator
Generates 15–25 content ideas mapped to B2B buying stages and content types.
When to Use
- User wants content calendar, ideation, or kanban backlog
- After ICP + personas exist for a service
- User specifies counts per type (e.g. 5 LinkedIn, 3 blog, 2 case study)
Prerequisites
Brand scope. In a multi-brand workspace (2+ brand homes in workspace/firm/brands/), every path this skill reads or writes is brand-scoped: definitional entities (services, ICP, personas, proof, channels) live in firm/brands/{brand}/…, working pipelines carry a {brand}/ segment under their entity root, and the working brand comes from the user's choice or B2BFORCE_BRAND — never guessed. Rules: Brand Scope Gate in AGENTS.md; paths: docs/WORKSPACE.md.
workspace/firm/profile.md
workspace/firm/services/{service-slug}.md
workspace/marketing/icp/{icp-slug}.md + at least one persona
- Optional APIs:
EXA_API_KEY (content landscape), DATAFORSEO_* (keywords), research for service-page opportunities
Hard gate: if the selected service has no linked ICP, or the ICP has no persona,
stop and run marketing-icp first. Do not invent ICP/persona context
inside the ideas prompt.
Run the central readiness check before generation:
scripts/validate-content-readiness.sh [service-slug] [icp-slug] [persona-slug]
Content types and stage rules
| content_type |
Allowed buying_stage |
| linkedin_post, x_post, blog_post |
all 5 stages |
| case_study |
decision, vendor only |
| landing_page |
vendor only |
| prospecting_sequence |
any (usually separate skill) |
Buying stages: problem → concept → education → decision → vendor
Details: references/buying-stages-and-types.md
Workflow
1. Build context
Assemble from workspace:
- Company: name, tagline, description, industry, brand_voice, specializations
- Service: name, type, challenges, features, outcomes, process, differentiators, fit_criteria
- ICP: target client company segment; pain_points, goals, trigger_events, buying_mode, messaging_angle, job_to_be_done, anti_fit_criteria
- Persona: decision maker or user; job_titles, seniority, pain_points, goals, content_formats, channels, objections
- Persona distribution: if user selects multiple personas, either generate a
separate batch per persona or assign explicit counts per persona; every idea
must carry one
persona slug.
- Exclusion list: firm profile section
existing_content, existing idea
titles, existing unique_angle, existing buyer_question, and user-provided
URLs/titles to avoid
- Content landscape: Exa search — top 10 articles on topic in last 12 months
(if API set). If no research API is used, mark ideas as
research_mode: dry_run.
2. Service page opportunity research (optional)
When landing_page count > 0 and user requests research:
Run service-page research — 5 queries:
competitors, landing_structure, objections, social_proof, cta_strategies
Optional DataForSEO keyword data.
Save research JSON to include in idea files for landing_page type only.
3. AI generation
System prompt: references/system-prompt.md. A buying-mode-aware appendix is always added on top; it tailors ideas to the ICP's buying_mode — reactive (problem/pain → urgent, problem-solving) vs proactive (challenge/opportunity → aspirational, growth-oriented), with mixed as the default. The ICP's buying_mode, messaging_angle, and market_research are passed in context for the AI to adapt.
User prompt includes:
- Count per type OR total count distributed across stages
- Language from firm context
- Existing ideas from
workspace/marketing/content/ideas/ as JSON (dedup)
- Dedupe against titles, buyer questions, unique angles, and problem framing,
not only exact title matches
- Big5 topic guidance where relevant (cost, problems, comparisons, alternatives, reviews)
- hook_type per idea: data | question | contrarian | specificity | problem | story
- Quality rubric per idea: buyer question, stage fit, service fit, proof source,
non-generic angle, next action
- Persona-aware distribution if more than one persona is selected
- Research mode:
market_informed only if Exa/DataForSEO/SERP/market context was
used; otherwise dry_run
- SEO discipline:
target_keyword only for blog_post and landing_page; set
it empty/null for LinkedIn, X, case study, and prospecting
- Proof discipline:
- do not invent client names, metrics, page counts, revenue numbers, or research claims;
- use specific numbers only when they exist in firm/service/proof context;
- if
case_study is requested and no real proof exists, create the idea with
a [Client] placeholder and proof_source: needs real client proof before draft;
- never generate a case study draft from a placeholder proof idea.
Output schema: references/output-schema.md
Generate batch ID: batch-{YYYY-MM-DD}-{uuid-short} — same ID in all idea files from this run.
4. Write workspace outputs
One file per idea:
workspace/marketing/content/ideas/{content_type}--{buying_stage}--{slug}.md
Keep all ideas in one folder. Do not create type subfolders. The filename is a
human scanning index for large backlogs; frontmatter remains the source of truth.
---
title:
content_type: blog_post
buying_stage: problem
status: new
language: en
service: {slug}
icp: {slug}
persona: {slug}
buyer_question:
big5_topic: problems # optional: cost|problems|comparisons|alternatives|reviews
target_keyword: # optional, from SEO research
generation_batch: batch-2026-06-01-abc123
competitive_research: false # landing_page only — path to research file if saved
hook_type: data # metadata for quality (optional in frontmatter)
unique_angle:
proof_source:
next_action:
recommended_next_skill: marketing-content-blog-post
research_mode: dry_run
---
Description body: 2–3 sentences on content angle.
If landing_page with research, also write:
workspace/marketing/content/ideas/{content_type}--{buying_stage}--{slug}-research.json
5. Default distribution (if user doesn't specify)
Channel registry first. If workspace/marketing/channels/ (multi-brand:
firm/brands/{brand}/channels/) holds channel files, they decide distribution: enable only
the content types some active channel lists in content_types, and size
counts to the channels' schedule lines — a channel posting once a week does not
need five ideas a week. Read each channel's body ("what to publish here") as
context for the angles proposed. Rules: docs/content-generation.md,
"Distribution channels".
Fallback (no channel files). Only content types that are enabled are
generated. By default just three are enabled: LinkedIn×5, X×5, blog×3
(≈13 ideas). case_study has a default count of 2 and
landing_page/prospecting_sequence default to 0, but those are off by
default — they are only generated if the user enables them. The legacy
"total count" mode (no per-type counts) defaults to 20 ideas spread across all
5 stages.
Quality rules
- Titles must use hook patterns (data, question, contrarian, specificity, problem, story)
- Avoid generic titles ("Complete Guide to X", "10 Best Tips")
- Each idea needs unique_angle vs existing ideas and content landscape
- Match content type to buying stage restrictions
- Early stages → educational; late stages → comparison/proof
- No fabricated proof: specific metrics, client names, research claims, and case
study facts must come from workspace context or be marked as needing real proof.
- Every idea must include
buyer_question, next_action, recommended_next_skill,
and research_mode.
- Run
scripts/validate-content-ideas.sh after writing ideas; fix any failures
before generating drafts.
Related Skills
| Skill |
When |
marketing-icp |
Missing ICP |
marketing-content-blog-post etc. |
Generate draft from approved idea |
marketing-service-page |
Create service page from a landing_page opportunity |
1---2name: marketing-content-ideas3description: Generate B2B content ideas across buying stages and content types (blog, LinkedIn, X, case study, service-page opportunity). Use when planning a content calendar from ICP and service context. Requires firm profile, service, ICP, and persona files. For writing drafts use marketing-content-* skills per type.4license: MIT5---67# Content Ideas Generator89Generates **15–25 content ideas** mapped to B2B buying stages and content types.1011## When to Use1213- User wants content calendar, ideation, or kanban backlog14- After ICP + personas exist for a service15- User specifies counts per type (e.g. 5 LinkedIn, 3 blog, 2 case study)1617## Prerequisites1819**Brand scope.** In a multi-brand workspace (2+ brand homes in `workspace/firm/brands/`), every path this skill reads or writes is brand-scoped: definitional entities (services, ICP, personas, proof, channels) live in `firm/brands/{brand}/…`, working pipelines carry a `{brand}/` segment under their entity root, and the working brand comes from the user's choice or `B2BFORCE_BRAND` — never guessed. Rules: Brand Scope Gate in `AGENTS.md`; paths: `docs/WORKSPACE.md`.20211. `workspace/firm/profile.md`222. `workspace/firm/services/{service-slug}.md`233. `workspace/marketing/icp/{icp-slug}.md` + at least one persona244. Optional APIs: `EXA_API_KEY` (content landscape), `DATAFORSEO_*` (keywords), research for service-page opportunities2526Hard gate: if the selected service has no linked ICP, or the ICP has no persona,27stop and run `marketing-icp` first. Do not invent ICP/persona context28inside the ideas prompt.2930Run the central readiness check before generation:3132```bash33scripts/validate-content-readiness.sh [service-slug] [icp-slug] [persona-slug]34```3536## Content types and stage rules3738| content_type | Allowed buying_stage |39|--------------|---------------------|40| linkedin_post, x_post, blog_post | all 5 stages |41| case_study | decision, vendor only |42| landing_page | vendor only |43| prospecting_sequence | any (usually separate skill) |4445**Buying stages:** problem → concept → education → decision → vendor4647Details: `references/buying-stages-and-types.md`4849## Workflow5051### 1. Build context5253Assemble from workspace:5455- **Company:** name, tagline, description, industry, brand_voice, specializations56- **Service:** name, type, challenges, features, outcomes, process, differentiators, fit_criteria57- **ICP:** target client company segment; pain_points, goals, trigger_events, buying_mode, messaging_angle, job_to_be_done, anti_fit_criteria58- **Persona:** decision maker or user; job_titles, seniority, pain_points, goals, content_formats, channels, objections59- **Persona distribution:** if user selects multiple personas, either generate a60 separate batch per persona or assign explicit counts per persona; every idea61 must carry one `persona` slug.62- **Exclusion list:** firm profile section `existing_content`, existing idea63 titles, existing `unique_angle`, existing `buyer_question`, and user-provided64 URLs/titles to avoid65- **Content landscape:** Exa search — top 10 articles on topic in last 12 months66 (if API set). If no research API is used, mark ideas as `research_mode: dry_run`.6768### 2. Service page opportunity research (optional)6970When `landing_page` count > 0 and user requests research:7172Run service-page research — 5 queries:7374competitors, landing_structure, objections, social_proof, cta_strategies7576Optional DataForSEO keyword data.7778Save research JSON to include in idea files for landing_page type only.7980### 3. AI generation8182**System prompt:** `references/system-prompt.md`. A buying-mode-aware appendix is always added on top; it tailors ideas to the ICP's `buying_mode` — `reactive` (problem/pain → urgent, problem-solving) vs `proactive` (challenge/opportunity → aspirational, growth-oriented), with `mixed` as the default. The ICP's `buying_mode`, `messaging_angle`, and `market_research` are passed in context for the AI to adapt.8384**User prompt includes:**8586- Count per type OR total count distributed across stages87- Language from firm context88- Existing ideas from `workspace/marketing/content/ideas/` as JSON (dedup)89- Dedupe against titles, buyer questions, unique angles, and problem framing,90 not only exact title matches91- Big5 topic guidance where relevant (cost, problems, comparisons, alternatives, reviews)92- hook_type per idea: data | question | contrarian | specificity | problem | story93- Quality rubric per idea: buyer question, stage fit, service fit, proof source,94 non-generic angle, next action95- Persona-aware distribution if more than one persona is selected96- Research mode: `market_informed` only if Exa/DataForSEO/SERP/market context was97 used; otherwise `dry_run`98- SEO discipline: `target_keyword` only for `blog_post` and `landing_page`; set99 it empty/null for LinkedIn, X, case study, and prospecting100- Proof discipline:101 - do not invent client names, metrics, page counts, revenue numbers, or research claims;102 - use specific numbers only when they exist in firm/service/proof context;103 - if `case_study` is requested and no real proof exists, create the idea with104 a `[Client]` placeholder and `proof_source: needs real client proof before draft`;105 - never generate a case study draft from a placeholder proof idea.106107**Output schema:** `references/output-schema.md`108109Generate batch ID: `batch-{YYYY-MM-DD}-{uuid-short}` — same ID in all idea files from this run.110111### 4. Write workspace outputs112113One file per idea:114115`workspace/marketing/content/ideas/{content_type}--{buying_stage}--{slug}.md`116117Keep all ideas in one folder. Do not create type subfolders. The filename is a118human scanning index for large backlogs; frontmatter remains the source of truth.119120```yaml121---122title:123content_type: blog_post124buying_stage: problem125status: new126language: en127service: {slug}128icp: {slug}129persona: {slug}130buyer_question:131big5_topic: problems # optional: cost|problems|comparisons|alternatives|reviews132target_keyword: # optional, from SEO research133generation_batch: batch-2026-06-01-abc123134competitive_research: false # landing_page only — path to research file if saved135hook_type: data # metadata for quality (optional in frontmatter)136unique_angle:137proof_source:138next_action:139recommended_next_skill: marketing-content-blog-post140research_mode: dry_run141---142```143144Description body: 2–3 sentences on content angle.145146If landing_page with research, also write:147`workspace/marketing/content/ideas/{content_type}--{buying_stage}--{slug}-research.json`148149### 5. Default distribution (if user doesn't specify)150151**Channel registry first.** If `workspace/marketing/channels/` (multi-brand:152`firm/brands/{brand}/channels/`) holds channel files, they decide distribution: enable only153the content types some **active** channel lists in `content_types`, and size154counts to the channels' `schedule` lines — a channel posting once a week does not155need five ideas a week. Read each channel's body ("what to publish here") as156context for the angles proposed. Rules: `docs/content-generation.md`,157"Distribution channels".158159**Fallback (no channel files).** Only content types that are **enabled** are160generated. By default just three are enabled: **LinkedIn×5, X×5, blog×3**161(≈13 ideas). `case_study` has a default count of 2 and162`landing_page`/`prospecting_sequence` default to 0, but those are **off by163default** — they are only generated if the user enables them. The legacy164"total count" mode (no per-type counts) defaults to 20 ideas spread across all1655 stages.166167## Quality rules168169- Titles must use hook patterns (data, question, contrarian, specificity, problem, story)170- Avoid generic titles ("Complete Guide to X", "10 Best Tips")171- Each idea needs unique_angle vs existing ideas and content landscape172- Match content type to buying stage restrictions173- Early stages → educational; late stages → comparison/proof174- No fabricated proof: specific metrics, client names, research claims, and case175 study facts must come from workspace context or be marked as needing real proof.176- Every idea must include `buyer_question`, `next_action`, `recommended_next_skill`,177 and `research_mode`.178- Run `scripts/validate-content-ideas.sh` after writing ideas; fix any failures179 before generating drafts.180181## Related Skills182183| Skill | When |184|-------|------|185| `marketing-icp` | Missing ICP |186| `marketing-content-blog-post` etc. | Generate draft from approved idea |187| `marketing-service-page` | Create service page from a `landing_page` opportunity |