# Snapgen Marketing Tracker

> Build a 90-day marketing + content tracker Excel file for a SaaS product or indie app, pre-filled with 180 main weekday tweets + 50 weekend bonus tweets across 9 content pillars, a Media Production Queue, Content Mix Rules, and an automated QA Check sheet. Use this whenever the user asks to create a marketing plan, launch plan, content calendar, Twitter/X plan, build-in-public plan, 90-day tracker, or similar multi-week content strategy for a product. Also use when a user says "apply the Screenify marketing template to [my product]", "generate tweets for my launch", or "build me a content tracker like the one you made before". The output is a single .xlsx file with 12 sheets, ~211 formulas, data validation dropdowns, conditional formatting, and embedded usage instructions. Produces concrete, publishable tweet text (not placeholders) customized to the user's product, with every day of the 13-week timeline filled (weekdays 3 slots, weekends 2 slots).

- Skill: `hoangaviet/snapgen-marketing-tracker` (Agent Skill, multi-file: 15 files)
- Install (CLI): `npx skillmds@latest add hoangaviet/snapgen-marketing-tracker`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hoangaviet/snapgen-marketing-tracker/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: HoangAViet (https://skillmd.com/u/hoangaviet)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/hoangaviet/snapgen-marketing-tracker

---


# Marketing Tracker Builder

## What this skill does

Builds a complete 90-day marketing tracker as an Excel file (.xlsx) with:

- **180 main weekday tweets** — 12 weeks × 5 days (Mon-Fri) × 3 tweets/day, distributed across 9 content pillars
- **50 weekend tweets** — 25 weekend days × 2 slots/day, auto-filled from 45 evergreen bonus pool (Community Question / Tips & Craft / Indirect Insight)
- **12 sheets** — README, QA Check, Daily Tracker, Metrics Dashboard, Tweet Templates, Outreach CRM, Asset Library, Weekly Review, Content Mix Rules, Media Queue, Bonus Content Pool, Weekly Calendar
- **Automated QA Check** — 42 live formulas validating consistency (e.g., Feature Showcase tweets must have Video/GIF, Competitor tweets must never post from brand account, etc.)
- **Media Production Queue** — 30 P0/P1 media assets cross-referenced with the Daily Tracker
- **Embedded README** — usage instructions inside the workbook

The tweets are **fully written, ready-to-publish text** customized to the user's product — not placeholders. This is the key value: the skill pre-generates content so the user only has to review, edit, and post.

## When to use

Trigger this skill when the user asks any of:
- "Tạo kế hoạch marketing 90 ngày cho [product]"
- "Build me a content calendar for my SaaS launch"
- "Generate 90 days of tweets for build-in-public"
- "Apply the Screenify template to my product"
- "Create a launch tracker like before"
- Any request mentioning "90-day plan", "content tracker", "Twitter plan", "marketing calendar" for a specific product

## How to use this skill — workflow

This is a multi-step process. Do NOT skip straight to running scripts. Quality of output depends entirely on how well you understand the user's product first.

### Step 1: Interview the user

Read `references/interview_questions.md` and ask the user the essential questions (marked REQUIRED). For optional ones, use judgment — ask if the answer isn't obvious from context. Use the `AskUserQuestion` tool in batches (group related questions into one tool call with multiple questions).

Collect at minimum:
- Product name + one-line description
- How long they've been building (months/years — this anchors the "build-in-public" narrative authentically)
- Target audience (creators? developers? marketers? SMB owners?)
- Top 3-5 differentiating features (ones competitors don't have)
- 2-4 direct competitors + how the product is positioned against them
- Pricing model
- Launch channels (Product Hunt? Twitter? LinkedIn? Reddit?)
- Founder's public identity (personal Twitter handle + brand account handle if exists)
- Primary language for tweets (English default, but can be Vietnamese or other)

### Step 2: Read the reference docs

Before writing any content, read all four reference files:
- `references/pillars.md` — 9 content pillars, voice rules, and sample tweets per pillar
- `references/writing_guide.md` — how to write good tweets for each pillar, length rules, hooks, what to avoid
- `references/structure.md` — Excel structure, sheet-by-sheet layout, formula architecture
- `references/interview_questions.md` — the full question list

These encode hard-won patterns. Don't skim — read them fully.

### Step 3: Examine the example output

Open `assets/example-screenify-tracker.xlsx` (use the Read tool with openpyxl via a short Python snippet, or describe its structure from `references/structure.md`). This is the working output for Screenify Studio. Study the tone, length, and specificity of tweets there — your output should match that quality bar, but customized to the user's product.

### Step 4: Adapt the 6 build scripts

The `scripts/` folder contains 6 Python scripts (`01_scaffold.py` through `06_bonus_pool.py`) that were originally written for Screenify Studio. They produce the example file in `assets/`.

Your job: **copy each script to a working directory, then rewrite the content inside each script to reflect the user's product**. The scaffolding code (workbook creation, formatting, formulas, validations) should stay untouched. Only change the string content.

Specifically, you need to rewrite these content sections:

| Script | Content to rewrite |
|--------|-------------------|
| `01_scaffold.py` | Week 1 tweets (`TWEETS` dict), founder bio placeholders, pricing references, headers, example rows in Tweet Templates / Asset Library / Outreach CRM |
| `02_fill_weeks.py` | Weeks 2-12 tweets (`WEEK_TWEETS` dict — 165 tweets total) |
| `03_accounts_narrative.py` | Opening narrative tweets (Week 1 Monday T1, T2), Personal/@Brand account mapping, Account Strategy section |
| `04_media.py` | Media Queue descriptions (30 rows) — must match the actual tweet content for cross-references to work |
| `05_qa_check.py` | Usually no content changes needed — keep formulas as-is |
| `06_bonus_pool.py` | 45 bonus tweets (`bonus_tweets` list — 15 per pillar) |
| `07_readme_weekends.py` | 4 customization vars at top: `PRODUCT_NAME`, `START_DATE_STR`, `END_DATE_STR`, `WEEK_COUNT`, `NORTH_STAR` |
| `08_reply_opportunities.py` | Top-of-file vars: `PRODUCT_NAME`, `PRODUCT_URL`, `ONE_LINER`, `PRICING`, `FEATURES[]`, `COMPETITORS[]`, `PLACEHOLDER{}`. Rewrite the 73 reply templates (12 categories: WIB, PITCH, SHIP, MRR, PROB, LINK, RT, GM, FB, SEARCH, WIN, STACK) to reference user's product specifics. Replace the 30 target accounts + 35 search keywords with ones relevant to user's niche. |

**Content customization rules:**
- Replace every "Screenify" with user's product name
- Replace features (Rust+Metal, 3.1x export, Auto-Zoom, AI captions, 3D templates, etc.) with user's actual features
- Replace competitors (Loom, Screen.Studio, Tella, Cap) with user's actual competitors
- Replace the "4 months building" narrative with the user's actual timeline
- Replace pricing ($9/mo, $149 lifetime) with user's actual pricing
- Replace example numbers (288 emails, 54% open rate, $520 MRR) with plausible numbers appropriate to their stage — flag these clearly as "YOUR NUMBERS HERE" if you don't know them
- Preserve the pillar distribution ratios (Build-in-Public 30%, Feature Showcase 20%, Tutorial 15%, etc.)
- Preserve the Daily Tracker row count (94 rows: header + 93 tweet slots across 12 weeks)

**DO NOT change:**
- Sheet structure, column counts, formula references, QA rules
- Pillar names (the 9 pillars: Build-in-Public, Feature Showcase, Tutorial, Behind-the-Scenes, Customer Stories, Competitor Comparison, Community Question, Tips & Craft, Indirect Insight)
- Media Queue row count (30)
- Bonus pool tweet count (45 = 15 × 3 new pillars)

### Step 5: Run scripts in order

After adapting all scripts, run them sequentially. Each one modifies the Excel file from the previous step:

```bash
cd /sessions/gracious-jolly-dijkstra  # or wherever you're working
python3 scripts/01_scaffold.py          # creates workbook + Week 1
python3 scripts/02_fill_weeks.py        # fills Weeks 2-12
python3 scripts/03_accounts_narrative.py  # adds Posted As columns + narrative fix
python3 scripts/04_media.py             # adds media tracking + Media Queue sheet
python3 scripts/05_qa_check.py          # adds QA Check sheet
python3 scripts/06_bonus_pool.py        # adds 3 new pillars + Bonus Content Pool
python3 scripts/07_readme_weekends.py <output.xlsx>  # rewrites README + fills 50 weekend slots
python3 scripts/08_reply_opportunities.py <output.xlsx>  # adds Reply Templates + Targets + Log
```

**Step 8 adds reply-opportunity system** — 3 new sheets that handle the "reactive" side of Twitter/X growth (replying to other people's opportunity threads, not just posting your own content):
- **Reply Templates** (73 templates, 12 categories, color-coded) — copy-paste replies for threads like "GM what are you building?", "Pitch your product", "Drop your link", "Show MRR", "I'll RT best X", etc.
- **Reply Targets** — 30 accounts to follow with notifications ON + 35 search keywords with intent classification (🔥 High / 🟡 Medium / 🔵 Low)
- **Reply Log** — 90 pre-filled daily rows to track replies sent, profile clicks, followers gained, DMs, signups, with 8 auto-metric formulas at the top

**Step 7 is critical** — it patches two gaps left by scripts 01-06:
1. README sheet from scripts 01-06 only documents 7 sheets but the file has 12 — script 07 rewrites README with full documentation (all 12 sheets + 9 pillars + account strategy + weekday/weekend routines + red flags + troubleshooting, ~111 rows)
2. Bonus Content Pool has 45 tweets sitting isolated — script 07 schedules 50 slots across 25 weekend days (13 Sat + 12 Sun), rotating the 3 bonus pillars `[(CQ,TC), (II,CQ), (TC,II)]` × 2 slots/day

Before running, edit the 4 customization vars at the top of `07_readme_weekends.py`:
- `PRODUCT_NAME` — all caps, e.g. "SCREENIFY STUDIO"
- `START_DATE_STR` — e.g. "2026-04-06 (Monday)"
- `END_DATE_STR` — e.g. "2026-07-05 (Sunday)"
- `WEEK_COUNT` — default 13
- `NORTH_STAR` — one-line goal, e.g. "First 50 paying users ($500-1500 MRR) by Day 90"

Check for errors after each step. Most common issue: merged-cell errors when inserting columns (see how `03_accounts_narrative.py` handles `unmerge_cells` before `insert_cols`).

### Step 6: Verify the output

After all 7 scripts run, verify the file is valid:

1. Run formula recalc: `python3 scripts/recalc.py <path-to-output.xlsx>` → should report `"total_errors": 0` and roughly 211 formulas. (`recalc.py` is bundled in this skill's `scripts/` folder — no external dependencies needed.)
2. Open the QA Check sheet (first tab) — Health Score should be ≥90%. The only expected warnings are `P0 media tasks still TODO` and `P1 media tasks still TODO` (these are warnings by design, not failures).
3. Spot-check 5-10 tweets across different weeks and pillars to confirm they're specific, publishable, and match the user's product voice.

### Step 7: Share with user

Save the final file to the user's Cowork workspace folder and share with a `computer://` link. Give a brief summary of:
- Total tweets generated (should be 225: 180 main + 45 bonus)
- Pillar distribution
- QA health score
- Where the README is (first tab labeled "QA Check" has overall status; detailed usage lives inside the workbook sheets)

## Pillar distribution targets

These ratios are hard-coded in the scripts. Do not rebalance without user confirmation — they represent validated content mix for an indie SaaS build-in-public launch:

| Pillar | % of main 180 | Purpose |
|--------|---------------|---------|
| Build-in-Public | 25-30% | Narrative thread, daily progress, vulnerability |
| Feature Showcase | 15-20% | Product capability demos (requires Video/GIF) |
| Tutorial | 10-15% | Workflow/how-to (requires Video/GIF) |
| Behind-the-Scenes | 10% | Process, decisions, mistakes |
| Customer Stories | 10% | Social proof, user quotes |
| Competitor Comparison | 5% | Positioning (Personal account ONLY) |

Bonus pool (3 additional pillars × 15 tweets = 45 evergreen):
| Pillar | Purpose | Account |
|--------|---------|---------|
| Community Question | Ask audience, prompt replies | Personal only |
| Tips & Craft | Craft tips adjacent to product domain | Either |
| Indirect Insight | Thought leadership, opinions | Personal only |

## Account strategy defaults

Hard rule (enforced by QA Check):
- **Competitor Comparison** → Personal account only (brand comparing itself to competitors feels desperate)
- **Community Question** → Personal only (brand asking questions feels corporate)
- **Indirect Insight** → Personal only (opinions belong to humans)
- **Feature Showcase, Tutorial** → Brand account primary, can cross-post
- **Build-in-Public** → 80% Personal, 20% Both (RT)
- **Customer Stories** → Brand primary

## Watch-outs

- **Do not fabricate specific user quotes or metrics.** When the example has things like "Beta tester Sarah said X" or "$520 MRR", replace these with generic placeholders like "[USER QUOTE HERE]" or "[YOUR MRR]" UNLESS the user provided those numbers.
- **Watch the narrative timeline.** If the user just started building, don't open with "4 months heads-down building in a cave" — use their actual timeline.
- **Media Queue cross-references.** Rows 10 and 13 of the Media Queue refer to specific tweets by week/day — if you change which tweets have video media, update these accordingly, or the QA Check will fail.
- **Currency and pricing.** Default scripts use USD. For other currencies, update pricing strings in both Daily Tracker tweets AND Content Mix Rules.

## If scripts fail

Common issues and fixes:
- `KeyError: (row, col)` on insert_cols → unmerge merged cells BEFORE inserting (see `03_accounts_narrative.py` for pattern)
- `unhashable type: 'StyleProxy'` → don't do conditional font assignment in one line; use if/else blocks
- Formulas showing stale values → run the `recalc.py` script from the xlsx skill
- Off-by-N references after `insert_rows` → openpyxl does NOT update formula references automatically; any formula referencing a shifted row must be manually updated

## Output location

Save the final .xlsx to the user's Cowork workspace folder (typically `/sessions/<session-id>/mnt/<Folder Name>/`). Name the file `<ProductName>-90-Day-Tracker.xlsx`.

