Build the case for converting a PostHog monthly/PAYG customer to an annual prepaid credit plan. Pulls 12-24 months of invoice history from the data warehouse, runs the handbook eligibility check, projects forward growth, applies the handbook discount tiers, scans recent customer touchpoints (Slack, Gmail, Granola) for confounding variables, fetches customer momentum signals via Exa, emulates the rep's own writing voice, and emits a succinct briefing plus a plain-text Slack draft. Trigger on "annual conversion math for [account]", "monthly to annual for [account]", "draft annual nudge for [account]", or "credit-discount math for [account]".
npx skills add https://github.com/PostHog/skills --skill monthly-to-annual
You are helping a PostHog employee make the case for converting a monthly/PAYG customer to an annual prepaid credit plan. Be succinct. One tight briefing, one Slack draft, no preamble.
Key context: PostHog does not offer discounts to monthly customers no matter how long they commit. The discount only unlocks on conversion to a prepaid credit plan. Frame everything around that.
Internalize this before writing anything customer-facing. Source: posthog.com/handbook/growth/sales/.
The draft should sound like a teammate giving the customer useful info, not a vendor closing a deal. If the rep asks for harder closing language, push back once — then comply if they insist.
Required: customer name.
Optional: org ID (look up if missing), prior-quote URL, contract length, payment terms, whether they're a non-profit / on the startup plan, whether they already have a mutually-agreed signing date.
If the rep doesn't specify discount levers, ask — there is no default. Apply the tiers in the next section.
Last synced from posthog.com/handbook/growth/sales/contract-rules on 2026-06-12. If the handbook has changed, refetch via Exa and update this section.
| Annual credit purchase | Base discount |
|---|---|
| <$25k | self-serve only (10%) or non-profit (15%) |
| $25-59k | 20% |
| $60-99k | 25% |
| $100-249k | 30% |
| $250-499k | 35% |
| $500-999k | 40% |
| $1M+ | custom (escalate) |
> Monthly customers get 0% no matter the commitment — must convert to credit purchase to unlock anything. Customers must qualify for the volume tier before any of levers 2-4 apply.
> Does NOT apply to additional credit purchases made within the first half of the term — those inherit the original discount but don't restack length.
> Upfront payment is required for all discounted contracts. Quarterly / split payment terms not available. If budget can't cover full projected amount, customer can purchase fewer credits at the corresponding (likely lower) tier and add more later.
Walk through these *before* doing the math. If anything is unknown or unclear, ask the rep one focused question. Don't quote a discount stack that the handbook doesn't support — quoting first and walking back later erodes customer trust.
If the rep can't answer 1-4, pause and ask. A clean briefing on a wrong assumption wastes everyone's time.
SELECT id, name, created_at FROM postgres.posthog_organization WHERE name ILIKE '%<name>%' LIMIT 5
If multiple match, ask which one.
SELECT bi.period_start, bi.period_end, bi.mrr, bi.mrr_per_product
FROM postgres.prod.billing_invoice bi
JOIN postgres.prod.billing_customer bc ON bi.customer_id = bc.id
WHERE bc.organization_id = '<org_id>'
ORDER BY bi.period_start DESC
LIMIT 24
Compute, in order:
The purpose: catch things that would make the ask tone-deaf or premature. Surface every signal you find — don't pre-judge significance. Examples: active support escalations, product complaints, in-flight migrations or churn signals, missed commitments, an unhappy stakeholder, an upcoming internal review, a pricing concern they already raised, a champion who left.
Run these in parallel:
3a. Slack — customer channel + DMs. Search the customer's PostHog Slack channel for the last 60 days:
in:#posthog-<customer-slug> after:<60d-ago>
Also search recent DMs between the rep and customer contacts.
3b. Gmail — recent threads. Search for the customer name (and key contacts if known) in the rep's inbox for the last 90 days. Tool: mcp__claude_ai_Gmail__search_threads with a query like "<Customer Name>" newer_than:90d and any explicitly-known contact emails. Read snippets; only get_thread on the most relevant 1-3 threads.
3c. Granola — meeting transcripts. Use mcp__claude_ai_Granola__query_granola_meetings with the customer name to find recent transcripts. Look for: stated procurement timelines, budget cycles, named blockers, expansion or contraction signals. Quote one or two sentences verbatim if pivotal.
Output of step 3: a short "Confounding variables" section in the briefing (2-5 bullets max). If nothing meaningful surfaced, say "no recent friction signals in Slack / email / meetings (last 60-90 days)." If something significant surfaced — e.g. a churn-risk meeting last week — pause before drafting and ask the rep whether to proceed.
Use mcp__claude_ai_Exa__web_search_exa:
> "[Customer name] product launches growth metrics 2026 blog announcements"
If results are thin, follow with mcp__claude_ai_Exa__web_fetch_exa on their official blog/news page. Capture 2-4 concrete anchors from the last 6 months — product launches, user-count or revenue claims, partnerships. These are the *reason-to-revisit-now* hook, not the *reason-to-buy*.
Skip if rep says --no-anchors.
The rep is the one sending this draft — it should sound like them, not generic PostHog tone.
If Slack MCP is connected: before drafting, pull 15-25 recent messages *written by the rep* in customer-facing channels. Use slack_search_public_and_private with from:me in:#posthog- (or filter by from:<rep_user_id> if running on someone else's behalf). Prioritize messages to *other customers* in similar nudge contexts (annual conversion, billing, expansion) over internal-team messages. Note:
Emulate the *register*, not the *content*. If the rep writes terse-lowercase-with-bufo-emoji, the draft is too. If they write polished sentences with full sign-offs, match that.
If Slack MCP is not connected: suggest to the rep that connecting Slack would let the skill emulate their own voice. Default to neutral, lowercase, plain-text PostHog tone if not available.
> Step 5 is about the *rep's* style — step 3 separately surfaces the *customer's* recent tone as a confounding-variables read. Don't mirror the customer; emulate the rep.
Ask which levers apply. Use the eligibility check above to constrain the answer. Don't assume.
Common stacks:
Sanity-check the volume tier against projected annual spend before quoting.
| Scenario | Projected PAYG spend | Logic |
|---|---|---|
| Floor (zero-growth) | current MRR × 12 | hard floor; even if they stop growing |
| Base | apply recent-slope annualized rate | most defensible mid-case |
| Bull | apply trailing YoY | upper bound based on actual history |
For each: PAYG spend → discounted credit cash → absolute savings.
Exactly these 6 sections, in this order. Nothing before, nothing between, nothing after. The Slack draft is the closer.
Hard prohibitions (these have actually happened, do not do them):
If something genuinely cannot be expressed inside the 6 sections (e.g. "should we proceed given a churn signal?"), end the *Confounding variables* section with a single italicized question like *"proceed, or pause until X resolves?"* and stop — don't add a "Decision needed" block.
<@USER_ID|Name> only if the rep gave a Slack mention; otherwise just the first name.If asked to save to a file, ask for the path. If asked for a longer writeup, expand inline — but the default is the succinct briefing above.
Analyzes your recent Claude Code chat history to identify coding patterns, development gaps, and areas for improvement, curates relevant learning resources from HackerNews, and automatically sends a personalized growth report to your Slack DMs.
Automate Brevo (Sendinblue) tasks via Rube MCP (Composio): manage email campaigns, create/edit templates, track senders, and monitor campaign performance. Always search tools first for current schemas.
Automate Klaviyo tasks via Rube MCP (Composio): manage email/SMS campaigns, inspect campaign messages, track tags, and monitor send jobs. Always search tools first for current schemas.
Research a prospect then draft personalized outreach. Uses web research by default, supercharged with enrichment and CRM. Trigger with "draft outreach to [person/company]", "write cold email to [prospect]", "reach out to [name]".
You are an expert in email marketing and automation. Your goal is to create email sequences that nurture relationships, drive action, and move people toward conversion.
Email has the highest ROI of any marketing channel. $36 for every $1 spent. Yet most startups treat it as an afterthought - bulk blasts, no personalization, landing in spam folders.
Write personalized trade show booth invitation emails, pre-show outreach sequences, and exhibition meeting requests. Use this skill when the user needs to invite prospects, customers, partners, or VIPs to visit their booth at a trade show or exhibition, write pre-show emails, create multi-touch invitation sequences, draft meeting requests for an upcoming event, or write any outreach related to an exhibition or expo they're attending. Triggers on requests like 'write an email inviting people to our booth', 'I need a pre-show outreach sequence for MEDICA', 'draft an invitation for our CES booth', 'help me get meetings before the trade show', 'booth traffic email', 'pre-show marketing email', 'trade show outreach template', 'exhibition invitation letter', or casual phrasing like 'we're exhibiting next month, need to get people to come by'. If the user mentions an upcoming show and wants to write emails to drive booth traffic or schedule meetings, this is the right skill.
Email has the highest ROI of any marketing channel. $36 for every $1 spent. Yet most startups treat it as an afterthought - bulk blasts, no personalization, landing in spam folders. This skill covers transactional email that works, marketing automation that converts, deliverability that reaches inboxes, and the infrastructure decisions that scale. Use when: keywords, file_patterns, code_patterns.
Take posthog/monthly-to-annual from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.