Rank the Stripe trials ending this week by usage and open tickets

Mondays: each Stripe trial ending by Friday, matched by email to product usage and support tickets, sorted into call, email or leave alone.

Runs
Mondays at 9:00
Posts
Asks you

From your apps to your board

How the skill works: your agent reads trials ending by friday from Stripe; usage for those emails from PostHog; product analytics from Mixpanel; open tickets for those emails from Intercom; customer support from Zendesk; analytics tool (posthog or mixpanel), posthog project id, activation event name, teammate invite event name from What you tell it, mondays at 9:00, and gives you a question for you and a telegram ping and the report in the chat.

Reads

  • StripeTrials ending by Friday
  • PostHogUsage for those emails
  • MixpanelProduct analytics
  • IntercomOpen tickets for those emails
  • ZendeskCustomer support
  • What you tell itAnalytics tool (PostHog or Mixpanel), PostHog project ID, Activation event name, Teammate invite event name
reads
Your agentClaude Code, Codex, Cursor or GeminiMondays at 9:00
posts

You get

  • A question for youOn your board, answered with a tap
  • A Telegram pingOnly when it needs your answer, if you connect Telegram
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Trials ending by Friday: how many, and how many activated, never invited a teammate, or have an open bug.
  • Call: open bugs and activated trials with no card, with the reason.
  • Email: trials missing activation or an invite, with the step to nudge.
  • Leave alone: activated, card on file, no tickets.
  • What to do first: the largest "call" trial that ends soonest.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

AcmeTrials worth a call this week: Stripe, product usage and support · Claude Code

7 trials end by Friday: call 3, email 3, leave 1

Should I draft the 3 nudge emails and the 3 call notes?

7 Stripe trials end by Friday: 2 activated with no tickets, 3 never invited a teammate, 2 have an open bug. Calls go to the 2 with bugs and to Litware, activated but with no card on file.

TrialEndsPlanSignalsDo
LitwareThuBusiness $249Activated day 3, 9 active days, no cardCall
FabrikamWedTeam $99Open bug 5 days: CSV import failsCall
AdatumFriTeam $99Open bug 2 days: SSO redirect loopCall
ProsewareTueTeam $99Not activated, no teammate invitedEmail
Coho WineryThuStarter $29Signed up, 1 active day, no inviteEmail
Wingtip ToysFriStarter $29Not activated, no invite, no usage foundEmail
Northwind TradersWedBusiness $249Activated, 6 users, card on file, no ticketsLeave alone

Call Litware first: the largest trial ending this week is fully activated but has no card on file, so it will not convert on Thursday without one.

Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

Stripe knows when a trial ends and whether a card is on file. It does not know whether the person ever reached the moment your product is worth paying for, or that they have had a bug ticket open since Wednesday. A list sorted by end date treats an engaged team and an abandoned signup the same way.

Every Monday the agent takes the trials that end by Friday, looks each customer's email up in your product analytics and your support tool, and sorts them three ways: call the trials a conversation can win, email the ones missing a single step, and leave alone the ones about to convert without help. Founders and sales leads spend the week's calls where they change the outcome.

How it works

  1. 1List trials ending by Friday

    Page through GET /v1/subscriptions?status=trialing&expand[]=data.customer (or stripe subscriptions list --status trialing --live) and keep subscriptions with trial_end before Friday 23:59 in your time zone. Keep the customer ID, customer.email, the plan and its monthly amount, trial_start, trial_end, and whether a payment method is on file (default_payment_method on the subscription or invoice_settings.default_payment_method on the customer).

  2. 2Pull usage for those emails

    PostHog: one HogQL query through POST /api/projects/:project_id/query/, for example SELECT lower(person.properties.email) AS email, countIf(event = '<activation event>') AS activations, countIf(event = '<invite event>') AS invites, count(DISTINCT toDate(timestamp)) AS active_days FROM events WHERE timestamp > now() - INTERVAL 30 DAY AND lower(person.properties.email) IN (<emails>) GROUP BY email. Mixpanel: find each profile with POST /api/query/engage filtered on $email, then pull the two events with the Raw Export API (/api/2.0/export, event=["<activation event>","<invite event>"]) and match on distinct_id.

  3. 3Find open tickets for those emails

    Intercom: POST /conversations/search with source.author.email IN [<emails>] and state IN ["open", "snoozed"], reading tags. Zendesk: GET /api/v2/search.json?query=type:ticket requester:<email> status<solved for each email. A ticket is a bug if it carries your bug tag or, in Zendesk, has ticket_type:problem.

  4. 4

    4Join on email and rank

    Join the three on the lowercased Stripe customer email. A trial with no analytics person is "no usage found" and goes to email, never leave alone; if the billing email differs from the user's, match on the email domain only when exactly one analytics person shares it (never on free-mail domains). Call: an open bug ticket, or activated with no card on file. Email: never activated or no teammate invited, naming the missing step. Leave alone: activated, card on file, no open ticket. Larger plans first within each group.

  5. 5

    5Report and draft on request

    Post the three groups with end day, plan, the signals behind each verdict and the counts, and ask whether to draft. On yes, write one short email per "email" trial about its missing step and a three-line call note per "call" trial, with the ticket summary for the bug ones. Nothing is sent.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/stripe-trials-to-call/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the stripe-trials-to-call skill

    Or paste the prompt instead of installing:

    promptFrom Stripe (read only), list subscriptions with status trialing whose trial ends by this Friday, with customer email, plan, monthly amount, end date and whether a payment method is on file. For each email (lowercased), check my product analytics (PostHog or Mixpanel) for the activation event "<activation event>" and the invite event "<invite event>" in the last 30 days and the number of active days, and check Intercom or Zendesk for open conversations or tickets from that email, marking bugs. Sort the trials into three groups: call (an open bug, or activated with no card), email (not activated or no teammate invited, say which step is missing), leave alone (activated, card on file, no open tickets). A trial with no usage found goes to email. Give me the counts and the three lists, larger plans first, then ask whether to draft the emails and call notes. Send nothing.
  3. Put it on a schedule

    Mondays at 9:00, from cron on any machine where Claude Code is signed in:

    crontab0 9 * * 1 claude -p "Run the stripe-trials-to-call skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: stripe-trials-to-call
description: "Mondays: each Stripe trial ending by Friday, matched by email to product usage and support tickets, sorted into call, email or leave alone. Use when the user asks for this, or when it runs on a schedule."
---

# Trials worth a call this week: Stripe, product usage and support

Mondays: each Stripe trial ending by Friday, matched by email to product usage and support tickets, sorted into call, email or leave alone.

Stripe knows when a trial ends and whether a card is on file. It does not know whether the person ever reached the moment your product is worth paying for, or that they have had a bug ticket open since Wednesday. A list sorted by end date treats an engaged team and an abandoned signup the same way.

Every Monday the agent takes the trials that end by Friday, looks each customer's email up in your product analytics and your support tool, and sorts them three ways: call the trials a conversation can win, email the ones missing a single step, and leave alone the ones about to convert without help. Founders and sales leads spend the week's calls where they change the outcome.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Read access to Stripe Subscriptions and Customers: the Stripe MCP server or a restricted key in `STRIPE_API_KEY`.
- The same email in Stripe and your analytics (PostHog persons with an `email` property from `identify`, or Mixpanel profiles with `$email`), plus the names of your activation event and your teammate-invite event.
- Read access to Intercom conversations or Zendesk tickets, with bugs marked by a tag or the Problem ticket type.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **List trials ending by Friday** (Stripe): Page through `GET /v1/subscriptions?status=trialing&expand[]=data.customer` (or `stripe subscriptions list --status trialing --live`) and keep subscriptions with `trial_end` before Friday 23:59 in your time zone. Keep the customer ID, `customer.email`, the plan and its monthly amount, `trial_start`, `trial_end`, and whether a payment method is on file (`default_payment_method` on the subscription or `invoice_settings.default_payment_method` on the customer).
2. **Pull usage for those emails** (PostHog): PostHog: one HogQL query through `POST /api/projects/:project_id/query/`, for example `SELECT lower(person.properties.email) AS email, countIf(event = '<activation event>') AS activations, countIf(event = '<invite event>') AS invites, count(DISTINCT toDate(timestamp)) AS active_days FROM events WHERE timestamp > now() - INTERVAL 30 DAY AND lower(person.properties.email) IN (<emails>) GROUP BY email`. Mixpanel: find each profile with `POST /api/query/engage` filtered on `$email`, then pull the two events with the Raw Export API (`/api/2.0/export`, `event=["<activation event>","<invite event>"]`) and match on `distinct_id`.
3. **Find open tickets for those emails** (Intercom): Intercom: `POST /conversations/search` with `source.author.email IN [<emails>]` and `state IN ["open", "snoozed"]`, reading tags. Zendesk: `GET /api/v2/search.json?query=type:ticket requester:<email> status<solved` for each email. A ticket is a bug if it carries your bug tag or, in Zendesk, has `ticket_type:problem`.
4. **Join on email and rank**: Join the three on the lowercased Stripe customer email. A trial with no analytics person is "no usage found" and goes to email, never leave alone; if the billing email differs from the user's, match on the email domain only when exactly one analytics person shares it (never on free-mail domains). **Call**: an open bug ticket, or activated with no card on file. **Email**: never activated or no teammate invited, naming the missing step. **Leave alone**: activated, card on file, no open ticket. Larger plans first within each group.
5. **Report and draft on request**: Post the three groups with end day, plan, the signals behind each verdict and the counts, and ask whether to draft. On yes, write one short email per "email" trial about its missing step and a three-line call note per "call" trial, with the ticket summary for the bug ones. Nothing is sent.

## Route B: the browser

### What you need

- Signed in to the Stripe Dashboard (Analyst role or higher, live mode), to PostHog or Mixpanel with access to the project, and to Intercom or Zendesk as a teammate or agent.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://dashboard.stripe.com/subscriptions. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **List the trials ending by Friday**: In live mode, filter **Status** to **Trialing** and keep the subscriptions whose trial ends by Friday. Open each to note the customer's email, the plan and amount, and whether the **Payment method** section shows a card.
2. **Check usage for each email**: PostHog: open **People**, search the email, open the person and look through the last 30 days of events for the activation event and the invite event. Mixpanel: open **Users**, search the email and read the profile's **Activity Feed**. No person found means "no usage found".
3. **Check open tickets**: Intercom: search the inbox for the email and look for open or snoozed conversations and their tags. Zendesk: type `requester:<email> status<solved` in the search box. A bug is a conversation with your bug tag or a Zendesk ticket of type Problem.
4. **Sort into call, email, leave alone**: Call: an open bug, or activated with no card. Email: not activated or no teammate invited, noting the missing step. Leave alone: activated, card on file, no open ticket. Larger plans first in each group.
5. **Report and offer drafts**: Give the counts and the three lists with end day, plan and signals, then ask whether to draft the nudge emails and call notes. Send nothing.

Note: Three lookups per trial makes the browser route practical for about 15 trials. Analytics person pages only find people whose email was set as a property, the same limit the API route has. The Stripe list may not show trial end as a column; open each subscription to read it.

## The report

- **Trials ending by Friday**: how many, and how many activated, never invited a teammate, or have an open bug.
- **Call**: open bugs and activated trials with no card, with the reason.
- **Email**: trials missing activation or an invite, with the step to nudge.
- **Leave alone**: activated, card on file, no tickets.
- What to do first: the largest "call" trial that ends soonest.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "stripe-trials-to-call/<date of this run, e.g. 2026-10-16>",
  "item_key": "stripe-trials-to-call",
  "project": "Acme",
  "source": "Trials worth a call this week: Stripe, product usage and support skill",
  "kind": "action",
  "title": "7 trials end by Friday: call 3, email 3, leave 1",
  "summary": "**7 Stripe trials** end by Friday: 2 activated with no tickets, 3 never invited a teammate, 2 have an open bug. Calls go to the 2 with bugs and to Litware, activated but with no card on file.",
  "action": {
    "request": "Should I draft the 3 nudge emails and the 3 call notes?",
    "options": [
      "Draft emails and call notes",
      "Call notes only",
      "Emails only",
      "Not this week"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Trial",
          "Ends",
          "Plan",
          "Signals",
          "Do"
        ],
        "rows": [
          [
            "Litware",
            "Thu",
            "Business $249",
            "Activated day 3, 9 active days, no card",
            "Call"
          ],
          [
            "Fabrikam",
            "Wed",
            "Team $99",
            "Open bug 5 days: CSV import fails",
            "Call"
          ],
          [
            "Adatum",
            "Fri",
            "Team $99",
            "Open bug 2 days: SSO redirect loop",
            "Call"
          ],
          [
            "Proseware",
            "Tue",
            "Team $99",
            "Not activated, no teammate invited",
            "Email"
          ],
          [
            "Coho Winery",
            "Thu",
            "Starter $29",
            "Signed up, 1 active day, no invite",
            "Email"
          ],
          [
            "Wingtip Toys",
            "Fri",
            "Starter $29",
            "Not activated, no invite, no usage found",
            "Email"
          ],
          [
            "Northwind Traders",
            "Wed",
            "Business $249",
            "Activated, 6 users, card on file, no tickets",
            "Leave alone"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Call Litware first: the largest trial ending this week is fully activated but has no card on file, so it will not convert on Thursday without one.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Mondays at 9:00 (`0 9 * * 1`). From cron, with the agent signed in on that machine:

```bash
0 9 * * 1 claude -p "Run the stripe-trials-to-call skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/stripe-trials-to-call#schedule

Source: https://briefkin.dev/skills/stripe-trials-to-call

What your agent needs

  • Read access to Stripe Subscriptions and Customers: the Stripe MCP server or a restricted key in STRIPE_API_KEY.

  • The same email in Stripe and your analytics (PostHog persons with an email property from identify, or Mixpanel profiles with $email), plus the names of your activation event and your teammate-invite event.

  • Read access to Intercom conversations or Zendesk tickets, with bugs marked by a tag or the Problem ticket type.

Connecting Stripe

  1. Stripe MCP server, Stripe's official remote server at https://mcp.stripe.com. Add Stripe from Claude's connector directory, or run claude mcp add --transport http stripe https://mcp.stripe.com/, and sign in with OAuth; clients without OAuth can send a restricted key as a Bearer token.
  2. The Stripe CLI. Run stripe login once, then stripe subscriptions list --status active --limit 100 or stripe invoices list --status open. The CLI defaults to test mode, so add --live for real data.
  3. API with a restricted key. Create a restricted key (rk_live_...) in the Dashboard under Developers > API keys, store it in STRIPE_API_KEY, and give it Read on the resources the report touches: Subscriptions, Invoices, Charges, Customers, PaymentIntents, Balance and Disputes.

Never hand an agent the secret key (sk_live_...); a restricted key with Read where needed and None everywhere else can't refund, cancel or charge anything.

Connecting PostHog

  1. PostHog MCP server, PostHog's official remote server at https://mcp.posthog.com/mcp. Sign in with OAuth, or let the PostHog Wizard install it in your client; it routes to the US or EU cloud based on your account. Clients without OAuth can send a personal API key made with the MCP Server preset as a Bearer token (docs).
  2. Query API with a personal API key. Create one in your PostHog account settings, store it in POSTHOG_API_KEY with POSTHOG_PROJECT_ID and POSTHOG_HOST (https://us.posthog.com or https://eu.posthog.com), and give it the query:read scope, plus insight:read or feature_flag:read if the report uses them.

Add ?readonly=true to the MCP URL (or send x-posthog-read-only: true) to drop every tool that creates, updates or deletes; on the API, read scopes alone do the same.

Connecting Mixpanel

  1. Mixpanel MCP server, Mixpanel's official remote server at https://mcp.mixpanel.com/mcp (https://mcp-eu.mixpanel.com/mcp for EU, https://mcp-in.mixpanel.com/mcp for India). Mixpanel is in Claude's connector directory for US projects; for EU or India, add the regional URL as a custom connector. Its Run-Query tool runs insights, funnels, flows and retention queries (docs).
  2. Query API with a service account. Create a service account in your organization settings, store MIXPANEL_SERVICE_ACCOUNT_USERNAME, MIXPANEL_SERVICE_ACCOUNT_SECRET and MIXPANEL_PROJECT_ID, and call the Query API with basic auth.

Give the service account access to only the project the report covers, with the Consumer or Analyst role rather than Admin.

Connecting Intercom

  1. Intercom MCP server, Intercom's official remote server at https://mcp.intercom.com/mcp (https://mcp.eu.intercom.com/mcp for EU workspaces; Australian workspaces aren't supported yet). Intercom is in Claude's connector directory for US workspaces, and on Team and Enterprise plans an Owner adds it. Its tools search and fetch conversations and contacts (docs).
  2. REST API with an access token. Create an app in the Intercom Developer Hub, store its access token in INTERCOM_ACCESS_TOKEN, and call https://api.intercom.io (api.eu.intercom.io or api.au.intercom.io by region) with an Intercom-Version header. Give the app Read conversations and Read and list users and companies.

The MCP server includes a few write tools (internal notes, Help Center articles), so for unattended reports an app token with read permissions only is the tighter option.

Connecting Zendesk

  1. MCP server. Zendesk doesn't list an official one; community MCP servers exist, and they need the same subdomain, email and API token as a direct API call.
  2. API with an API token. An admin enables token access in Admin Center under Apps and integrations > APIs and creates a token. The skill reads ZENDESK_SUBDOMAIN, ZENDESK_EMAIL and ZENDESK_API_TOKEN and sends basic auth as {email}/token:{token}.
  3. OAuth client. For a narrower credential, register an OAuth client in Admin Center and request the read scope.

An API token acts as the user who made it, with that agent's full rights; an OAuth token with only read can't update, assign or close tickets.

Questions

What if people sign up with a different email than the one on the Stripe customer?

Then the email join misses them and they show as "no usage found". The fix is to store the Stripe customer ID on the person in analytics (a PostHog person or group property, a Mixpanel profile property) when checkout runs, and tell the agent to join on that instead. Until then it tries the email domain, but only when exactly one person in analytics has it.

Our analytics data arrives late. Does that skew the ranking?

PostHog and Mixpanel events usually land within minutes, so a Monday run sees the weekend. The skill reads 30 days of history, so a few hours of lag cannot turn an activated trial into an unactivated one. Events sent from a nightly server job are the exception: run the skill after that job.

Do I need Briefkin to use the Trials worth a call this week: Stripe, product usage and support skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Stripe, PostHog, Mixpanel, Intercom and Zendesk pages themselves: the agent opens dashboard.stripe.com/subscriptions in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Answer your agents from one board, or from Telegram

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.