My Dashboard Web Apps AI Agents Marketing My Projects My Profile
← Dashboard
πŸ“£ Track 3 of 3 Β· AI Marketing

AI
Marketing

From AI-written SEO content to a fully autonomous multi-channel campaign β€” six projects that turn Claude into your marketing team.

Choose a project to start
0
Foundation
Connect Tools & Data Β· 1–2 hrs
One-time setup. Connect Claude to your marketing stack via MCP connectors, feed it your brand context, pull baseline analytics, and define your ideal customer profile.
Claude Cowork Google Search Console MCP Mailchimp MCP Meta MCP Reddit MCP
Start Foundation β†’
1
Starter
AI SEO Β· 1–2 hrs
Use Claude to generate SEO-optimised blog posts, meta descriptions, and keyword clusters. Ship content that actually ranks β€” no agency needed.
Claude API Python Keyword Research Content Strategy
Start Project 1 β†’
2
Beginner
Email Marketing Β· 1–3 hrs
Build an AI email sequence generator. Input your product and audience β€” Claude writes a complete 5-email nurture sequence with subject lines, preview text, and body copy.
Claude API Python Email Sequences Copywriting
Start Project 2 β†’
3
Intermediate
Instagram & Facebook Β· 2–4 hrs
Build a social media content pipeline. Input your brand β€” Claude generates 30 days of posts with captions, hashtags, and image prompts, optimised per platform.
Claude API Python Content Calendar Instagram Β· Facebook
Start Project 3 β†’
4
Advanced
Reddit Marketing Β· 3–5 hrs
Build an AI Reddit engagement agent. It scans subreddits for opportunities, then drafts authentic value-first comments that build brand presence without triggering spam filters.
Claude API PRAW Reddit API Community Marketing
Start Project 4 β†’
5
Pro
LinkedIn Automation Β· 4–6 hrs
Build a LinkedIn thought leadership engine. Claude generates authority posts, personalised connection notes, and follow-up message sequences tailored to your industry.
Claude API Python Thought Leadership Outreach Sequences
Start Project 5 β†’
6
Ninja
Full Campaign Orchestrator Β· 5–8 hrs
Tie all five channels together. Input your product and goal β€” the orchestrator generates a complete coordinated campaign: SEO article, email sequence, social calendar, Reddit strategy, and LinkedIn post.
Claude API Python Multi-Channel Campaign Strategy
Start Project 6 β†’
Foundation
0
Foundation
Foundation β€” Connect Tools & Data
One-time setup. Connect Claude to your marketing stack, give it brand context, pull baseline analytics, and define your ideal customer profile. Every project in this track builds on what you set up here.
Claude Cowork Google Search Console MCP Mailchimp MCP (Composio) Meta MCP Reddit MCP
πŸ”“ What you'll set up
Claude connected to Google Search Console, Mailchimp, Meta, and Reddit via MCP
A brand context doc Claude reads before every marketing task
Baseline analytics snapshot β€” traffic, email list size, follower counts
A defined ICP (ideal customer profile) Claude references across all channels
πŸ’‘ Why this matters
Without context, Claude gives you generic marketing copy. With your brand brief, ICP, and live data piped in via MCP, every output is specific, on-brand, and actionable from the first prompt.
βš™οΈ Step 1 β€” Install MCP Connectors in Claude Cowork β–Ύ

Open Claude Cowork (claude.ai/cowork or the desktop app). Go to Settings β†’ Integrations β†’ MCP and install each connector below. You only need to do this once β€” they persist across all your conversations.

1
Google Search Console MCP
Search for "Google Search Console" in the MCP marketplace. Connect your Google account and grant read access to your property. This lets Claude pull keyword rankings, impressions, and top pages live.
2
Mailchimp MCP via Composio
Install the Composio MCP bundle. Connect Mailchimp β€” Composio handles the OAuth. Claude can now read list sizes, campaign stats, and open rates without you copying anything.
3
Meta Business Suite MCP
Connect your Facebook/Instagram Business account. Claude will be able to read follower counts and post performance when generating your social content calendar.
4
Reddit MCP
Install the Reddit MCP. Authenticate with your Reddit account. Claude can now scan subreddits and draft comments directly in later projects.
🧠 Step 2 β€” Write Your Brand Context Doc β–Ύ

Create a plain text file called brand-context.txt. You'll paste this at the top of every Claude marketing conversation. Fill in the fields below for GoLive Labs (or swap in your own brand).

BRAND CONTEXT β€” GoLive Labs
===========================
Website: goliveailabs.com

What we do:
An online learning platform that teaches non-technical people to build
and ship real software using AI tools (Claude, Supabase, Vercel).
No prior experience required.

Tracks:
- Web Apps & Mobile (8 projects, Starter β†’ Expert)
- AI Agents (6 projects, Starter β†’ Ninja)
- AI Marketing (7 projects, Foundation β†’ Ninja)

Target audience:
Aspiring developers, non-coders, career changers, and entrepreneurs
who want to build real products β€” not just follow tutorials.

Ideal Customer Profile (ICP):
"A non-technical person who wants to ship real software using AI.
No prior coding experience required. Motivated by building something
real, not just learning theory."

Tone of voice:
Direct, encouraging, no fluff. We speak like a senior dev who wants
you to succeed β€” not a corporate brand. Use plain English. Avoid jargon.

Price point:
Free to start. $10/month Creator plan unlocks all projects.

Differentiator:
Every project ships something live. No toy examples.
Students go from zero to a live URL in the first session.
===========================
1
Save the file
Save brand-context.txt somewhere easy to find β€” your Desktop or a /marketing folder. You'll copy-paste it into Claude at the start of every session.
2
Test it with Claude
Open a new Claude conversation, paste the context, then ask: "Based on this brand context, what are 3 content angles that would resonate most with our ICP?" Claude should give you specific, on-brand answers β€” not generic advice.
πŸ“Š Step 3 β€” Pull Baseline Analytics β–Ύ

Before you run any campaigns, capture your starting numbers. You'll use these to measure what's actually working. Paste the prompt below into Claude with your MCP connectors active.

Use the Google Search Console MCP to pull:
- Total clicks and impressions over the last 28 days
- Top 10 landing pages by clicks
- Top 10 queries by impressions with their average position

Use the Mailchimp MCP to pull:
- Total subscriber count
- Average open rate across the last 5 campaigns

Use the Meta MCP to pull:
- Instagram follower count
- Facebook page likes
- Reach over the last 28 days

Format everything as a clean baseline analytics snapshot with today's date.
I'll use this as my marketing benchmark going forward.
1
Save the output
Copy Claude's response into a file called baseline-analytics.txt with the date. You'll reference this in the Campaign Orchestrator (Project 6) to measure growth.
2
Note any gaps
If an MCP can't connect (e.g. no Mailchimp account yet), just write "0 subscribers β€” new list" in the file. The important thing is having a dated starting point, not perfect data.
🎯 Step 4 β€” Define Your ICP with Claude β–Ύ

A sharp ICP makes every piece of content more effective. Use Claude to pressure-test and expand yours. Paste your brand context first, then use the prompt below.

Based on the brand context above, help me build a detailed ICP.

Starting point: "Non-technical person who wants to ship real software
using AI. No prior experience required."

Please expand this into a full ICP covering:
1. Demographics (age range, job titles, life stage)
2. Psychographics (motivations, fears, aspirations)
3. Where they spend time online (subreddits, Facebook groups, LinkedIn communities)
4. What they search for before finding us
5. The objections they have before signing up
6. The exact language they use to describe their problem

Format as a reference doc I can paste into future marketing prompts.
1
Save as icp.txt
Save Claude's output as icp.txt. Add it to your /marketing folder alongside brand-context.txt and baseline-analytics.txt.
2
Foundation complete
You now have three files Claude will use as context for every marketing project: brand context, baseline analytics, and ICP. You're ready to start Project 1 β€” AI SEO.
1
Starter
AI SEO
Use Claude to generate SEO-optimised blog posts, meta descriptions, and keyword clusters. Ship content that ranks without an agency.
Claude API Python Keyword Research Content Strategy 1–2 hrs
πŸ’‘ What you can build
AI blog factory
Keyword cluster generator
Meta description writer
FAQ page generator
Product description optimiser
Title A/B tester
Featured snippet writer
Internal link suggester
πŸ”“ Skills you'll unlock
SEO content strategy
Keyword research with AI
Search intent matching
Claude system prompts
Batch content generation
Markdown output
🎯 What You're Building β–Ύ

A Python CLI that takes a target keyword and generates a full SEO blog post: keyword cluster with search intent, five title options, a 155-char meta description, and a complete article with proper H2 structure β€” all saved to a markdown file ready for any CMS.

Why this works: Claude understands search intent natively. Give it a keyword and a clear system prompt and it writes content that matches what Google and readers both want to see.
βš™οΈ Step 1 β€” Research Keywords β–Ύ
1
Install dependencies
Create a project folder and install the Anthropic SDK.
mkdir seo-agent && cd seo-agent
pip install anthropic python-dotenv
2
Add your API key
Create a .env file with your Anthropic key.
ANTHROPIC_API_KEY=your_key_here
3
Create seo_agent.py β€” keyword researcher
The first function takes a seed keyword and returns a full cluster with search intent, title options, and meta description.
import os, json, re
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

def research_keywords(seed: str) -> str:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2048,
        system="""You are an expert SEO strategist. Return valid JSON only:
{
  "primary_keyword": "best version to target",
  "secondary_keywords": ["kw1", "kw2", "kw3", "kw4", "kw5"],
  "search_intent": "informational | commercial | transactional",
  "title_options": ["title 1", "title 2", "title 3", "title 4", "title 5"],
  "meta_description": "155-char meta with keyword and clear value prop"
}""",
        messages=[{"role": "user", "content": f"Research this keyword: {seed}"}]
    )
    return response.content[0].text

if __name__ == "__main__":
    kw = input("Enter your target keyword: ").strip()
    print(research_keywords(kw))
4
Test keyword research
Run it and inspect the JSON output before building the writer.
python seo_agent.py
πŸ”¨ Step 2 β€” Generate Full Blog Posts β–Ύ
1
Add the blog post generator
This function takes the keyword research output and writes a complete SEO article with proper H2 structure, natural keyword placement, and a strong CTA.
def generate_post(keyword_json: str, word_count: int = 1200) -> str:
    try:
        data = json.loads(re.sub(r'```(?:json)?', '', keyword_json).strip('`').strip())
        primary  = data.get('primary_keyword', 'the topic')
        secondry = ', '.join(data.get('secondary_keywords', [])[:5])
        intent   = data.get('search_intent', 'informational')
        title    = data.get('title_options', [''])[0]
    except Exception:
        primary, secondry, intent, title = keyword_json, '', 'informational', keyword_json

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=4096,
        system=f"""You are an expert SEO content writer. Write for {intent} intent.
Rules:
- Use primary keyword naturally 3-5 times, never stuffed
- Weave in secondary keywords where contextually natural
- Hook in the first 2 sentences
- H2 every 250-300 words
- End with a clear CTA
- ~{word_count} words, clean markdown""",
        messages=[{"role": "user", "content": f"Title: {title}\nPrimary: {primary}\nSecondary: {secondry}"}]
    )
    return response.content[0].text

def save(keyword: str, research: str, article: str):
    name = keyword.replace(' ', '_')[:40]
    with open(f"{name}_article.md", "w") as f:
        f.write(f"## SEO Research\n\n{research}\n\n---\n\n## Article\n\n{article}")
    print(f"βœ“ Saved to {name}_article.md")
2
Wire it together and run
Replace the if __name__ block with this to run the full pipeline end-to-end.
if __name__ == "__main__":
    keyword = input("Target keyword: ").strip()
    print("\n[1/2] Researching keywords...")
    research = research_keywords(keyword)
    print("[2/2] Writing article...")
    article = generate_post(research)
    save(keyword, research, article)
    print("Done β€” paste the .md file into your CMS.")
2
Beginner
Email Marketing
Build an AI email sequence generator. Input your product and audience β€” Claude writes a complete 5-email nurture sequence ready for any ESP.
Claude API Python Email Sequences Copywriting 1–3 hrs
πŸ’‘ What you can build
Welcome sequence
Abandoned cart emails
Newsletter generator
Cold outreach personaliser
Re-engagement sequence
Product launch emails
Onboarding drip
Upsell sequence
πŸ”“ Skills you'll unlock
Email copywriting with AI
Sequence strategy
Tone consistency
Batch generation
JSON structured output
File output
🎯 What You're Building β–Ύ

A Python script that takes your product description and target audience, then generates a complete 5-email drip sequence β€” Welcome, Value, Social Proof, Objection Handling, Offer β€” each with subject line, preview text, and body copy saved to individual files.

βš™οΈ Step 1 β€” Build the Email Agent β–Ύ
1
Install dependencies
Install the Anthropic SDK and dotenv.
pip install anthropic python-dotenv
2
Create email_agent.py
Define the five email types and the function that generates each one as structured JSON.
import os, json, re
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

EMAIL_SEQUENCE = [
    ("welcome",       "Delivered immediately. Warm, personal, set expectations. NO hard sell."),
    ("value",         "Day 3. Pure value β€” teach something useful. Build trust. No CTA."),
    ("social_proof",  "Day 7. Real case study or testimonial with specific numbers. Soft CTA."),
    ("objection",     "Day 14. Address the #1 objection honestly. Reframe it."),
    ("offer",         "Day 21. Clear, specific, urgent offer. Strong CTA."),
]

def generate_email(product: str, audience: str, email_type: str, instructions: str, prev_subjects: list) -> dict:
    prev = f"\nAvoid repeating these subjects: {prev_subjects}" if prev_subjects else ""
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=f"""You write emails for: {product}. Audience: {audience}.
Voice: conversational, human β€” never corporate or spammy.
Output valid JSON only: {{subject, preview_text, body}}
subject: under 50 chars. preview_text: under 90 chars.{prev}""",
        messages=[{"role": "user", "content": f"Write the {email_type} email. Instructions: {instructions}"}]
    )
    text = re.sub(r'```(?:json)?', '', response.content[0].text).strip('`').strip()
    return json.loads(text)
πŸ”¨ Step 2 β€” Generate the Full Sequence β–Ύ
1
Add the sequence runner
This loops through all five email types, generates each one, and saves them to numbered text files.
def run_sequence(product: str, audience: str):
    print(f"\nGenerating 5-email sequence for: {product}\n")
    prev_subjects = []

    for i, (email_type, instructions) in enumerate(EMAIL_SEQUENCE, 1):
        print(f"[{i}/5] Writing {email_type} email...")
        email = generate_email(product, audience, email_type, instructions, prev_subjects)
        prev_subjects.append(email['subject'])

        with open(f"email_{i:02d}_{email_type}.txt", "w") as f:
            f.write(f"SUBJECT: {email['subject']}\n")
            f.write(f"PREVIEW: {email['preview_text']}\n")
            f.write("─" * 40 + "\n\n")
            f.write(email['body'])
        print(f"    Subject: {email['subject']}")

    print(f"\nβœ“ 5 emails saved.")

if __name__ == "__main__":
    product  = input("Describe your product (1-2 sentences): ").strip()
    audience = input("Describe your target audience: ").strip()
    run_sequence(product, audience)
2
Run and review your sequence
Five files will be created, ready to copy-paste into Mailchimp, ConvertKit, or any ESP.
python email_agent.py
3
Intermediate
Instagram & Facebook
Build a social media content pipeline. Input your brand β€” Claude generates 30 days of posts with captions, hashtags, and image prompts, optimised per platform.
Claude API Python Content Calendar Instagram Β· Facebook 2–4 hrs
πŸ’‘ What you can build
30-day content calendar
Story ideas generator
Caption A/B tester
Hashtag researcher
Reel script writer
Carousel content creator
Brand voice checker
Comment response drafter
πŸ”“ Skills you'll unlock
Platform-specific copywriting
Content pillar strategy
Brand voice prompting
Batch generation
Image prompt writing
Structured JSON output
🎯 What You're Building β–Ύ

A Python pipeline that takes your brand details and generates a 30-day social media calendar. Instagram posts include caption, hashtags, and a DALL-E image prompt. Facebook versions are rewritten for that platform's longer, conversational format. Everything exported to a single text file.

βš™οΈ Step 1 β€” Set Up the Social Agent β–Ύ
1
Install dependencies
Install the Anthropic SDK.
pip install anthropic python-dotenv
2
Create social_agent.py with brand brief and post generator
Define the five content pillars and the function that generates per-platform posts as JSON.
import os, json, re
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

PILLARS = [
    "Educational / How-to",
    "Behind the scenes",
    "Social proof / testimonial",
    "Product spotlight",
    "Community / engagement question",
]

PLATFORM_RULES = {
    "instagram": "Short punchy caption (150 chars max), hook on first line, 15-20 hashtags, DALL-E image prompt. JSON: {caption, hashtags, image_prompt}",
    "facebook":  "Conversational 2-3 short paragraphs, max 3 hashtags, end with a question. JSON: {caption}",
}

def generate_post(brand_brief: str, pillar: str, platform: str, day: int) -> dict:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=800,
        system=f"""{brand_brief}
Creating {platform} content. Rules: {PLATFORM_RULES[platform]}
Output valid JSON only.""",
        messages=[{"role": "user", "content": f"Day {day} post. Pillar: {pillar}. Be creative and on-brand."}]
    )
    text = re.sub(r'```(?:json)?', '', response.content[0].text).strip('`').strip()
    return json.loads(text)
πŸ”¨ Step 2 β€” Generate 30 Days of Content β–Ύ
1
Add the calendar generator
This loops through 30 days, rotates through content pillars, and generates both Instagram and Facebook versions for each day.
def generate_calendar(brand: str, desc: str, audience: str, tone: str, days: int = 30):
    brief = f"Brand: {brand}\nWhat we do: {desc}\nAudience: {audience}\nTone: {tone}"
    print(f"\nGenerating {days}-day calendar for {brand}...\n")

    with open(f"{brand.replace(' ','_')}_social.txt", "w") as f:
        f.write(f"SOCIAL MEDIA CALENDAR β€” {brand}\n{'='*60}\n\n")
        for day in range(1, days + 1):
            pillar = PILLARS[(day - 1) % len(PILLARS)]
            print(f"Day {day:02d}/30 β€” {pillar}...")
            f.write(f"DAY {day:02d} | {pillar}\n{'─'*40}\n")

            ig = generate_post(brief, pillar, "instagram", day)
            f.write(f"INSTAGRAM:\n{ig.get('caption','')}\n")
            f.write(f"Hashtags: {' '.join(ig.get('hashtags',[]))}\n")
            f.write(f"Image prompt: {ig.get('image_prompt','')}\n\n")

            fb = generate_post(brief, pillar, "facebook", day)
            f.write(f"FACEBOOK:\n{fb.get('caption','')}\n\n{'='*60}\n\n")

    print(f"βœ“ Calendar saved.")

if __name__ == "__main__":
    brand    = input("Brand name: ").strip()
    desc     = input("What does your brand do? ").strip()
    audience = input("Target audience: ").strip()
    tone     = input("Tone (e.g. 'friendly and witty'): ").strip()
    generate_calendar(brand, desc, audience, tone)
2
Run and get your calendar
Answer the four prompts and wait ~3 minutes. Open the output file and schedule the posts in your tool of choice.
python social_agent.py
4
Advanced
Reddit Marketing
Build an AI Reddit engagement agent. It scans subreddits for opportunities, then drafts authentic value-first comments that build brand presence without triggering spam filters.
Claude API PRAW Python Reddit API 3–5 hrs
πŸ’‘ What you can build
Opportunity scanner
Authentic comment drafter
Subreddit finder
AMA post writer
Niche trend spotter
Competitor mention tracker
Community question generator
Keyword alert system
πŸ”“ Skills you'll unlock
Reddit API (PRAW)
Community-first marketing
Authentic voice prompting
Relevance scoring
Human-in-the-loop review
Ethical AI marketing
🧠 Reddit Marketing Ethics β–Ύ

Reddit is the most anti-spam community on the internet. This agent is built around value-first engagement β€” it only surfaces opportunities where you can genuinely help. The agent drafts responses and scores them, but a human always reviews before posting. Never autopost blindly on Reddit.

Rule of thumb: If your comment would be useful even without mentioning your product, it's the right kind of engagement. If not, skip the post.
βš™οΈ Step 1 β€” Connect to the Reddit API β–Ύ
1
Install dependencies
Install the Anthropic SDK and PRAW (Python Reddit API Wrapper).
pip install anthropic praw python-dotenv
2
Create a Reddit app and get credentials
Go to reddit.com/prefs/apps β†’ Create App β†’ select "script". Copy your client_id and client_secret, then add them to your .env.
ANTHROPIC_API_KEY=your_key
REDDIT_CLIENT_ID=your_client_id
REDDIT_CLIENT_SECRET=your_client_secret
REDDIT_USER_AGENT=opportunityscanner/1.0
3
Create reddit_agent.py and scan for opportunities
This connects to Reddit and finds posts in your target subreddits that match your keywords.
import os, json, re
import praw
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client  = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
reddit  = praw.Reddit(
    client_id=os.getenv("REDDIT_CLIENT_ID"),
    client_secret=os.getenv("REDDIT_CLIENT_SECRET"),
    user_agent=os.getenv("REDDIT_USER_AGENT"),
)

def find_opportunities(subreddits: list, keywords: list, limit: int = 25) -> list:
    hits = []
    for sub in subreddits:
        for post in reddit.subreddit(sub).new(limit=limit):
            text = (post.title + " " + post.selftext).lower()
            if any(kw.lower() in text for kw in keywords):
                hits.append({
                    "id": post.id, "subreddit": sub,
                    "title": post.title, "body": post.selftext[:500],
                    "score": post.score,
                })
    return hits
πŸ”¨ Step 2 β€” Draft Authentic Responses β–Ύ
1
Add the comment drafter and orchestrator
Claude scores each opportunity and drafts a genuine, helpful comment. Anything scoring 6+ is saved to a review file.
def draft_comment(post: dict, brand_brief: str) -> dict:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=512,
        system=f"""{brand_brief}
Write a Reddit comment. Reddit hates marketing. Rules:
1. Lead with genuine help β€” answer the question WITHOUT mentioning your product
2. Only mention your brand at the very end IF it directly solves their problem
3. Sound like a real human, not a marketer
4. No exclamation marks, no emojis, no buzzwords
5. Max 3 short paragraphs
Score the opportunity 1-10. Return JSON: {{relevance_score, comment, mention_brand}}""",
        messages=[{"role": "user", "content": f"Title: {post['title']}\nBody: {post['body']}"}]
    )
    text = re.sub(r'```(?:json)?', '', response.content[0].text).strip('`').strip()
    return json.loads(text)

def run_agent(subreddits: list, keywords: list, brand_brief: str, min_score: int = 6):
    print(f"Scanning {len(subreddits)} subreddits...")
    posts = find_opportunities(subreddits, keywords)
    print(f"Found {len(posts)} relevant posts. Drafting responses...\n")

    good = []
    for post in posts:
        draft = draft_comment(post, brand_brief)
        if draft.get('relevance_score', 0) >= min_score:
            good.append({**post, **draft})
            print(f"[{draft['relevance_score']}/10] r/{post['subreddit']}: {post['title'][:60]}")

    with open("reddit_opportunities.txt", "w") as f:
        for opp in sorted(good, key=lambda x: -x['relevance_score']):
            f.write(f"SCORE: {opp['relevance_score']}/10\n")
            f.write(f"POST: {opp['title']}\n")
            f.write(f"URL: https://reddit.com/comments/{opp['id']}\n")
            f.write(f"DRAFT:\n{opp['comment']}\n{'='*60}\n\n")

    print(f"\nβœ“ {len(good)} opportunities saved for human review.")

if __name__ == "__main__":
    SUBREDDITS = ["entrepreneur", "startups", "SaaS", "marketing"]
    KEYWORDS   = ["looking for", "recommend", "how do I", "anyone tried"]
    BRAND      = "We build AI tools for small business owners."
    run_agent(SUBREDDITS, KEYWORDS, BRAND)
2
Run and review opportunities
The script generates reddit_opportunities.txt. Review each draft, edit as needed, then post manually. Never autopost.
python reddit_agent.py
5
Pro
LinkedIn Automation
Build a LinkedIn thought leadership engine. Claude generates authority posts, personalised connection notes, and follow-up message sequences tailored to your industry.
Claude API Python Thought Leadership Outreach Sequences 4–6 hrs
πŸ’‘ What you can build
Thought leadership posts
Connection note writer
DM follow-up sequence
Profile optimiser
Industry insight generator
Poll creator
Newsletter writer
Comment drafter
πŸ”“ Skills you'll unlock
LinkedIn algorithm optimisation
Thought leadership writing
Personalised outreach
Post format strategy
DM sequence design
Professional tone prompting
🎯 What You're Building β–Ύ

A LinkedIn content system with three parts: (1) a post generator that creates algorithm-friendly thought leadership posts in five proven formats, (2) a personalised connection request writer, and (3) a three-message DM follow-up sequence.

βš™οΈ Step 1 β€” Build the Post Generator β–Ύ
1
Install dependencies
Install the Anthropic SDK.
pip install anthropic python-dotenv
2
Create linkedin_agent.py with the post generator
Five proven post formats β€” story, insight, list, question, and mistake β€” each with algorithm-specific formatting rules.
import os
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

POST_FORMATS = {
    "story":    "Personal story with a business lesson. Start with 'I' or a specific moment.",
    "insight":  "Contrarian industry insight. Start with a bold statement.",
    "list":     "Numbered list of 5-7 actionable items. One sentence each.",
    "question": "Thought-provoking question that sparks debate. Short setup, 1 question.",
    "mistake":  "A mistake you made and what you learned. Vulnerable but professional.",
}

def generate_post(your_role: str, industry: str, topic: str, fmt: str = "insight") -> str:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system=f"""You are {your_role} in {industry}. Write LinkedIn posts that perform.
Algorithm rules:
- Line 1 MUST stop the scroll (bold claim, surprising stat, or emotional hook)
- Line break every 1-2 sentences β€” LinkedIn rewards white space
- 3-5 hashtags at the very end only
- End with 1 question to drive comments
- Max 1,300 characters for best reach
- Sound human, never corporate
Format: {POST_FORMATS.get(fmt, POST_FORMATS['insight'])}""",
        messages=[{"role": "user", "content": f"Write a LinkedIn post about: {topic}"}]
    )
    return response.content[0].text
πŸ”¨ Step 2 β€” Build the Outreach System β–Ύ
1
Add connection notes and follow-up DMs
The connection note function writes a specific, non-generic request under 300 characters. The follow-up sequence is three messages spaced over 21 days β€” no pitch until day 21.
def connection_note(your_role: str, their_role: str, reason: str) -> str:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=150,
        system=f"You are {your_role}. Write a LinkedIn connection note. Max 300 chars. Specific reason β€” no generic 'I'd love to connect'. No pitch.",
        messages=[{"role": "user", "content": f"Connect with: {their_role}\nReason: {reason}"}]
    )
    return response.content[0].text.strip()

def followup_sequence(context: str, your_role: str) -> list:
    specs = [
        ("Day 3",  "Thank them for connecting. Ask one genuine question about their work. No pitch. Max 80 words."),
        ("Day 10", "Share something useful to them β€” an insight or resource. Still no pitch. Max 80 words."),
        ("Day 21", "Soft mention of what you do IF relevant. Ask if they'd be open to a 15-min chat. Max 100 words."),
    ]
    out = []
    for day, instructions in specs:
        r = client.messages.create(
            model="claude-sonnet-4-6", max_tokens=200,
            system=f"You are {your_role}. Context: {context}\n{instructions}\nSound human.",
            messages=[{"role": "user", "content": "Write the message."}]
        )
        out.append({"day": day, "message": r.content[0].text.strip()})
    return out
2
Wire everything together and run
This generates your post, a connection note, and the full 3-message sequence in one run.
if __name__ == "__main__":
    role     = input("Your role/title: ").strip()
    industry = input("Your industry: ").strip()
    topic    = input("Post topic: ").strip()
    fmt      = input("Format (story/insight/list/question/mistake) [insight]: ").strip() or "insight"

    print("\n─── LINKEDIN POST ───")
    post = generate_post(role, industry, topic, fmt)
    print(post)

    with open("linkedin_post.txt", "w") as f:
        f.write(post)
    print("\nβœ“ Saved to linkedin_post.txt")
6
Ninja
Full Campaign Orchestrator
Tie all channels together. Input your product and goal β€” the orchestrator generates a complete coordinated campaign: SEO article, email sequence, social calendar, Reddit strategy, and LinkedIn post.
Claude API Python Multi-Channel Campaign Strategy 5–8 hrs
πŸ’‘ What you can build
Product launch campaign
Weekly campaign scheduler
Event promotion package
Content repurposer
A/B test generator
Competitor response kit
Seasonal campaign builder
Rebrand content package
πŸ”“ Skills you'll unlock
Multi-agent orchestration
Campaign brief generation
Cross-channel consistency
Parallel content generation
File system output
Production deployment
🧠 How the Orchestrator Works β–Ύ

The orchestrator first asks Claude to generate a master campaign brief β€” a shared JSON document containing your key message, tone, hooks, and CTA. Every channel agent receives this brief, ensuring consistent messaging across all five channels. Each agent then adds its channel-specific output to a campaign folder.

The brief is the secret: Most multi-channel campaigns fail because each channel gets different messaging. Sharing one brief between all agents ensures everything sounds like it came from the same campaign.
βš™οΈ Step 1 β€” Create the Campaign Brief Generator β–Ύ
1
Install dependencies
Install the Anthropic SDK.
pip install anthropic python-dotenv
2
Create campaign_orchestrator.py with the brief generator
The brief generator is the foundation β€” it creates the shared context every channel agent uses.
import os, json, re
from pathlib import Path
from anthropic import Anthropic
from dotenv import load_dotenv

load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

def create_brief(product: str, goal: str, audience: str, timeline: str) -> dict:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        system="""You are a CMO creating a campaign brief. Output valid JSON only:
{
  "product_summary": "one sentence",
  "campaign_goal": "specific measurable goal",
  "target_audience": "detailed persona",
  "key_message": "the one thing everyone must remember",
  "tone": "2-3 adjectives",
  "hooks": ["hook1", "hook2", "hook3"],
  "primary_cta": "the main call to action"
}""",
        messages=[{"role": "user", "content": f"Product: {product}\nGoal: {goal}\nAudience: {audience}\nTimeline: {timeline}"}]
    )
    text = re.sub(r'```(?:json)?', '', response.content[0].text).strip('`').strip()
    return json.loads(text)

def setup_folder(product: str) -> Path:
    folder = Path(f"campaign_{product.replace(' ','_')[:30]}")
    folder.mkdir(exist_ok=True)
    return folder
πŸ”¨ Step 2 β€” Orchestrate All Five Channels β–Ύ
1
Add the five channel runners
Each channel function receives the shared brief and generates its output to a numbered file in the campaign folder.
def run_seo(brief: dict, folder: Path):
    r = client.messages.create(model="claude-sonnet-4-6", max_tokens=3000,
        system=f"Campaign brief: {json.dumps(brief)}\nWrite a 900-word SEO article targeting people searching for solutions to the problem described. Include meta description and H2 structure.",
        messages=[{"role": "user", "content": "Write the SEO article."}])
    (folder / "01_seo_article.md").write_text(r.content[0].text)
    print("  [SEO] βœ“")

def run_email(brief: dict, folder: Path):
    types = ["welcome", "value", "social_proof", "objection", "offer"]
    out = ""
    for i, t in enumerate(types, 1):
        r = client.messages.create(model="claude-sonnet-4-6", max_tokens=600,
            system=f"Campaign brief: {json.dumps(brief)}\nWrite email {i}/5: {t}. Output JSON: {{subject, preview_text, body}}",
            messages=[{"role": "user", "content": f"Write the {t} email."}])
        out += f"\n\n--- EMAIL {i}: {t.upper()} ---\n{r.content[0].text}"
    (folder / "02_email_sequence.txt").write_text(out)
    print("  [EMAIL] βœ“")

def run_social(brief: dict, folder: Path):
    r = client.messages.create(model="claude-sonnet-4-6", max_tokens=3000,
        system=f"Campaign brief: {json.dumps(brief)}\nGenerate 7 days of social content. Each day: Instagram caption + hashtags + image prompt, and Facebook caption.",
        messages=[{"role": "user", "content": "Generate the 7-day calendar."}])
    (folder / "03_social_calendar.txt").write_text(r.content[0].text)
    print("  [SOCIAL] βœ“")

def run_reddit(brief: dict, folder: Path):
    r = client.messages.create(model="claude-sonnet-4-6", max_tokens=1000,
        system=f"Campaign brief: {json.dumps(brief)}\nCreate a Reddit strategy: top 5 subreddits, 10 keywords to monitor, 3 example authentic helpful comments (value-first), what NOT to do.",
        messages=[{"role": "user", "content": "Create the Reddit strategy."}])
    (folder / "04_reddit_strategy.txt").write_text(r.content[0].text)
    print("  [REDDIT] βœ“")

def run_linkedin(brief: dict, folder: Path):
    r = client.messages.create(model="claude-sonnet-4-6", max_tokens=800,
        system=f"Campaign brief: {json.dumps(brief)}\nWrite 1 high-performing LinkedIn thought leadership post + a 3-message DM outreach sequence.",
        messages=[{"role": "user", "content": "Write the LinkedIn content."}])
    (folder / "05_linkedin.txt").write_text(r.content[0].text)
    print("  [LINKEDIN] βœ“")
2
Add the main orchestrator and run
The orchestrator creates the brief, then runs all five channel agents in sequence, saving everything to a campaign folder.
def run_campaign(product: str, goal: str, audience: str, timeline: str):
    print(f"\n{'='*60}\nCAMPAIGN: {product}\n{'='*60}\n")

    print("[1/6] Creating campaign brief...")
    brief  = create_brief(product, goal, audience, timeline)
    folder = setup_folder(product)
    (folder / "00_brief.json").write_text(json.dumps(brief, indent=2))
    print(f"      Key message: {brief['key_message']}\n")

    print("[2/6] Running channel agents...")
    run_seo(brief, folder)
    run_email(brief, folder)
    run_social(brief, folder)
    run_reddit(brief, folder)
    run_linkedin(brief, folder)

    print(f"\n{'='*60}")
    print(f"βœ“ Campaign complete β€” all files in: {folder}/")
    print(f"{'='*60}")

if __name__ == "__main__":
    product  = input("Product/service: ").strip()
    goal     = input("Campaign goal (e.g. '100 signups in 30 days'): ").strip()
    audience = input("Target audience: ").strip()
    timeline = input("Timeline (e.g. '30 days'): ").strip()
    run_campaign(product, goal, audience, timeline)
3
Run your first full campaign
Answer the four prompts. In about 2–3 minutes you'll have a complete multi-channel campaign folder ready to execute.
python campaign_orchestrator.py