Monthly content planning was exhausting.
The problem:
- 6-8 hours monthly planning
- Staring at blank calendars
- Running out of ideas midweek
- Inconsistent themes
- Last-minute scrambling
- No strategic direction
Stressful and time-consuming.
Then I built an AI content planner.
Now:
- 90-day calendar in 30 minutes
- Strategic themes automatically
- Never run out of ideas
- Cohesive messaging
- Zero scrambling
- Clear direction
Here's the system.
The AI Content Planner
Complete 90-day calendar creation:
import openai
from datetime import datetime, timedelta
import json
class AIContentPlanner:
def __init__(self):
self.client = openai.OpenAI()
def create_90_day_plan(
self,
niche: str,
target_audience: str,
goals: List[str],
platforms: List[str]
):
prompt = f"""
Create comprehensive 90-day content plan:
NICHE: {niche}
TARGET AUDIENCE: {target_audience}
GOALS: {json.dumps(goals, indent=2)}
PLATFORMS: {json.dumps(platforms, indent=2)}
Create strategic 90-day plan with:
- Monthly themes (3 months)
- Weekly content buckets
- Daily content ideas (90 ideas)
Return as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
response_format={"type": "json_object"}
)
plan = json.loads(response.choices[0].message.content)
print("✅ 90-day plan created\n")
return plan
def generate_daily_content_ideas(
self,
theme: str,
num_days: int = 30,
platforms: List[str] = None
):
prompt = f"""
Generate {num_days} daily content ideas:
THEME: {theme}
PLATFORMS: {json.dumps(platforms or ['twitter', 'linkedin', 'instagram'], indent=2)}
For each day, create specific topic/angle and format.
Return as JSON array of {num_days} daily ideas.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.8,
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
ideas = result.get('daily_ideas', [])
print(f"✅ Generated {len(ideas)} daily ideas\n")
return ideas
def build_content_calendar(
self,
plan: Dict,
start_date: Optional[datetime] = None
):
if not start_date:
start_date = datetime.now().replace(hour=0, minute=0, second=0)
calendar = {}
monthly_themes = plan.get('monthly_themes', [])
weekly_buckets = plan.get('weekly_content_buckets', [])
for day_offset in range(90):
current_date = start_date + timedelta(days=day_offset)
date_key = current_date.strftime('%Y-%m-%d')
month_num = day_offset // 30
week_num = day_offset // 7
theme = monthly_themes[month_num]
bucket = weekly_buckets[week_num]
calendar[date_key] = {
'date': date_key,
'day_of_week': current_date.strftime('%A'),
'theme': theme.get('theme', ''),
'content_slots': [],
'notes': ''
}
return calendar
def assign_content_to_calendar(
self,
calendar: Dict,
content_ideas: List[Dict]
):
dates = sorted(calendar.keys())
for i, date in enumerate(dates):
if i < len(content_ideas):
idea = content_ideas[i]
calendar[date]['content_slots'].append({
'topic': idea.get('topic', ''),
'format': idea.get('format', ''),
'platform': idea.get('platform', '')
})
return calendar
def identify_content_gaps(self, calendar: Dict):
content_types = {}
platforms = {}
for date, day_data in calendar.items():
for slot in day_data.get('content_slots', []):
fmt = slot.get('format', 'unknown')
content_types[fmt] = content_types.get(fmt, 0) + 1
plat = slot.get('platform', 'unknown')
platforms[plat] = platforms.get(plat, 0) + 1
prompt = f"""
Analyze calendar for gaps:
CONTENT TYPE DISTRIBUTION:
{json.dumps(content_types, indent=2)}
PLATFORM DISTRIBUTION:
{json.dumps(platforms, indent=2)}
Identify underrepresented content types and platforms.
Return as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.4,
response_format={"type": "json_object"}
)
analysis = json.loads(response.choices[0].message.content)
print("✅ Gap analysis complete\n")
return analysis
def create_batch_days(self, calendar: Dict):
prompt = f"""
Plan optimal batch creation schedule:
CALENDAR: 90 days of content
Create batch creation plan with:
- Weekly batch day
- Monthly planning day
- Content types to batch together
Return as JSON.
"""
response = self.client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
response_format={"type": "json_object"}
)
batch_plan = json.loads(response.choices[0].message.content)
print("✅ Batch plan created\n")
return batch_plan
def export_calendar(self, calendar: Dict, format: str = 'csv'):
if format == 'csv':
import csv
filename = f"content_calendar_{datetime.now().strftime('%Y%m%d')}.csv"
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Date', 'Day', 'Theme', 'Topic', 'Format', 'Platform'])
for date, day_data in sorted(calendar.items()):
for slot in day_data.get('content_slots', []):
writer.writerow([
date,
day_data.get('day_of_week', ''),
day_data.get('theme', ''),
slot.get('topic', ''),
slot.get('format', ''),
slot.get('platform', '')
])
print(f"✅ Exported to {filename}\n")
return filename
elif format == 'json':
filename = f"content_calendar_{datetime.now().strftime('%Y%m%d')}.json"
with open(filename, 'w') as f:
json.dump(calendar, f, indent=2)
print(f"✅ Exported to {filename}\n")
return filename
# Usage
planner = AIContentPlanner()
print("="*60)
print("AI CONTENT PLANNER")
print("="*60 + "\n")
plan = planner.create_90_day_plan(
niche="AI for Content Creators",
target_audience="Content creators, bloggers, entrepreneurs",
goals=["Grow email list", "Increase engagement", "Launch course"],
platforms=["twitter", "linkedin", "instagram", "youtube"]
)
daily_ideas = planner.generate_daily_content_ideas(
theme=plan.get('monthly_themes', [{}])[0].get('theme', 'AI Content Creation'),
num_days=90,
platforms=["twitter", "linkedin", "instagram"]
)
calendar = planner.build_content_calendar(plan)
calendar = planner.assign_content_to_calendar(calendar, daily_ideas)
gap_analysis = planner.identify_content_gaps(calendar)
batch_plan = planner.create_batch_days(calendar)
planner.export_calendar(calendar, format='csv')
print("✅ 90-day content calendar ready!")
Content Planning Framework
Strategic approach:
- Month 1: Foundation (60% educational)
- Month 2: Engagement (40% interactive)
- Month 3: Conversion (30% social proof)
Progression builds trust → action.
Content Mix Formula
- Monday: Educational
- Tuesday: Behind-the-scenes
- Wednesday: Engagement (question/poll)
- Thursday: How-to/Tutorial
- Friday: Inspiration/Story
- Saturday: User-generated content
- Sunday: Curated/Roundup
Variety prevents fatigue.
Tools & Costs
Planning stack:
- ChatGPT Plus: $20/month - Planning & idea generation
- Notion/Airtable: Free-$10/month - Calendar management
- Trello (optional): Free - Visual planning
Total: $20-30/month
My Results
Before AI:
- 6-8 hours monthly planning
- 1 month ahead
- Constant stress for ideas
- Reactive, scattered strategy
- Consistency: 60-70%
- Running out of ideas weekly
After AI:
- 30 minutes quarterly
- 90 days ahead
- Done once/quarter
- Cohesive, intentional strategy
- 100% consistency
- Never run out of ideas
Impact: 95% time saved (6-8 hours/month → 30 min/quarter)
Getting Started
This week:
Day 1: Define Strategy (1 hour)
- Business goals
- Target audience
- Key messages
- Platforms
Day 2: Create 90-Day Plan (30 min)
- Use AI to generate plan
- Monthly themes
- Weekly buckets
- Daily ideas
Day 3: Build Calendar (30 min)
- Assign ideas to dates
- Check for gaps
- Adjust mix
Day 4: Set Up Batch Days
- Schedule creation time
- Prepare resources
- Plan workflow
Day 5-7: Create First Week
- Batch create Week 1
- Get ahead
- Build momentum
Common Mistakes
- No themes → scattered results
- Too promotional → build trust first
- Overly ambitious → start conservative, quality > quantity
- Set and forget → review monthly, adjust
- No batch creation → planning ≠ creating
Results: 95% time saved (6-8 hours/month → 30 min/quarter), 100% consistency, better strategic alignment.
Use AI for content planning.
Build 90-day calendars in 30 minutes.
Never scramble for ideas again.
