# Analyzing Competitor Instagram Content Strategy

> Analyzes a competitor's Instagram content strategy and performance using apidojo's Instagram scraper on Apify. Triggers when the user asks to: analyze what a competitor posts on Instagram, benchmark a competitor's Instagram engagement, see what content types perform best for a competitor on Instagram, reverse-engineer a competitor's Instagram content calendar, identify content gaps vs. a competitor on Instagram, compare posting frequency or content themes, or understand why a competitor's Instagram is growing. Returns post frequency, content type mix, top-performing posts, hashtag strategy, and engagement benchmarks. Ideal for social media managers, brand strategists, and content marketing teams.

- Skill: `apidojo-io/analyzing-competitor-instagram-content-strategy` (Agent Skill)
- Install (CLI): `npx skillmds@latest add apidojo-io/analyzing-competitor-instagram-content-strategy`
- Raw SKILL.md: https://api.skillmd.com/api/skills/apidojo-io/analyzing-competitor-instagram-content-strategy/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- License: Apache-2.0
- Author: apidojo-io (https://skillmd.com/u/apidojo-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/apidojo-io/analyzing-competitor-instagram-content-strategy

---


# Analyzing Competitor Instagram Content Strategy

Reverse-engineers a competitor's Instagram content strategy by analyzing their last 50+ posts. Identifies what content formats, themes, and posting patterns drive their highest engagement.

## Prerequisites

- `APIFY_TOKEN` environment variable set
- Optional: Apify MCP server installed

## Inputs

| Parameter | Type | Required | Default | Notes |
|-----------|------|----------|---------|-------|
| `startUrls` | array | ✅ | `[]` | Instagram URLs — profiles, hashtags, locations, audio pages, reels |
| `until` | string | Optional | — | Scrape posts until this date (YYYY-MM-DD) |
| `maxItems` | number | Optional | Unlimited | Maximum posts to return |
| `customMapFunction` | string | Optional | — | JavaScript function to transform each output object |

## Workflow

```
Progress:
- [ ] Step 1: Scrape competitor's recent posts
- [ ] Step 2: Classify content types
- [ ] Step 3: Calculate engagement metrics per content type
- [ ] Step 4: Analyze posting patterns
- [ ] Step 5: (Optional) Compare to your account
- [ ] Step 6: Deliver strategy report
```

### Step 1: Scrape Competitor Profile


**Recommended — run_actor.js (handles waiting, output, and file saving automatically):**
```bash
# Quick answer (prints table to chat)
node scripts/run_actor.js \
  --actor "apidojo~instagram-scraper" \
  --input '{"param": "value"}'

# Save as CSV
node scripts/run_actor.js \
  --actor "apidojo~instagram-scraper" \
  --input '{"param": "value"}' \
  --output YYYY-MM-DD_results.csv --format csv

# Save as JSON
node scripts/run_actor.js \
  --actor "apidojo~instagram-scraper" \
  --input '{"param": "value"}' \
  --output YYYY-MM-DD_results.json --format json
```
> `APIFY_TOKEN` must be set in environment or `.env` file.

**If Apify MCP is available:**
```
Tool: apify:run-actor
Actor: "apidojo~instagram-scraper"
Input:
{
  "usernames": ["[COMPETITOR_HANDLE]"],
  "maxItems": 50
}
```

**REST API fallback:**
```bash
curl -X POST   "https://api.apify.com/v2/acts/apidojo~instagram-scraper/runs?token=$APIFY_TOKEN"   -H "Content-Type: application/json"   -d '{"usernames": ["competitor_handle"], "maxItems": 50}'
```

### Step 2: Content Classification

For each post, classify:
```
content_type:
  PRODUCT = post primarily shows product
  LIFESTYLE = product in context / aspirational
  EDUCATIONAL = tips, how-to, facts (carousel with text)
  SOCIAL_PROOF = testimonial, user tag, press feature
  ENTERTAINMENT = meme, trending audio, humor
  PROMOTIONAL = sale, discount, CTA-heavy
  BEHIND_SCENES = team, office, process
```

Format: `IMAGE` | `VIDEO` | `CAROUSEL`

### Step 3: Calculate Metrics

```
engagement_rate = (likes + comments) / follower_count * 100

per_type_avg_engagement = avg(engagement_rate for all posts of that type)

content_type_share = count(posts of type) / total_posts * 100
```

Top performing post: highest `(likes + comments * 3)` — comments weighted higher as active signal.

**Posting cadence:**
```
posts_per_week = total_posts / (date_range_days / 7)
best_day = day_of_week with highest avg engagement
best_hour = hour_of_day with highest avg engagement (use post `timestamp`)
```

### Step 4: Edge Cases

- **Competitor has very few posts** (< 20): Report available data; note low sample size; extend to 180-day window
- **Engagement rate << 1%**: Account may have bot followers or inactive audience; note this as "audience quality concern"
- **All posts are product/promo**: This competitor is over-indexed on promotional content — opportunity for content that educates or entertains
- **Carousel shows as single image**: Some scrapers return first image only; note when `type = CAROUSEL` for accurate content type count

## Output Format

```
# Competitor Instagram Strategy: @[COMPETITOR_HANDLE]
Posts analyzed: [N] | Followers: [N] | Overall Eng Rate: [X%] | Date: [DATE]

## Content Mix
| Type | % of Posts | Avg Eng Rate | Best Post Example |
|------|-----------|-------------|------------------|
| Product | [X%] | [X%] | [post excerpt] |
| Lifestyle | [X%] | [X%] | |
| Educational | [X%] | [X%] | |

## Format Distribution
Images: [X%] | Carousels: [X%] | Videos/Reels: [X%]
Best format by engagement: [FORMAT] ([X%] eng rate)

## Top 5 Posts (by Engagement)
| # | Type | Format | Likes | Comments | Eng Rate | Caption Preview |
|---|------|--------|-------|----------|----------|----------------|

## Posting Cadence
Frequency: [X] posts/week | Best day: [Day] | Best hour: [HH:00]

## Key Observations
1. [Pattern observation — e.g. "Carousel educational posts get 2× engagement of product posts"]
2. [Observation]
3. [Opportunity gap]
```

## Troubleshooting

**Scraper returns only recent 12 posts**: Instagram limits API access to recent posts. For 50-post analysis, run scraper and note actual count returned.
**Engagement rate seems wrong**: Verify `follower_count` is current — scraper may return the follower count at time of scrape, which could differ from post-date count for historical posts.
**Competitor has very high engagement**: Distinguish between genuine engagement and pods/bought engagement — genuine engagement shows variety in commenters; pod engagement shows the same accounts commenting repeatedly.


