Mixpanel build boards
Skill jimmynotjames/simple-recurring-budgets/.cursor/skills/mixpanel-build-boards
Wren: An iOS app for fast, easy budgeting on the go
npx -y skills add jimmynotjames/simple-recurring-budgets --skill mixpanel-build-boardsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Build, edit, or reconcile Mixpanel dashboards ("boards") in the Wren App - Prod project through the Mixpanel MCP. Use when asked to create or update analytics dashboards/boards, ship the Phase 1 (or Phase 2) board set, swap one report for another, or reconcile boards against docs/analytics-spec.md §11. Drives the Mixpanel MCP (Get-Business-Context → Run-Query → Create-Dashboard / Update-Dashboard), treats docs/analytics-spec.md §11 plus live Mixpanel as the source of truth, and handles the Free-vs-Growth saved-report cap. Does NOT decide what to measure — that is owned by the analytics spec. Invoked via /mixpanel-build-boards.
SKILL.md
8.3 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
Build Mixpanel boards
Create, edit, and reconcile Mixpanel boards (dashboards) for the Wren app through the
Mixpanel MCP. This skill is the how — the MCP procedure plus the Wren-specific
coordinates and cap rules. It is deliberately not the what: which boards exist and
what they measure is owned by docs/analytics-spec.md §11 (with §3 product questions, §9
events, §10 properties, §5 PII contract). Do not duplicate that content here — reference it.
Source of truth, in order: live Mixpanel state → docs/analytics-spec.md → this skill.
On any mismatch, Mixpanel and the spec win; update the spec (and this skill) to match —
never the reverse.
When to use
"Build the Phase 1 / Phase 2 boards", "add a dashboard for X", "reconcile the boards with the spec", "swap report Y for Z", "the boards drifted from the doc".
Projects (Wren)
| Project | project_id | workspace_id | Role |
|---|---|---|---|
| Wren App - Prod | 4036089 | 4532359 | Canonical. Fed by App Store + TestFlight. Build here. |
| Wren App - Dev | 4036090 | 4532360 | Scratchpad for experiments; not tracked in the spec. |
Ids are stable but re-confirm with Get-Projects (a renamed/recreated project changes them).
Recipe
- Business context first. Call
Get-Business-Context(passproject_id) as the FIRST Mixpanel MCP call — the server requires it. ThenGet-Projectsto confirm the Prod id. - Read the spec. From
docs/analytics-spec.md: §11.3 / §11.4 (which boards to build + the Free-tier survivors), §11.2 (board-writing conventions), §9 / §10 (canonical event + property names), §5 (PII allow/deny). Build against the canonical names even when no data has arrived yet — empty boards populate as events flow. - Check the live schema.
Get-EventsandList-Propertieson Prod to see what exists. Missing events/properties are fine:Run-Queryaccepts not-yet-seen events and returns empty results (no error), so forward-looking boards are valid. - Learn the query shape. For anything past a trivial single-metric insight, call
Get-Query-Schemafor the report type (insights|funnels|retention|flows) before assembling thereportobject. - Mint the reports. For each tile,
Run-Querywithskip_results: trueto get aquery_id(don't pull results you won't read). Onequery_idper tile. Keep parallel batches small (≤4) to avoid 502s. - Assemble the board.
Create-Dashboardwith rows: a one-line framing text card (row 1) +reportcells referencing thequery_ids (≤4 cells/row, ≤30 rows). To extend an existing board,Update-Dashboard— add a row withrows: [["temp-row","add"]]and a cell withcells: [["temp-cell","create","report",{row_id,query_id,name,description}]]. Get cell/row ids first withGet-Dashboard(include_layout=true). - Verify + reconcile.
Search-Entities(dashboards + report types) to confirm board and report counts, then updatedocs/analytics-spec.md§11.3 status + revision history.
Board-writing conventions (spec §11.2)
- Write for a human reader: short, plain names/descriptions about the user behavior, with
one
§3.xdoc ref. No phase numbers, ticket ids, "built via MCP", or filter mechanics in names/descriptions. - One short framing text card per board; don't over-explain.
- Don't force what the MCP can't express — drop a minor aspect rather than build an awkward proxy, or leave a one-line self-service note for a human to finish in the Mixpanel UI.
- Never put a PII / deny-listed field (§5) into a query: no
ExpenseItemfields, no free-text beyondbudget_name, no money beyondbudget_allocation_amount.
Plan & the saved-report cap (decide before adding reports)
The current plan (Free vs Growth) is recorded in spec §11.2 — read it there; do not hardcode it here.
- Growth plan: unlimited saved reports ($0/month under the 1M-events/month free allotment, then $0.28 per 1K). Build the full set freely.
- Free plan: 5 saved reports per project, per user (every chart tile = one saved
report; boards and text cards are free). When on Free:
- Keep only the 5 survivors listed in spec §11.4; delete every other tile.
- Free a slot before adding one:
Update-Dashboardwith a["cell-id","delete"]cell frees that report's slot;Delete-Dashboardfrees all of a board's slots. There is no standalone delete-report MCP tool. - Confirm any swap with the maintainer — survivors were chosen as highest-value.
- Detect the cap empirically:
Create-Dashboard/Update-Dashboardrejects withUser has reached their limit of saved reports for this projectwhen you'd exceed 5.
MCP tool permissions (what runs unattended vs. prompts)
The Mixpanel MCP tools are allowlisted in .claude/settings.json by blast radius, so
this skill's read path and routine board authoring run without permission prompts, while
destructive or project-wide writes still stop for confirmation:
- Allowlisted — run unattended:
- All read-only tools — every
Get-*,List-*,Search-*,Display-Query,Find-Duplicate-Event-Groups,Explain-*, and*-Guidancehelper (covers the entire recipe's read path). - Board/metric authoring (single-entity, reversible):
Create-Dashboard,Update-Dashboard,Duplicate-Dashboard,Create-Metric,Update-Metric.
- All read-only tools — every
- Not allowlisted — always prompts (deliberate confirmation points):
- Destructive:
Delete-Dashboard,Delete-Tag. A delete-based slot swap on the Free cap (above) therefore prompts — which is the intended maintainer-confirm gate for dropping a survivor tile. - Project-wide taxonomy rewrites:
Edit-Event,Edit-Property,Bulk-Edit-Events,Bulk-Edit-Properties,Merge-Event-Group. - Global / out-of-scope:
Update-Business-Context, and all experiment / feature-flag writes (not used by this workflow).
- Destructive:
When adding new Mixpanel tools to the allowlist, keep this boundary: read-only always; single-entity board/metric writes yes; deletes, taxonomy rewrites, business-context, and experiment/flag writes stay prompting.
Gotchas
- First MCP call must be
Get-Business-Context— the server requires it. - Unattached
Run-Querydrafts don't persist as saved reports — they don't appear inSearch-Entitiesand don't count against the Free cap. Aquery_idstill survives a brief outage long enough to attach to a board. - Auto-generated "🌱 Starter Board" reports are owned by the Mixpanel system user, so they don't count against the Free quota; delete the Starter Board if it clutters Prod.
- The Free cap is per project — deleting reports/boards in Dev or other projects frees nothing in Prod.
- Transient 502s under burst load — the MCP endpoint throttles; both reads and writes can
502 during a blip. Keep parallel batches ≤4, back off, and retry (attached reports and
in-flight
query_ids survive). $session_start/$session_endexist even though the app setstrackAutomaticEvents: false— Mixpanel sessionizes server-side, so sessions ≈ clusters ofapp_opened.
After building
- Reconcile
docs/analytics-spec.md: §11.3 (board status), §11.4 (survivor set), and the revision-history table to match live Mixpanel. - If the plan or cap facts changed, update spec §11.2 and the
reference_mixpanel_free_report_capmemory so future sessions branch correctly.