qbr-prep
Skill1 starsChanged 5 months agoMITView on GitHub
Drafts an internal quarterly business review from HubSpot CRM data, open tickets, and product usage trends. Use whenever the user mentions QBR, quarterly review, quarterly business review, book-of-business summary, account health rollup, exec review of accounts, or asks "how is the customer base doing this quarter." Also trigger when a user wants at-risk accounts ranked or portfolio health summarized for leadership, even if they don't say "QBR." Produces local draft files only — never sends or posts anything.
- Reads credentials
2 other projects use a version of this.
Adopted by
Most recently taken up by
- nnasrall/uncommon-sales-skillstheir own version, first seen Nov 1, 2026
- etrebels/claude-code-growth-ostheir own version, first seen Sep 14, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- etrebels/claude-code-growth-os★ 21same name
- nnasrall/uncommon-sales-skills★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
10 rules. About 0 are common, 4 are distinctive, and 6 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 37
Default to the most recently completed calendar quarter, full book of business.
- Very specific: line 46
HubSpot live: read references/hubspot-recipes.md — it documents both fetch paths (hubspot-claude CLI and HubSpot MCP connector) and the …
- Very specific: line 49
Usage live: read references/usage-sources.md — BigQuery SELECT template (default) or CSV fallback.
- Distinctive: line 62
If usage data is unavailable, say exactly what's needed and where to put it.
- Distinctive: line 63
Do not produce a report that silently omits usage — an exec review with a hole in it is worse than a delayed one.
- Very specific: line 100
Create qbr-<quarter>.md locally.
- Distinctive: line 148
Every at-risk account cites at least one concrete evidence item.
- Very specific: line 151
No send/post/message tool was called at any point.
- Very specific: line 158
Read-only everywhere: Never create, update, or delete CRM records.
- Very specific: line 164
No secrets: Never read or echo .env files, tokens, or credentials.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
qbr-prep
Draft an internal quarterly business review for a CS director or RevOps lead presenting to leadership. The output is a draft the operator reviews — this skill never sends, posts, or schedules anything. That constraint is the product: exec-facing automation gets adopted only when the human visibly owns the last mile.
Config
Tune everything here. scripts/compute_flags.py carries the same defaults —
if you change a threshold, change it in both places (or pass CLI overrides).
thresholds:
usage_drop_pct: 20 # QoQ avg weekly-active-users decline = "usage down"
usage_rise_pct: 20 # QoQ rise = expansion candidate
ticket_rise_pct: 50 # QoQ ticket-volume increase = spike
ticket_spike_min: 2 # min tickets this quarter to count a spike
crm_silence_days: 30 # days without CRM touch = silence
usage_source:
bigquery_table: "" # project.dataset.table — leave empty to use CSV
id_mapping: # how usage account_id joins to the CRM record
hubspot_property: demo_account_id
quarter: "" # e.g. "Q2 2026"; empty = most recently completedWorkflow
1. Determine the quarter and scope
Default to the most recently completed calendar quarter, full book of business. Honor a quarter or scope filter (owner, tier) if the user gives one.
2. Acquire data → normalized files
The rest of the skill only consumes four normalized files. Get them one of three ways:
- Local files already present (fixtures, prior export): use directly.
- HubSpot live: read
references/hubspot-recipes.md— it documents both fetch paths (hubspot-claude CLI and HubSpot MCP connector) and the exact normalized output shape. All HubSpot access is read-only. - Usage live: read
references/usage-sources.md— BigQuery SELECT template (default) or CSV fallback.
Normalized shapes:
accounts.json [{account_id, name, owner, arr, renewal_date,
last_activity_date, open_expansion_deal}]
tickets.csv account_id, created_date, priority, status, subject
usage.csv account_id, account_name, week_start, active_users, key_events
notes.json [{account_id, timestamp, author, body}]If usage data is unavailable, say exactly what's needed and where to put it. Do not produce a report that silently omits usage — an exec review with a hole in it is worse than a delayed one.
3. Compute flags — with the script, never by judgment
python scripts/compute_flags.py \
--accounts accounts.json --tickets tickets.csv --usage usage.csv \
--quarter-end <YYYY-MM-DD> --out flags.jsonWhy a script: flags must be identical across runs and defensible in the exec
room. "Why is Acme red?" needs a one-sentence answer backed by numbers. You
narrate around the flags; you never assign or override them. The script
emits per-account flag (at_risk / watch / healthy / unknown),
evidence strings, metrics, and data-quality findings.
Two outputs need your judgment, applied carefully:
- Expansion candidates (
expansion_candidate: true): the script only detects the usage rise. Before reporting an expansion signal, confirm context — an open expansion deal, or expansion language in the notes (a pricing question, a new team connected). Growth without context is reported as notable growth, not a signal. unknownflag: usage data is missing for the account. Report it in its own "insufficient data" section. Absence of data is not health.
4. Read the notes for the flagged accounts
For every at-risk/watch/expansion account, read its notes and recent tickets. You're looking for the story behind the numbers: a champion who left, a rollout that stalled, a parked pricing conversation. This is where you add value the script can't — but every claim you write must trace to a specific note, ticket, or metric. Evidence, not adjectives.
5. Write the report
Create qbr-<quarter>.md locally. Use exactly this structure:
> DRAFT — review before circulating
# Quarterly Business Review — <Quarter>
## Executive summary
(Prose. What changed this quarter, the 2-3 decisions this review should
prompt, total book health in one paragraph.)
## Portfolio snapshot
(Flag counts table; accounts by flag with owner, ARR, renewal date.
At-risk first.)
## At-risk accounts
(Per account: the flag's evidence — verbatim from flags.json — then the
story from notes, open tickets, renewal exposure, and one suggested next
step.)
## Expansion signals
(Per confirmed signal: usage delta + the context that confirms it.)
## Watch list
(One short paragraph per account: the single signal and what would
escalate or clear it.)
## Insufficient data
(Accounts flagged `unknown` and usage rows that matched no CRM record —
state what's missing.)
## Ticket themes
(Recurring issues across the book this quarter, with counts.)
## Usage overview
(Book-level QoQ trend; biggest movers up and down.)
## Appendix: methodology
(The exact thresholds from flags.json, the quarter boundaries, and the
data sources used in this run.)Depth is proportional: flagged accounts get deep-dives; healthy accounts get one table row. Execs read the first two sections; everything after is reference.
6. Verify before finishing
- Every at-risk account cites at least one concrete evidence item.
- The DRAFT label is the first line.
- The methodology appendix states the thresholds actually used.
- No send/post/message tool was called at any point.
Guardrails
These are commitments the skill's description makes to the user — breaking them silently is worse than failing loudly:
- Read-only everywhere. Never create, update, or delete CRM records. On
the hubspot-claude CLI path, never call
approve. BigQuery access is SELECT-only — the templated query is the only shape you run. - Never auto-sent. Output is local files. Do not email, Slack, post, or schedule the review even if those tools are available and it would seem helpful. The user circulates it; that's the design, not a limitation.
- No secrets. Never read or echo
.envfiles, tokens, or credentials. - Placeholder discipline. Examples and docs use fictional data only.
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
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.

