Systems Library / Marketing Automation / How to Create AI-Powered Press Release Drafts
Marketing Automation content marketing

How to Create AI-Powered Press Release Drafts

Draft professional press releases using AI templates and company data.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

Press releases have a rigid structure for a reason. Journalists get hundreds per week. If yours does not follow the format, it gets ignored before it gets read. This ai press release generator automated system produces structurally correct, publication-ready press release drafts in minutes. I feed it the news, the company background, and the quote, and it handles the rest.

The system matters because most PR drafts come back full of corporate fluff that editors strip out anyway. Training Claude on the inverted pyramid structure and AP style produces drafts that need far fewer rewrites.

What You Need Before Starting

Step 1: Create Your Company Boilerplate File

Every press release ends with an "About" section. Store yours once:

# company_boilerplate.py

BOILERPLATE = {
    "company_name": "Acme Corp",
    "about": "Acme Corp builds AI-powered operations tools for marketing agencies. Founded in 2022, the company serves over 200 agencies across North America and the UK.",
    "website": "https://acmecorp.com",
    "press_contact_name": "Sarah Chen",
    "press_contact_email": "[email protected]",
    "press_contact_phone": "+1 (555) 000-0000"
}

Step 2: Define the Press Release Input Schema

The more structured your input, the better the output. Collect this data before you run the generator:

PRESS_RELEASE_TEMPLATE = {
    "news_type": "",          # "product_launch", "partnership", "funding", "award", "executive_hire", "milestone"
    "headline_hint": "",      # The news in one sentence (not the final headline, just the core fact)
    "announcement_date": "",  # "For immediate release" or "Embargoed until YYYY-MM-DD"
    "city_state": "",         # Where the news originates (e.g., "San Francisco, CA")
    "news_body": "",          # All the key facts. Who, what, when, where, why, how much.
    "primary_quote": {
        "speaker_name": "",
        "speaker_title": "",
        "quote_direction": ""  # What you want the quote to say, in plain language
    },
    "secondary_quote": {
        "speaker_name": "",
        "speaker_title": "",
        "quote_direction": ""
    },
    "supporting_data": "",    # Any numbers, metrics, stats to include
    "boilerplate_key": "default"
}

Step 3: Build the Generator

import os
import anthropic
from dotenv import load_dotenv
from company_boilerplate import BOILERPLATE

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

def generate_press_release(data: dict) -> str:
    primary_q = data.get("primary_quote", {})
    secondary_q = data.get("secondary_quote", {})
    
    secondary_quote_instruction = ""
    if secondary_q.get("speaker_name"):
        secondary_quote_instruction = f"""
SECONDARY QUOTE:
Speaker: {secondary_q['speaker_name']}, {secondary_q['speaker_title']}
Direction: {secondary_q['quote_direction']}
"""
    
    prompt = f"""Write a professional press release following AP style and inverted pyramid structure.

NEWS TYPE: {data['news_type']}
ANNOUNCEMENT DATE: {data['announcement_date']}
DATELINE CITY: {data['city_state']}
CORE NEWS: {data['headline_hint']}
FULL FACTS: {data['news_body']}
SUPPORTING DATA: {data.get('supporting_data', 'None provided')}

PRIMARY QUOTE:
Speaker: {primary_q.get('speaker_name', '')}, {primary_q.get('speaker_title', '')}
What the quote should convey: {primary_q.get('quote_direction', '')}
{secondary_quote_instruction}

COMPANY BOILERPLATE:
{BOILERPLATE['about']}

Format EXACTLY as follows:

FOR IMMEDIATE RELEASE
[or EMBARGOED UNTIL: DATE]

HEADLINE (max 100 characters. Active voice. Present tense. Key fact up front.)

SUBHEADLINE (optional: one supporting detail that strengthens the headline)

[CITY, STATE] -- [DATE] -- [Lead paragraph: Who, what, when, where, why. Most important fact first. 40-60 words.]

[Second paragraph: context, background, how it fits into the bigger picture. 60-80 words.]

[Primary quote paragraph: "Quote text here," said [Name], [Title] of [Company]. "Optional continuation of quote."]

[Third paragraph: additional details, technical information, supporting facts and statistics.]

[Secondary quote paragraph if applicable]

[Fourth paragraph: availability, pricing, timeline, call to action if relevant.]

###

About [Company Name]:
[Boilerplate text]

Media Contact:
[Name]
[Email]
[Phone]

WRITING RULES:
- No em dashes. Comma or period instead.
- No superlatives (first, leading, best, most advanced) without evidence.
- Quotes must sound like a real person said them, not a press release robot.
- No sentence should exceed 25 words.
- Numbers under 10 are spelled out. 10 and above use numerals.
- Percentages always use numerals (5 percent, not five percent)."""

    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=1500,
        messages=[{"role": "user", "content": prompt}]
    )
    
    return message.content[0].text

Step 4: Generate Multiple Headline Options

Journalists sometimes rewrite headlines anyway, but having options helps you land the angle:

def generate_headline_variants(news_summary: str, count: int = 5) -> str:
    prompt = f"""Generate {count} press release headline variants for this news.

NEWS: {news_summary}

Rules:
- Max 100 characters each
- Active voice, present tense
- Lead with the most newsworthy fact
- No jargon
- No em dashes

Number each headline."""

    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=400,
        messages=[{"role": "user", "content": prompt}]
    )
    
    return message.content[0].text

Step 5: Run It

def save_press_release(content: str, filename: str):
    with open(filename, "w") as f:
        f.write(content)
    print(f"Saved to {filename}")

if __name__ == "__main__":
    release_data = {
        "news_type": "product_launch",
        "headline_hint": "Acme Corp launches AI-powered reporting tool that cuts manual work by 90%",
        "announcement_date": "For Immediate Release",
        "city_state": "San Francisco, CA",
        "news_body": "Acme Corp today announced Pulse, an AI-powered analytics tool for marketing agencies. Pulse connects to Meta Ads, Google Ads, and GA4, then generates plain-English client reports automatically every week. Beta users report 90% reduction in manual reporting time. Pricing starts at $299/month. Available immediately.",
        "primary_quote": {
            "speaker_name": "Jay Banlasan",
            "speaker_title": "Founder, Acme Corp",
            "quote_direction": "Agencies waste too much time on manual reporting. Pulse gives that time back so teams can focus on strategy."
        },
        "supporting_data": "Beta program: 47 agencies, 90% reduction in reporting time, average 8 hours per week saved per agency."
    }
    
    headlines = generate_headline_variants(release_data["headline_hint"])
    print("HEADLINE OPTIONS:\n" + headlines + "\n")
    
    release = generate_press_release(release_data)
    save_press_release(release, "press-release-pulse-launch.md")
    print(release)

What to Build Next

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems