agentleFS
Come-In-LabsCome-In-Labs/agent-skills/skills/analytics/SKILL.md

analytics

Skill2 starsChanged 9 days agoMITView on GitHub

Use when someone asks how a product is doing in numbers - "recheck analytics", "give me an update on the numbers", signups, active users, DAU/WAU, retention, cohorts, activation, feature adoption, funnels, follow or social graph, game, challenge or campaign numbers, "did the holdout / A/B test / experiment work", "how many of X also did Y", "is signup broken or just quiet", a partner's numbers question about their campaign, or a numbers report, weekly update or one-pager to pass on to the team, investors or a partner.

70 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use popups, free-tools and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • CesarjoquinSkill

    popups

    When the user wants to create or optimize popups, modals, overlays, slide-ins, or banners for conversion purposes. Also use when the user mentions "exit intent," "popup conversions," "modal optimization," "lead capture popup," "email popup," "announcement banner," "overlay," "collect emails with a popup," "exit popup," "scroll trigger," "sticky bar," or "notification bar." Use this for any overlay or interrupt-style conversion element. For forms outside of popups, see cro. For general page conversion optimization, see cro.

    Also in 23 projects that use this

  • CesarjoquinSkill

    free-tools

    When the user wants to plan, evaluate, or build a free tool for marketing purposes — lead generation, SEO value, or brand awareness. Also use when the user mentions "engineering as marketing," "free tool," "marketing tool," "calculator," "generator," "interactive tool," "lead gen tool," "build a tool for leads," "free resource," "ROI calculator," "grader tool," "audit tool," "should I build a free tool," or "tools for lead gen." Use this whenever someone wants to build something useful and give it away to attract leads or earn links. For downloadable content lead magnets (ebooks, checklists, templates), see lead-magnets.

    Also in 24 projects that use this

  • coreyhaines31Skill

    marketing-council

    When the user wants multiple expert perspectives on a marketing question — a simulated board of advisors staffed by legendary marketers (Seth Godin, David Ogilvy, Eugene Schwartz, April Dunford, Rory Sutherland, Alex Hormozi, Byron Sharp, and more). Also use when the user mentions 'marketing council,' 'board of advisors,' 'advisory board,' 'what would Seth Godin say,' 'what would Ogilvy think,' 'channel Hormozi,' 'get multiple perspectives,' 'debate this,' 'have the council review,' 'marketing mentors,' or asks how a famous marketer would approach their problem. The council gives each advisor's take through their documented frameworks, surfaces where they disagree, and synthesizes a recommendation. For executing the winning direction, hand off to positioning, offers, copywriting, ads, or the relevant skill.

    Also in 19 projects that use this

  • roerohanSkill

    emails

    When the user wants to create or optimize an email sequence, drip campaign, automated email flow, or lifecycle email program. Also use when the user mentions "email sequence," "drip campaign," "nurture sequence," "onboarding emails," "welcome sequence," "re-engagement emails," "email automation," "lifecycle emails," "trigger-based emails," "email funnel," "email workflow," "what emails should I send," "welcome series," or "email cadence." Use this for any multi-email automated flow. For cold outreach emails, see cold-email. For in-app onboarding, see onboarding.

    Also in 21 projects that use this

  • ukunal91appSkill

    community-marketing

    Build and leverage online communities to drive product growth and brand loyalty. Use when the user wants to create a community strategy, grow a Discord or Slack community, manage a forum or subreddit, build brand advocates, increase word-of-mouth, drive community-led growth, engage users post-signup, or turn customers into evangelists. Trigger phrases: "build a community," "community strategy," "Discord community," "Slack community," "community-led growth," "brand advocates," "user community," "forum strategy," "community engagement," "grow our community," "ambassador program," "community flywheel.

    Also in 26 projects that use this

  • coreyhaines31Skill

    marketing-loops

    When the user wants to set up a recurring, self-running marketing workflow — a repeatable loop an AI agent runs on a cadence (weekly, daily, on a trigger) rather than a one-off task. Also use when the user mentions 'marketing loop,' 'recurring marketing workflow,' 'automate my marketing,' 'marketing on autopilot,' 'weekly marketing review,' 'ad fatigue check,' 'weekly ads check,' 'content refresh loop,' 'churn watch,' 'ranking drop alert,' 'run my SEO,' 'SEO operator,' 'daily SEO agent,' 'run my outbound,' 'AI SDR,' 'reply triage,' 'always-on marketing,' 'marketing automation workflow,' or 'run this every week.' Use this to pick, adapt, and schedule an ongoing marketing loop that orchestrates the other marketing skills. For one-off marketing ideas, see marketing-ideas. For the experimentation loop specifically, see ab-testing.

    Also in 10 projects that use this

  • +6 more from Cesarjoquin

The file

We split this skill into the rules it gives an agent

8 rules. 0 are common, 4 are distinctive, and 4 are very specific to this project.

  • 0

    Common

    Most of the 59 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If no profile exists, build one from the schema, the code and the docs.

    line 27
  2. Distinctive:

    Check concentration before reporting a total: If one account makes more than a fifth of it, say so.

    line 56
  3. Distinctive:

    Keep people out of the output: No names, emails or handles.

    line 60
  4. Very specific:

    Stay read-only: Use the replica, a read-only session (Postgres: PGOPTIONS='-c default_transaction_read_only=on') and a timeout.

    line 73
  5. Distinctive:

    Write in the owner's language.

    line 85
  6. Very specific:

    When the numbers go to anyone besides the owner (the team, investors, a partner), also write a Markdown file at …

    line 89
  7. Very specific:

    Keep new or fixed queries in .analytics/queries/.

    line 114
  8. Distinctive:

    Add any new trap or definition to the profile.

    line 115

“Common” is measured: kept by at least 6 in 10 of the 59 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Analytics: read the product's own numbers

Core principle

A number is an answer only with its definition, its denominator and the last read beside it. Read the system of record first (a read-only replica of the product database), say what changed since the last read, and keep randomized comparisons apart from correlations.

The profile comes first

Each project keeps one profile at .analytics/profile.md in the repo root (template: assets/profile.example.md), with saved queries in .analytics/queries/ and past reads in .analytics/snapshots/. Read the profile before any query. It holds what a cold start has to rediscover:

  • Sources and how to reach each one read-only: the connection recipe, never a secret.
  • Who is not a user: staff and admin, test, seeded or synthetic, system, bot or spam accounts. Find them in code: search for superadmin, staff, internal, synthetic, seed, demo, test, system, and the filters the product's own mailers already apply.
  • Active: the definition, and the table that records it. A per-day activity table beats a last_seen column, which is overwritten and has no history. It also beats consent-gated client analytics, which miss everyone who opted out.
  • Calendar: the business time zone, the week start, and which columns hold UTC.
  • Segments that change the story: market or region, platform, signup source.
  • Features, each with the table that proves it was used.
  • Experiments and holdouts: how the arms are assigned (a hash with a salt, a column, a flag), the split, the start date and the outcome window.
  • The base query (the exclusions plus the segments), and known traps.

If no profile exists, build one from the schema, the code and the docs. Show the owner the exclusions and the definition of "active" in a few lines and get them confirmed once. Ask before committing .analytics/, because snapshots hold business figures.

The standard read

"An update" or "recheck" means every block below. A narrower question still gets its denominator and its comparison. references/recipes.md has SQL for each block.

BlockWhat to pull
AccountsTotal by segment, new in 7 and 28 days, active in 7 days
SignupsPer week (about 10 weeks) and per day (10 to 14 days), by segment, platform and source
ActivityWeekly active people split into new and returning, daily active people for the last 10 days
RetentionSignup-week cohorts: came back in days 1-7, 8-14 and 22-28
ActivationThe key first actions within 7 or 14 days, per cohort
Feature useOf the N people active in 28 days, how many used each feature in 28 and in 7 days
Live objectsFor each running game, challenge or campaign: members, joined this week, did the core action, still opening the app
Social graphEdges, people with at least one, mutual pairs, new edges per week and the share reciprocated, the out-degree spread
ExperimentsFor each running holdout or A/B test: arms, n, outcome rates, the difference with its interval
Lifecycle messagesMails and pushes sent and delivered per run

Then answer what the owner asks next before they ask it:

  • Who drives the number? Concentration: the top actor's share.
  • How many of X also did Y? Overlaps between cohorts, games and campaigns.
  • Is it broken or just quiet? See below.

Rules for every number

  1. Exclude non-users as subjects and as actors. A staff account that follows every newcomer turns "got a follower in week 1" into a count of that account. Use real people in denominators too: "18 of 31 players" when the board shows 32, one of them staff.
  2. Put the denominator beside every rate: "16 of 17", not "94%". Below about 20, give counts only.
  3. Check concentration before reporting a total. If one account makes more than a fifth of it, say so.
  4. Compare like with like. Cohort rates use fully elapsed windows only. Mark the current day and week as partial. Compare equal window lengths and the same weekdays. Convert time zones explicitly.
  5. Observational is not causal. "People who did X in week 1 stayed" describes who chooses X. Only randomized arms support "X causes". Rebuild arm membership from the assignment rule, never from exposure: "got no mail" picks the unreachable.
  6. Read experiments whole. Take the eligible period from the code's history: when assignment started and when it was switched off (git log -S <salt>). Check that the control really went untreated. Measure every outcome in a fixed window per person ("back in days 8-14"), never "active in the last 7 days" counted from today, which mixes people of different ages. Give n per arm, both rates, the difference with a 95% interval, and the smallest effect this sample could detect (node scripts/two-proportions.mjs). A lift that fades in later windows is a finding of its own. One significant read is not a stopping rule.
  7. Keep people out of the output. No names, emails or handles. Use a short id prefix when one account must be singled out. A group figure needs at least 5 people, or the project's own floor.
  8. Explain jumps. More than twice the last snapshot needs a cause (a campaign, a launch, a bug, a changed definition) before it is reported as growth.

Before calling something broken

For zero signups or a sudden drop, check these before reporting an outage:

  • the auth and signup endpoints in the logs: errors, or requests that never came;
  • the traffic and its referrers in web analytics: did visitors arrive and stop at the first screen;
  • the window itself: a partial day, a quiet weekday, a holiday.

Safety

  • Stay read-only. Use the replica, a read-only session (Postgres: PGOPTIONS='-c default_transaction_read_only=on') and a timeout.
  • Inject secrets through the project's secret runner and never print them.
  • Close only the tunnels you opened.
  • Never write, backfill or "fix" data while reading it.

Report shape (to the owner)

  1. Headline: 2 to 4 sentences on what changed since the last read and what it means.
  2. The blocks in the standard order. Each is a short table or 2 to 4 bullets, with the previous read in brackets.
  3. Each experiment with a verdict: lift, no detectable lift, or too small to tell.
  4. Caveats: exclusions, partial periods, what could not be measured and why.

Write in the owner's language. When a partner asked, add a ready-to-forward line in their language.

Shareable report (for other people)

When the numbers go to anyone besides the owner (the team, investors, a partner), also write a Markdown file at .analytics/reports/YYYY-MM-DD-<audience>.md, built from assets/report.example.md. It is a document a reader outside the codebase understands on its own, in these parts:

  1. Title: the product or campaign, the period covered, and the date, time and time zone of the read.
  2. In short: 2 to 4 sentences, each a takeaway with its number.
  3. One section per topic this reader cares about. Each is a table with this period and the previous period side by side, or 2 to 4 bullets. Every figure says in plain words what it counts ("people who opened the app at least once that week").
  4. Tests: one line each, the result and the verdict in plain words ("the tour group came back more often, but the groups are too small to be sure").
  5. How to read these numbers: who is counted, what active means, the calendar and time zone, which period is incomplete, and the smallest group shown.

The period is the last complete week or month, with absolute dates. The words are the reader's: features by the names the product shows, and no table or column names, query text, account ids or internal code names. Staff and test accounts appear only as "left out".

Pick the content by reader:

ReaderContents
TeamThe standard read, condensed, with the owner's next questions answered
InvestorsGrowth, activity, retention and the strongest proof points. A test result appears only with its verdict.
PartnerTheir campaign: participants, activity, completion, reach, and their own participants' history in the product (how many are new, how many took part in an earlier campaign, by its public name). Anything the product already shows publicly, such as a leaderboard, appears as shown there. Platform-wide figures only when the owner agrees. Never another partner's own figures.

Write it in the reader's language and in the product's own voice, with one form of address throughout. Read it once as that reader before showing it: every date matches its weekday, every number matches the read, and every question the reader already asked is answered. Show the owner the file before it goes anywhere: the owner sends it. Where pages can be published, offer the file as a page as well.

PDF. When the report will be printed, attached or forwarded as a file, print it with node scripts/report-to-pdf.mjs <report.md>: A4 on white paper, hairline tables, page numbers. --css <brand.css> sets the project's fonts and accent. Then read every page of the PDF before showing it: the name leads page 1, no page is mostly empty, and no table is cut. Fix the Markdown, not the PDF, and print again.

After the read

  1. Save .analytics/snapshots/YYYY-MM-DD.md: the headline numbers, compact, which the next read compares against. A shareable report is written for people. The snapshot is for the next read, and stays separate.
  2. Keep new or fixed queries in .analytics/queries/.
  3. Add any new trap or definition to the profile.

Common mistakes

MistakeFix
Retention from client analytics eventsUse the server's per-day activity table. Client analytics only covers people who consented.
Retention from a last_seen columnOverwritten, no history. Use per-day rows.
Arm = "did not get the treatment"Recompute the assignment hash with its salt.
Rates for the current, unfinished weekMark it partial, or gate on elapsed windows.
A staff account in a player count or a social metricExclude it as subject and as actor.
"94% retained" from 17 people"16 of 17".
A query dies on returning, day, user or order as an aliasQuote reserved words: "returning".
Rediscovering the connection, exclusions and segments every timeWrite them to the profile the first time.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.