How to Create AI-Powered Press Release Drafts
Draft professional press releases using AI templates and company data.
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
- Python 3.10 or higher
- Anthropic API key
- Your company boilerplate in a text file
pip install anthropic python-dotenv
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
- Build a PR distribution list manager that tracks which journalists cover your beat and personalizes outreach for each release
- Add a media monitoring integration that tracks when your releases get picked up and measures coverage
- Create a press release archive system that tags releases by type and stores them for future reference
Related Reading
- How to Build an AI Blog Post Generator - Turn press releases into long-form announcement posts
- How to Create Automated Content Performance Reports - Track press release pickup rates and media coverage metrics
- How to Create an AI-Powered FAQ Generator - Generate media FAQ sheets for each major announcement
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