Whop memberships and payments, counted like MRR

Connect a Whop Account API key with a read-only role. Sumly reads memberships, payments, refunds and lost disputes, and counts them without tax and after Whop's fee.

Drawn with example numbers.

Connected in three steps

A read-only key, pasted once. Sumly does the rest.

  1. 1

    In Whop: Dashboard → Developer → Account API Keys → Create, with a custom role rather than Admin.

  2. 2

    Give it read only: member:basic:read, payment:basic:read, plan:basic:read, access_pass:basic:read and payment:dispute:read. Nothing to write.

  3. 3

    Paste the key below.

  4. 4

    To trace payments to visits, create checkouts with metadata: { sumly_visitor_id: sumly.visitorId } (a checkout configuration or the embedded checkout); Whop copies it to the payment and the membership.

Or let your coding assistant do it

Paste this into Claude Code, Cursor or Codex in your project. It fits the code to how your project is built, asks you for the dashboard steps and leaves the keys to you.

See what it says
Set up Whop for Sumly in this project.

Sumly (https://sumly.dev) shows revenue next to the visits and app users it came from. The full guide is https://sumly.dev/integrations/whop; read it if anything below is unclear.

Steps:
1. In Whop: Dashboard → Developer → Account API Keys → Create, with a custom role rather than Admin.
2. Give it read only: member:basic:read, payment:basic:read, plan:basic:read, access_pass:basic:read and payment:dispute:read. Nothing to write.
3. Paste the key into Sumly.
4. To trace payments to visits, create checkouts with `metadata: { sumly_visitor_id: sumly.visitorId }` (a checkout configuration or the embedded checkout); Whop copies it to the payment and the membership.

So each payment shows which visit it came from: Create the checkout with metadata named sumly_visitor_id, holding the sumly_vid cookie (a checkout configuration made on your server, or the embedded checkout's metadata). Whop copies it to the payment and the membership. Each payment then counts for the source, campaign and country of the visit that started it. In the EU and UK there is a visitor only after they agree.

Keep in mind: Built from Whop's API reference and checked against responses shaped like it, not yet against a live Whop account. Tell us if a number looks off. One-time access is a payment, not a subscription, so it never counts in MRR. Whop's hosted checkout links take no field Sumly could carry the visitor in, so the site script cannot trace them by itself: create the checkout with metadata, as below. A refund counts in the currency Whop settled it in.

How to work:
- Look at how this project is built first, and fit the code to its framework and its way of doing things; the examples above are a starting point, not something to paste as is.
- Steps that happen in a dashboard (Sumly, or Whop's own) are mine: tell me exactly what to click, then wait for me.
- The Whop key goes into Sumly (Projects and payments), not into this project: Sumly reads Whop itself. Your part in the code is only carrying the visitor into checkout, as above.
- Keys the code needs belong in environment variables, never in the code or the repository. Never ask me to paste a secret key into this chat; tell me which variable to set.
- Change only what this needs, show me the changes before you commit, and tell me how to check that it works.

What you see after connecting

Whop next to every other project and provider, on the same pages.

Overview

MRR, ARR, revenue per customer, paying members, trials and the MRR set to cancel.

Payments without tax and after Whop's fee, with the buyer's name and billing country.

Metrics over time, with churn, LTV and quick ratio.

Plans by product name, customers, the outlook and a CSV export.

With the visitor in the checkout metadata: revenue by source and campaign, and ROI for each cost.

Which visit paid

Create the checkout with metadata named sumly_visitor_id, holding the sumly_vid cookie (a checkout configuration made on your server, or the embedded checkout's metadata). Whop copies it to the payment and the membership. Each payment then counts for the source, campaign and country of the visit that started it. In the EU and UK there is a visitor only after they agree.

How attribution works →

Counts toward your plan

Nothing: payments, customers and refunds never count toward your plan. Only the page views and app screens Sumly keeps do. Plans →

The details

What Sumly reads
  • Memberships that renew, with their renewal price, trial and scheduled cancellation
  • Paid payments, with the tax Whop collected and what is left after its fees
  • Refunds and lost disputes
  • Each payment and membership change the moment it happens, by webhook
When Sumly reads Whop
  • Every 15 minutes, together with the other connections of the project. The first read takes three years of payments.
  • Memberships are read whole each time, because their status and price change in place.
  • Payments are read from 120 days before the newest one kept, so a later refund of an older payment is found too.
  • With the webhook added, each payment, refund, dispute and membership change is read again from Whop the moment it happens.
How Whop money is counted
Monthly value
The membership's renewal price, spread over its billing period: 30 days counts as a month, 365 as a year, other lengths by the day.
Trials
A trialing membership counts from the end of its trial.
Cancellations
A membership set to cancel at the end of its period leaves MRR at once, though it stays paid up until then. Completed, cancelled and expired ones stop on that day.
Past due
Still counts while Whop retries the payment. A membership with a payment in dispute counts as past due.
Tax
Whatever tax Whop collected comes off, whether Whop remits it or you do.
Fees
The payment less what Whop says is left after its fees. Net revenue is after them.
Refunds and disputes
A refund counts without its tax, on the day it was made. A lost dispute counts as the whole payment returned.
Currency
Payments in their own currency, turned into euros at the ECB rate of that day. MRR converts at today's rate.
Good to know
  • Built from Whop's API reference and checked against responses shaped like it, not yet against a live Whop account. Tell us if a number looks off.
  • One-time access is a payment, not a subscription, so it never counts in MRR.
  • Whop's hosted checkout links take no field Sumly could carry the visitor in, so the site script cannot trace them by itself: create the checkout with metadata, as below.
  • A refund counts in the currency Whop settled it in.

Whop questions

Can Sumly change anything in Whop?

No. Give the key a custom role with the read permissions above and nothing else; Sumly only reads with it and keeps it encrypted.

Which version of Whop's API does Sumly use?

It pins one version on every call, so a key made earlier or later gets the same answers.

Do I need the webhook?

No. Sumly reads Whop every 15 minutes either way. With the webhook, payments and cancellations show up within seconds.

Can the site script trace Whop checkout links?

Not by itself: Whop's links take no field for it. Put sumly_visitor_id in the checkout metadata instead.

Why is the webhook not signed?

It does not need to be: the address holds a secret of its own, and Sumly takes nothing from the call itself. It reads the payment or membership it names again from Whop with your key.

Other integrations

Try it with your own projects

Sign in with Google or a code by e-mail and connect your first project. Free for one project, and 14 days of a paid plan with no card.

Start free

Or look around first: open the live demo.