AI Content Planning: Build a 90-Day Content Calendar in 30 Minutes
Back to Blog
Planning2026-03-08· 9 min read

AI Content Planning: Build a 90-Day Content Calendar in 30 Minutes

Content planning took 6-8 hours monthly. AI planning system now creates 90-day calendars in 30 minutes—strategically planned with zero gaps.

#content planning#AI automation#content calendar#strategy#productivity

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

  1. No themes → scattered results
  2. Too promotional → build trust first
  3. Overly ambitious → start conservative, quality > quantity
  4. Set and forget → review monthly, adjust
  5. 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.

Check out my real AI tools at axon.nepa-ai.com