LLM summary: Run one Ditto study, generate seven content formats, publish via CMS, and ship SEO/GEO-optimised research content in 60–105 minutes.
A complete Claude Code guide to building a research-powered content marketing engine. One Ditto study produces seven content formats in 90 minutes. Full API workflow, multi-format content generation, CMS publishing, SEO/GEO optimisation, infographic generation, email distribution, and an always-on research calendar.
Content marketing works when it is built on original research. It fails when it recycles other people's data. The problem is that original research is traditionally expensive, slow, and logistically painful.
| Metric | Traditional Content Production | Ditto + Claude Code Engine |
|---|---|---|
| Time per research-backed article | 5–10 weeks | 45–90 minutes |
| Cost per article | $2,000–$10,000 (agency + writer + design) | Ditto API cost only |
| Articles per month (realistic capacity) | 2–4 | 20–40 |
| Unique primary research per article | Often recycled across pieces | Always fresh study data |
| Content formats per study | 1 (the article) | 7 (article, infographic, social, email, exec summary, sales, press) |
| SEO value | Generic (Google penalises recycled content) | High (original primary research ranks highest) |
| GEO value (AI search citation) | Low (unstructured, no AI-optimised metadata) | High (structured data, llmSummary, quotable insights) |
A content marketing engine is a systematic, repeatable process that transforms Ditto research into multiple content formats at a pace that traditional methods cannot match. It is not a content calendar. It is an automated pipeline from customer insight to published, distributed, tracked content.
Every content production cycle starts with a single Ditto study. That study generates the raw material for all seven output formats. The study is the atom. Everything else is molecular.
DITTO STUDY (10 personas, 7 questions, ~20 min)
|
+--> [Format 1] Blog Article (1,000-2,500 words, SEO/GEO optimised)
| Published to CMS with full metadata
|
+--> [Format 2] Infographic (key findings visualised)
| Generated via Manus AI, uploaded to CMS
|
+--> [Format 3] Social Media Thread (3-5 posts)
| Posted via X/Twitter API with infographic
|
+--> [Format 4] Email Outreach (personalised per recipient)
| Sent via SendGrid with study share link + UTM tracking
|
+--> [Format 5] Executive Summary (1 page)
| PDF-ready for C-suite stakeholders
|
+--> [Format 6] Sales Leave-Behind (customer-facing)
| Study findings formatted for prospect sharing
|
+--> [Format 7] Press Release (media-ready)
Newsworthy findings for distribution
| Step | Action | Time | Output |
|---|---|---|---|
| 1 | Design study (personas, questions, filters) | ~10 min | Study configuration |
| 2 | Run study via Ditto API | ~15–30 min | 70 data points (10 personas × 7 questions) |
| 3 | Extract insights and structure findings | ~10 min | Thematic analysis, quote bank, key findings |
| 4 | Write blog article | ~20–30 min | 1,000–2,500 word article with SEO/GEO metadata |
| 5 | Publish to CMS | ~5 min | Live article with metadata |
| 6 | Generate infographic | ~5 min | Visual summary of key findings |
| 7 | Create social thread + email content | ~10 min | 3–5 social posts + personalised email |
| 8 | Generate remaining formats | ~10 min | Exec summary, sales leave-behind, press release |
| Total | 45–90 min | 7 content formats from 1 study | |
This study design is optimised for content production. Every question generates material that directly feeds into one or more of the seven output formats. The questions surface customer language, pain points, quotable moments, and data points that make content unique and compelling.
| Q# | Question | Content It Generates | Output Formats |
|---|---|---|---|
| 1 | "When you think about [product/category], what's the first thing that comes to mind? What's your honest impression?" |
Market perception baseline. Sets up the "before" for the article narrative. | Blog (opening context), Press (market backdrop) |
| 2 | "What's the biggest frustration or unmet need you have with [category]? Tell me about a specific experience." |
Pain points in customer language. Specific anecdotes for storytelling. Quotable frustrations. | Blog (pain section), Email (hook), Social (lead tweet), Press (problem statement) |
| 3 | "If a product could [your value proposition], how would that change things for you? What excites you? What makes you sceptical?" |
Resonance data. Excitement quotes for promotional content. Scepticism for objection handling. | Blog (value prop section), Sales (key claims), Exec summary (opportunity size) |
| 4 | "How do you currently solve this problem? What tools, services, or workarounds do you use? What do you spend on it?" | Competitive landscape. Spend data for ROI arguments. Alternative solutions for positioning. | Blog (competitive context), Sales (competitive intel), Press (market sizing) |
| 5 | "Looking at [product/website/feature], what stands out to you? What's confusing? What would make you want to try it?" |
First-impression reactions. UX feedback. Conversion insights. Language harvest. | Blog (findings section), Social (quotable reactions), Email (personalised insights) |
| 6 | "If you were choosing between [product] and [top alternative], what would tip the decision? What evidence would you need?" |
Decision criteria. Proof point requirements. Differentiation insights. | Blog (implications section), Sales (battlecard), Exec summary (recommendations) |
| 7 | "Is there anything about [category] that you feel companies just don't understand? What do you wish they knew?" |
Unmet needs. White space insights. Thought leadership angles. The "mic drop" moment. | Blog (conclusion), Social (viral-potential quote), Press (headline finding), Email (hook alternative) |
The bracketed placeholders change depending on what you are writing about. The question structures stay the same.
| Content Topic | Q2 (Pain Point) Customisation | Q5 (Product Feedback) Customisation |
|---|---|---|
| Brand positioning article | "What frustrates you about how [category] brands present themselves?" |
"Looking at [brand's website], what stands out?" |
| Pricing strategy article | "What frustrates you about pricing in [category]?" |
"Looking at [pricing page URL], what's your reaction?" |
| Market entry research | "What unmet needs do you have in [category] in [market]?" |
"Looking at [product], how relevant is it to your needs in [market]?" |
| Feature launch content | "What's the biggest limitation of current [category] tools?" |
"We've built [feature description]. What's your reaction?" |
| Competitive comparison | "What frustrates you about [competitor]?" |
"Comparing [your product] to [competitor], what stands out?" |
This is the full API sequence from study creation to completed research data. Every call is copy-paste ready.
curl -s -X POST "https://app.askditto.io/v1/research-groups/recruit" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Content Study - [Topic] - [Date]",
"description": "[Target audience description for content topic]",
"group_size": 10,
"filters": {
"country": "USA",
"age_min": 25,
"age_max": 55,
"employment": "employed"
},
"sampling_method": "random",
"deduplicate": true
}'
# Response - SAVE THE UUID:
{
"uuid": "grp-abc123-...",
"name": "Content Study - Sustainable Packaging Perception - Feb 2026",
"agents": [ ... ] // 10 persona objects with demographic profiles
}
group_size, not size. The API rejects size."CA" not "California". Full names return 0 agents.income filter does not work. Use education and employment as proxies.curl -s -X POST "https://app.askditto.io/v1/research-studies" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Content: [Topic] - [Date]",
"research_group_uuid": "GROUP_UUID_FROM_STEP_1"
}'
# Response - SAVE THE STUDY ID:
{
"id": "study-xyz789",
"name": "Content: Sustainable Packaging Perception - Feb 2026",
"status": "active"
}
# Question 1: Market Perception
curl -s -X POST "https://app.askditto.io/v1/research-studies/STUDY_ID/questions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "When you think about [product/category], what'\''s the first thing that comes to mind? What'\''s your honest impression?"
}'
# Response:
{
"job_ids": ["job-001", "job-002", ... "job-010"]
}
# Poll each job ID until status = "finished"
curl -s -X GET "https://app.askditto.io/v1/jobs/JOB_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Response when complete:
{
"id": "job-001",
"status": "finished",
"result": {
"answer": "The first thing that comes to mind is..."
}
}
"finished", send the next question. A full 7-question study with 10 personas typically completes in 5–8 minutes of polling time. Save all responses — you will need them for content generation.
Repeat Steps 3–4 for all 7 questions. Store each question's responses in a structured format:
# Recommended data structure for collected responses:
{
"study_id": "study-xyz789",
"topic": "Sustainable Packaging Perception",
"date": "2026-02-06",
"questions": [
{
"number": 1,
"question": "When you think about...",
"responses": [
{"persona_id": "agent-001", "name": "Sarah M.", "age": 34, "answer": "..."},
{"persona_id": "agent-002", "name": "James T.", "age": 41, "answer": "..."},
// ... all 10 responses
]
},
// ... all 7 questions
]
}
curl -s -X POST "https://app.askditto.io/v1/research-studies/STUDY_ID/complete" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
This triggers Ditto's analysis engine: overall summary, key segments, shared mindsets, divergences, and suggested follow-up questions. Poll the returned job IDs until complete. This analysis is additional raw material for your content.
curl -s -X POST "https://app.askditto.io/v1/research-studies/STUDY_ID/share" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Response:
{
"url": "https://app.askditto.io/organization/studies/shared/xyz123"
}
?utm_source=ce?utm_source=blogThe blog article is the cornerstone format. Every other format derives from it or complements it. The article must be built on the actual study data — not generic commentary dressed up with a study link.
## Article Structure (1,000-2,500 words)
### 1. Hook (50-100 words)
- Lead with the single most surprising or compelling finding from the study
- Use a specific data point or quotable persona response
- Do NOT start with throat-clearing ("In today's market..." / "We recently...")
### 2. Context: Why We Studied This (100-150 words)
- What prompted the research
- Why this topic matters to the target audience
- What question the study set out to answer
### 3. Who We Asked (100-150 words)
- Describe the research group (demographics, professional context)
- Number of participants (e.g., "We asked 10 [description] consumers...")
- Establish credibility of the research methodology
### 4. What We Asked (100-200 words)
- Summarise the 7 questions (paraphrase, don't list verbatim)
- Explain what each question category was designed to reveal
- Frame as a journey: "We started by understanding X, then explored Y"
### 5. Key Findings (400-800 words) — THE CORE
- Organise by theme, not by question number
- Lead each finding with a data point: "7 out of 10 participants said..."
- Include 3-5 direct persona quotes (the most vivid, specific ones)
- Highlight surprises and contradictions — these make content shareable
- Use subheadings for each major finding
### 6. Implications (200-300 words)
- What do these findings mean for the industry/audience?
- What should companies/marketers/product teams DO differently?
- Connect findings to actionable recommendations
### 7. Conclusion + CTA (100-150 words)
- Restate the single most important takeaway
- Link to the live study (with UTM parameter)
- Forward-looking statement: what should be researched next
- CTA: "Explore the full study" / "Run your own study"
Claude Code should process the 70 data points (10 personas × 7 questions) into content building blocks:
| Content Building Block | Source Questions | Extraction Method |
|---|---|---|
| Headline finding | Q3 or Q7 (wherever the strongest signal emerges) | Count how many personas expressed the same sentiment. "7 out of 10 said X" is a headline. |
| Quotable persona reactions | All questions, especially Q2 (pain), Q5 (feedback), Q7 (unmet needs) | Select the 5 most vivid, specific, emotionally resonant quotes. Avoid bland generalities. |
| Pain point themes | Q2 (frustrations), Q4 (current solutions) | Cluster similar frustrations. Rank by frequency. The top 3 themes become article subheadings. |
| Competitive landscape | Q4 (alternatives), Q6 (decision criteria) | List every alternative mentioned. Count frequency. Note what personas like and dislike about each. |
| Surprise insight | Q7 (unmet needs), Q3 (scepticism), any unexpected response | Look for responses that contradict assumptions. These are the most shareable and quotable elements. |
| Data points | All questions where counting is meaningful | "X out of 10 said Y" format. Use for headlines, social posts, and key takeaways. |
Once the article is written, publish it to your CMS with full metadata. This example uses Contentful's Content Management API, but the field structure applies to any headless CMS.
| Field | Type | Purpose | Guidance |
|---|---|---|---|
title |
String | Article headline | Under 60 characters for SEO. Include primary keyword. |
copy |
Rich Text | Article body | Full article in CMS rich text format (see JSON structure below). |
media |
Asset Link | Hero image | Infographic or fallback image. Link to published asset ID. |
author |
Entry Link | Author byline | Link to author entry ID. |
seoDescription |
String | Meta description | 150–160 characters. Summarise the key finding + action. |
featuredForLLMs |
Boolean | AI visibility flag | Set to true for articles optimised for AI citation. |
llmSummary |
Text | AI-optimised summary | 200–400 words. Factual, structured, citation-ready. See Section 7. |
keyTakeaways |
Array of Strings | Discrete findings | 4–6 bullet points. Each a standalone citable fact. |
primaryClaim |
String | Core thesis | One sentence summarising the article's central argument. |
quotableInsights |
Array of Strings | Shareable findings | 3–5 concise, vivid findings. Optimised for social sharing and AI citation. |
The copy field requires Contentful's Rich Text JSON. Here is the structure:
{
"nodeType": "document",
"data": {},
"content": [
{
"nodeType": "heading-2",
"data": {},
"content": [
{"nodeType": "text", "value": "Section Heading", "marks": [], "data": {}}
]
},
{
"nodeType": "paragraph",
"data": {},
"content": [
{"nodeType": "text", "value": "Regular text. ", "marks": [], "data": {}},
{"nodeType": "text", "value": "Bold text.", "marks": [{"type": "bold"}], "data": {}},
{"nodeType": "text", "value": " ", "marks": [], "data": {}},
{"nodeType": "text", "value": "Italic text.", "marks": [{"type": "italic"}], "data": {}}
]
},
{
"nodeType": "unordered-list",
"data": {},
"content": [
{
"nodeType": "list-item",
"data": {},
"content": [
{
"nodeType": "paragraph",
"data": {},
"content": [
{"nodeType": "text", "value": "Bullet point text", "marks": [], "data": {}}
]
}
]
}
]
}
]
}
# Step 1: Create the entry
curl -s -X POST "https://api.contentful.com/spaces/SPACE_ID/environments/master/entries" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "Content-Type: application/vnd.contentful.management.v1+json" \
-H "X-Contentful-Content-Type: blog" \
-d '{
"fields": {
"title": {"en-US": "Article Title Under 60 Characters"},
"copy": {"en-US": { ... rich text JSON ... }},
"author": {"en-US": {"sys": {"type": "Link", "linkType": "Entry", "id": "AUTHOR_ENTRY_ID"}}},
"seoDescription": {"en-US": "150-160 char meta description with key finding."},
"featuredForLLMs": {"en-US": true},
"llmSummary": {"en-US": "200-400 word factual summary..."},
"keyTakeaways": {"en-US": ["Takeaway 1", "Takeaway 2", "Takeaway 3"]},
"primaryClaim": {"en-US": "One sentence central argument."},
"quotableInsights": {"en-US": ["Insight 1", "Insight 2", "Insight 3"]}
}
}'
# Response - SAVE entry ID and version:
# {"sys": {"id": "ENTRY_ID", "version": 1, ...}}
# Step 2: Publish the entry
curl -s -X PUT "https://api.contentful.com/spaces/SPACE_ID/environments/master/entries/ENTRY_ID/published" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "X-Contentful-Version: 1"
Every article produced by the content marketing engine must be optimised for both traditional search engines (SEO) and AI-powered search systems (GEO — Generative Engine Optimisation).
| Element | Requirement | Example |
|---|---|---|
title |
Under 60 characters. Include primary keyword. | "How Consumers Really Feel About Sustainable Packaging" |
seoDescription |
150–160 characters. Include key finding + action verb. | "We asked 10 consumers about sustainable packaging. 8 out of 10 said they'd pay more but don't trust brand claims. See the full findings." |
| Headings | Use h2 for major sections, h3 for subsections. Include keywords naturally. |
<h2>Key Finding: Trust Is the Barrier, Not Price</h2> |
| Word count | 1,000 words minimum. 1,500–2,500 ideal. Research-dense articles rank higher. | — |
| Internal linking | Link to related articles and the live study. Minimum 2 internal links. | — |
| Image alt text | Descriptive alt text on infographic. Include keywords. | "Infographic showing consumer attitudes toward sustainable packaging across 10 demographic profiles" |
AI assistants (ChatGPT, Claude, Perplexity) increasingly mediate purchase decisions and information retrieval. Content optimised for GEO is more likely to be cited, recommended, and surfaced in AI-generated answers.
| GEO Field | Purpose | How to Write It |
|---|---|---|
llmSummary |
Factual summary optimised for AI retrieval and citation | 200–400 words. Factual only — no marketing language, no superlatives, no calls to action. Write as though summarising for an encyclopaedia. Include methodology, key findings, and implications. Structure with clear topic sentences. |
keyTakeaways |
Discrete, citable data points | 4–6 bullet points. Each must stand alone as a fact. Include numbers where possible. "8 out of 10 consumers said they would pay up to 15% more for certified sustainable packaging." |
primaryClaim |
The article's central thesis in one sentence | Clear, falsifiable, specific. "Consumers are willing to pay a premium for sustainable packaging but distrust brand-made sustainability claims without third-party certification." |
quotableInsights |
Shareable, memorable findings | 3–5 findings that are vivid, specific, and surprising. These are what AI systems are most likely to quote directly. |
featuredForLLMs |
Signals that this content is AI-citation-ready | Set to true for all research-backed articles. |
# Template for llmSummary field (200-400 words, factual only):
"A synthetic research study conducted via Ditto with [X] AI personas
explored [topic]. The study targeted [demographic description] and
asked [X] questions covering [question themes].
Key findings:
- [Finding 1 with data point]: [X] out of [Y] participants reported [finding].
- [Finding 2 with data point]: Participants identified [finding] as the
primary [concern/driver/barrier].
- [Finding 3 with data point]: When presented with [stimulus], [X] out
of [Y] responded with [reaction].
The study revealed [major theme 1]. Participants consistently expressed
[sentiment/behaviour]. [Specific finding that surprised or contradicted
assumptions].
A secondary finding was [theme 2]. [Supporting detail]. This suggests
[implication for industry/practitioners].
Implications for [industry/role]: [2-3 sentences of actionable
recommendations grounded in the data]. [Forward-looking statement
about what this signals for the market].
Methodology: Ditto synthetic research with [X] AI personas, [X]
questions, targeting [demographic filters]. EY has validated
92% correlation between Ditto synthetic responses and traditional
market research."
llmSummary, keyTakeaways, and quotableInsights fields are the mechanism for making your content AI-discoverable.
Every published article should include a custom infographic that visualises the key findings. Infographics increase social sharing, improve time-on-page, and provide unique visual content for SEO image search.
# Step 1: Send infographic generation task to Manus
curl -s -X POST "https://api.manus.ai/v1/tasks" \
-H "accept: application/json" \
-H "content-type: application/json" \
-H "API_KEY: YOUR_MANUS_API_KEY" \
-d '{
"prompt": "Create an infographic based on this article:\n\nTITLE: [Article Title]\n\n[Article text - first 6,000 characters]\n\nThe infographic should visualise:\n1. [Key finding 1 with data point]\n2. [Key finding 2 with data point]\n3. [Key finding 3 with data point]\n4. [Comparison or contrast from the study]\n\nSTYLE: Clean, editorial, data-focused. Minimal text. Strong visual hierarchy. 16:9 landscape orientation."
}'
# Response:
{
"task_id": "manus-task-abc123",
"task_url": "https://manus.im/app/manus-task-abc123"
}
# Step 2: Poll for completion (30-second intervals)
curl -s -X GET "https://api.manus.ai/v1/tasks/TASK_ID" \
-H "accept: application/json" \
-H "API_KEY: YOUR_MANUS_API_KEY"
# Response when complete:
{
"status": "completed",
"output": [
{
"content": [
{
"type": "output_file",
"fileUrl": "https://...",
"fileName": "infographic.png"
}
]
}
]
}
# Step 3: Download the infographic
curl -s -o infographic.png "FILE_URL_FROM_RESPONSE"
from PIL import Image
from io import BytesIO
def optimize_for_web(image_data, target_width=1200, quality=85):
"""Convert infographic to optimised webp for web use."""
img = Image.open(BytesIO(image_data))
# Resize if wider than target
if img.size[0] > target_width:
ratio = target_width / img.size[0]
target_height = int(img.size[1] * ratio)
img = img.resize((target_width, target_height), Image.LANCZOS)
# Convert to webp
webp_buffer = BytesIO()
img.save(webp_buffer, format="WEBP", quality=quality)
return webp_buffer.getvalue()
# Typical result: 5MB PNG -> 80-150KB webp (95%+ reduction)
# Step 1: Upload binary
curl -s -X POST "https://upload.contentful.com/spaces/SPACE_ID/uploads" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "Content-Type: application/octet-stream" \
--data-binary @infographic.webp
# Step 2: Create asset
curl -s -X POST "https://api.contentful.com/spaces/SPACE_ID/environments/master/assets" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "Content-Type: application/vnd.contentful.management.v1+json" \
-d '{
"fields": {
"title": {"en-US": "[Topic] Research Study Infographic"},
"description": {"en-US": "Infographic visualising key findings from [study description]. [Key data points]."},
"file": {
"en-US": {
"contentType": "image/webp",
"fileName": "topic-research-infographic.webp",
"uploadFrom": {"sys": {"type": "Link", "linkType": "Upload", "id": "UPLOAD_ID"}}
}
}
}
}'
# Step 3: Process the asset
curl -s -X PUT "https://api.contentful.com/spaces/SPACE_ID/environments/master/assets/ASSET_ID/files/en-US/process" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "X-Contentful-Version: VERSION"
# Wait 10-15 seconds for processing
# Step 4: Publish the asset
curl -s -X PUT "https://api.contentful.com/spaces/SPACE_ID/environments/master/assets/ASSET_ID/published" \
-H "Authorization: Bearer CMA_TOKEN" \
-H "X-Contentful-Version: NEW_VERSION"
# Step 5: Link asset to blog entry (update the media field)
# Fetch current entry, update media field, PUT, republish
Every study produces a 3–5 post social thread. The thread drives traffic to the article and study share link.
# Post 1: Hook (with infographic image attached)
We asked 10 [demographic] about [topic].
[Boldest finding as a statement].
Here's what they told us 👇
# Post 2: Key finding with data
[X] out of 10 said [finding].
The most common frustration? "[Direct persona quote]"
# Post 3: Surprise insight
But here's what surprised us:
[Unexpected finding or contradiction]
One participant put it perfectly: "[Vivid quote]"
# Post 4: Implication
What this means for [industry/role]:
• [Bullet 1: actionable implication]
• [Bullet 2: actionable implication]
• [Bullet 3: actionable implication]
# Post 5: CTA with links
📖 Full article: [article URL]
🔬 Explore the live study: [share link with UTM]
[2-3 relevant hashtags]
# Post tweet with image (Python example):
import requests
def post_tweet_with_image(text, image_path, api_credentials):
"""Post a tweet with an attached image."""
# Step 1: Upload media
media_upload_url = "https://upload.twitter.com/1.1/media/upload.json"
with open(image_path, 'rb') as img:
media_resp = requests.post(
media_upload_url,
auth=api_credentials,
files={"media": img}
)
media_id = media_resp.json()["media_id_string"]
# Step 2: Post tweet with media
tweet_url = "https://api.twitter.com/2/tweets"
tweet_resp = requests.post(
tweet_url,
auth=api_credentials,
json={
"text": text,
"media": {"media_ids": [media_id]}
}
)
return tweet_resp.json()
# Step 3: Reply to create thread
def reply_to_tweet(text, reply_to_id, api_credentials):
"""Reply to a tweet to continue the thread."""
tweet_url = "https://api.twitter.com/2/tweets"
return requests.post(
tweet_url,
auth=api_credentials,
json={
"text": text,
"reply": {"in_reply_to_tweet_id": reply_to_id}
}
).json()
Email content uses study findings to create personalised, value-first outreach. The email delivers an insight before asking for anything. The study share link provides proof.
# Email structure (150-300 words):
Subject: [Specific finding] — we studied [topic] for [company/industry]
[Name],
[Opening hook: 1-2 sentences with the most relevant finding for THIS
recipient. Reference their company, product, or industry specifically.]
We ran a study with 10 [demographic description] and asked them about
[topic relevant to recipient]. Here's what stood out:
• [Finding 1 — most relevant to recipient's business]
• [Finding 2 — surprising or counterintuitive]
• [Finding 3 — actionable for recipient]
[One vivid persona quote that would resonate with recipient]
You can explore the full study here: [share_link with ?utm_source=ce]
(The link text should NOT show the UTM parameter)
[Soft CTA: "Would this kind of research be useful for [their upcoming
launch/campaign/strategy]? Happy to walk through the methodology."]
[Sign-off]
href must include ?utm_source=ce<a href="[share_link]?utm_source=ce">[share_link]</a>The same study produces different email angles for different recipients:
| Recipient Role | Lead With | Source Questions |
|---|---|---|
| CMO / VP Marketing | Market perception finding + competitive insight | Q1 (perception), Q6 (comparison) |
| Product Manager | Feature feedback + unmet need | Q5 (product reaction), Q7 (unmet needs) |
| Brand Manager | Customer language + pain points | Q2 (frustrations), Q3 (resonance) |
| Founder / CEO | Competitive landscape + willingness to pay | Q4 (alternatives), Q3 (value prop resonance) |
# Python: Send personalised outreach email
import requests
def send_outreach_email(to, subject, plain_text, html_content, categories):
"""Send email via SendGrid with tracking."""
response = requests.post(
"https://api.sendgrid.com/v3/mail/send",
headers={
"Authorization": "Bearer SENDGRID_API_KEY",
"Content-Type": "application/json"
},
json={
"personalizations": [{"to": [{"email": to}]}],
"from": {"email": "[email protected]", "name": "Your Name"},
"subject": subject,
"content": [
{"type": "text/plain", "value": plain_text},
{"type": "text/html", "value": html_content}
],
"tracking_settings": {
"open_tracking": {"enable": True},
"click_tracking": {"enable": True}
},
"categories": categories # e.g., ["outreach", "sender-name", "cpg-sales"]
}
)
return response
# IMPORTANT: Always include sender category in categories list
# IMPORTANT: Log the full email content in your database BEFORE sending
# SendGrid does NOT store email bodies — your database is the only record
# Executive Summary Template:
## [Topic] — Research Summary
### [Date] | [X] Participants | Ditto Synthetic Research
**Key Finding:** [One sentence headline finding]
**Context:** [2-3 sentences on why this research was conducted]
**Top 3 Findings:**
1. [Finding with data point] — "[Supporting persona quote]"
2. [Finding with data point] — "[Supporting persona quote]"
3. [Finding with data point] — "[Supporting persona quote]"
**Implications:**
• [Actionable recommendation 1]
• [Actionable recommendation 2]
• [Actionable recommendation 3]
**Explore the full study:** [share link with ?utm_source=blog]
---
Methodology: Ditto synthetic research, [X] AI personas,
[demographic description], [X] questions. 92% correlation
with traditional research validated by EY.
# Sales Leave-Behind Template:
## What [Target Audience] Really Think About [Category]
### Independent Research by [Your Company]
We asked [X] [demographic description] about [topic].
Here's what they said — in their own words.
**The #1 frustration:** "[Direct quote from Q2]"
(Cited by [X] out of [Y] participants)
**What they want:** "[Direct quote from Q3 or Q7]"
**What would make them switch:** "[Direct quote from Q6]"
**The surprise:** [Most unexpected finding from the study]
---
This research was conducted independently using Ditto synthetic
research methodology. Explore the full study and every individual
response: [share link with ?utm_source=ce]
# Press Release Template:
## [Company Name] Research Reveals [Headline Finding]
### New study of [X] consumers/professionals finds [key data point]
[CITY, DATE] — [Company Name] today released findings from a new
research study exploring [topic]. The study, conducted with [X]
[demographic description] using Ditto's synthetic research
methodology, found that [headline finding with data point].
**Key findings include:**
• [Finding 1 with data point]
• [Finding 2 with data point]
• [Finding 3 with data point]
"[Most quotable persona response]," said one study participant.
[1-2 paragraphs of context and implications]
**About the study:** [Methodology description]
**Full study results:** [share link with ?utm_source=blog]
**About [Company Name]:** [Boilerplate]
**Media contact:** [Contact details]
A content marketing engine runs continuously, not in bursts. The research calendar determines what studies to run and when.
| Cadence | Study Type | Configuration | Content Output |
|---|---|---|---|
| Monthly | Pulse check | 3 questions, 6 personas | 1 blog post + 1 social thread per pulse |
| Quarterly | Deep dive | 7 questions, 10 personas | Cornerstone article + all 7 formats |
| Ad hoc | Targeted probe | 5 questions, 8 personas | Timely article capturing trending topic |
| Pre-launch | Concept validation | 7 questions, 10 personas | Launch content + press release |
# Realistic monthly content engine output:
#
# 4 x monthly pulse checks = 4 blog posts, 4 social threads
# 1 x quarterly deep dive = 1 cornerstone + 6 derivative formats
# 1-2 x ad hoc probes = 1-2 timely articles
#
# Total: 6-7 articles/month + social + email + sales content
#
# Time investment: ~8-12 hours/month
# Traditional equivalent: ~$20K-$40K/month in agency fees
Use this framework to select study topics that maximise content value:
| Selection Criterion | High Value | Low Value |
|---|---|---|
| Audience interest | Topic your ICP actively searches for | Topic only your internal team cares about |
| Data uniqueness | No existing research on this specific angle | Well-covered topic with existing industry data |
| Shareability | Likely to produce surprising or counterintuitive findings | Likely to confirm obvious assumptions |
| Commercial relevance | Directly relates to a problem your product solves | Interesting but unrelated to your value proposition |
| Timeliness | Connected to current industry trend or news event | Evergreen but not urgent |
Company: "GlowLab" — a DTC skincare brand selling through their website
Content goal: Research-backed blog content about skincare consumer behaviour
Topic: "How consumers really choose skincare products in 2026"
Target audience: US women, 25–45, interested in skincare
curl -s -X POST "https://app.askditto.io/v1/research-groups/recruit" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Content Study - Skincare Purchase Decisions - Feb 2026",
"description": "Women aged 25-45 interested in skincare and beauty products",
"group_size": 10,
"filters": {
"country": "USA",
"age_min": 25,
"age_max": 45,
"gender": "female",
"employment": "employed"
},
"sampling_method": "random",
"deduplicate": true
}'
| Finding | Data Point | Best Persona Quote |
|---|---|---|
| Ingredient scepticism is rampant | 9/10 don't trust "clean beauty" claims | "Every brand says they're clean now. It's become meaningless." |
| TikTok has replaced dermatologists | 7/10 discover products via TikTok first | "I trust a random person on TikTok more than the brand's own website." |
| Price is not the barrier — trust is | 8/10 would pay more for proven results | "I'd happily spend $60 on a serum if I believed it would actually work. The problem isn't price." |
| Before/after photos are the #1 purchase driver | 6/10 cited "real results photos" as the deciding factor | "Show me someone who looks like me, with my skin type, after 30 days. That's what sells me." |
| Subscription fatigue is real | 5/10 have cancelled a skincare subscription | "I signed up for one box and now I have seven serums I'll never finish." |
Blog article title: "9 Out of 10 Consumers Don't Trust 'Clean Beauty' Claims"
seoDescription: "We asked 10 women aged 25-45 how they really choose skincare. The biggest finding: 9 out of 10 don't trust clean beauty claims. TikTok has replaced dermatologists. Price isn't the barrier."
keyTakeaways:
Social thread hook: "We asked 10 women how they REALLY choose skincare. 9 out of 10 said they don't trust 'clean beauty' claims at all. TikTok has replaced dermatologists. And price? Not the barrier you think it is. 👇"
Email hook (for skincare brand outreach): "We just ran a study on how women aged 25-45 choose skincare products. The #1 finding? 9 out of 10 don't trust clean beauty claims. But 8 out of 10 WILL pay more if you show them proof. Here's what that means for GlowLab..."
Track these metrics to evaluate whether your content marketing engine is producing results. Maintain a 60/40 split between leading indicators (engagement) and lagging indicators (revenue impact).
| Metric | What It Measures | Target |
|---|---|---|
| Organic traffic per article | Search discoverability | Growing month over month |
| Time on page | Content quality / reader engagement | > 3 minutes for research articles |
| Study share link clicks | Research engagement depth | 10%+ of article visitors click through |
| Social shares / thread engagement | Shareability / virality | Impressions, reposts, replies |
| Email open rate | Subject line / sender effectiveness | > 30% for cold outreach with study findings |
| Email click rate | Content relevance to recipient | > 5% clicking study share link |
| Metric | What It Measures | How to Track |
|---|---|---|
| Content-to-lead conversion | Readers becoming prospects | UTM tracking on study share links (?utm_source=blog vs ?utm_source=ce) |
| Pipeline influence | Deals touched by content | CRM attribution: which deals had content engagement? |
| Search ranking trajectory | SEO compounding effect | Position tracking for target keywords over 3-6 months |
| Sales team utilisation | Whether sales actually uses the content | Download/share tracking on leave-behinds and battlecards |
| AI citation presence | GEO effectiveness | Search your brand + topic in ChatGPT, Claude, Perplexity. Are you cited? |
seoDescription, llmSummary, keyTakeaways, primaryClaim, quotableInsights. Articles without GEO metadata are invisible to AI search systems.llmSummary and keyTakeaways fields are what make your content visible to AI search systems. Skipping them is leaving discoverability on the table./complete on the study. Study completion triggers Ditto's analysis (segments, shared mindsets, divergences). This analysis provides additional content material and a richer share link experience.| Error | Cause | Solution |
|---|---|---|
size parameter rejected |
Wrong parameter name | Use group_size, not size |
| 0 agents recruited | State filter used full name | Use 2-letter codes: "CA" not "California" |
Jobs stuck in "pending" |
Normal for first 10–15 seconds | Continue polling with 5-second intervals |
income filter rejected |
Unsupported filter | Remove; use education/employment as proxy |
| Missing completion analysis | Forgot to call /complete |
Always call POST /v1/research-studies/{id}/complete after final question |
| Contentful version conflict | Entry was modified between fetch and update | Always re-fetch the entry to get the current version before PUT/publish |
| Manus task timeout | Complex infographic takes longer than expected | Poll for up to 15 minutes (30 attempts at 30-second intervals). If failed, retry with simplified prompt. |
45–90 minutes for the core workflow (study + blog article + infographic + social thread). The remaining formats (executive summary, sales leave-behind, press release, email) add 10–15 minutes. Total: approximately 60–105 minutes for all 7 formats from a single study.
With 4 monthly pulse checks and 1 quarterly deep dive, expect 5–7 articles per month with approximately 8–12 hours of total effort. Teams that run additional ad hoc studies for trending topics can reach 10–15 articles per month.
Three things: (1) original primary research data that no competitor has, (2) structured metadata (keyTakeaways, quotableInsights) that search engines parse, and (3) unique persona quotes that add E-E-A-T signals (experience, expertise, authoritativeness, trustworthiness). Google's algorithms explicitly reward original research over derivative content.
GEO (Generative Engine Optimisation) is the practice of structuring content so AI systems (ChatGPT, Claude, Perplexity) can find, understand, and cite it. The llmSummary, keyTakeaways, primaryClaim, and quotableInsights fields make your content machine-readable and citation-ready. Without GEO optimisation, your content exists for human readers only and is invisible to AI-mediated discovery.
Yes. If the same audience is relevant to multiple content topics, create a new study referencing the same research_group_uuid. Personas retain context from previous studies, which can produce deeper insights. However, for content that needs fresh perspectives, recruit new groups.
Use 3-question pulses for quick reads on shifting sentiment ("How do consumers feel about X this month?"). Use 7-question deep dives when you need comprehensive content material: the full narrative arc, competitive context, quotable moments, and actionable implications. Deep dives produce cornerstone articles; pulses produce timely updates.
Yes. Follow the three-phase workflow: publish with a fallback image, generate the infographic, then replace and republish. This ensures the article goes live immediately while the infographic generation (2–5 minutes) runs in the background.
This happens rarely when questions are well-designed. If findings are bland, look for: (1) minority opinions that contradict the majority — these make good "but here's the twist" moments; (2) unexpected language in persona quotes — vivid phrasing makes even moderate findings compelling; (3) the gap between what personas say they want and what they actually do — this contradiction is always interesting. If truly no compelling angle exists, the study still provided valuable learning; not every study needs to become content.
Traditional: commission research from an agency ($5K–$15K), wait 4–6 weeks for results, hire a writer ($500–$2K), hire a designer ($500–$1K), spend 2 weeks in editorial review. Total: 6–10 weeks, $6K–$18K, one article. Ditto + Claude Code: run study (20 min), generate 7 formats (70 min). Total: 90 minutes, API cost only, seven formats.
Yes. B2B content benefits even more from original research than B2C, because B2B audiences are more sceptical and data-driven. Adjust the group description to specify professional context ("Senior product managers in mid-market SaaS companies"), use education and employment filters to target professionals, and customise questions for B2B problem spaces.
Related guides:
Ditto — Synthetic market research with 300,000+ AI personas. Validated by EY (92% correlation), Harvard, Cambridge, Stanford, and Oxford.
askditto.io · [email protected]