Lemon Squeezy integration

Lemon Squeezy analytics: MRR, churn and refunds per app

BugOtter reads your Lemon Squeezy store and shows what each app earns: MRR and how it moved, orders and renewals after refunds, trials, cancellations and failed payments. All of it sits next to the same app's traffic, uptime and errors, so a bad day has an explanation.

  • 1 API keyabout a minute
  • 90 daysfirst sync
  • Every 15 minsync

Three things to know

  • Orders and renewals

    Both count: the first payment is an order, every renewal a subscription invoice.
  • Failed payments alert you

    Failed orders and renewals open an issue on the app.
  • No revenue by source yet

    Lemon Squeezy only returns checkout data in webhooks. Track purchases as a goal instead.

Connect Lemon Squeezy

One API key. It takes about a minute.

  1. Create an API key

    In Settings → API, create a key named “BugOtter”.
    API keyeyJ…
  2. Paste it on Revenue

    BugOtter lists your stores to check the key and shows their names on the connection.
  3. Let the first sync run

    Every product, 90 days of orders and renewals, and every current subscription with its price.
  4. Match products to apps

    BugOtter suggests a match from each product's name. Confirm it once.
  • Keys are long tokens that start with eyJ. Keys made with test mode on only see test data.
  • The key is stored encrypted. Only its last 4 characters are ever shown.
  • Once matched, the product's revenue, MRR and failed payments show on that app.

Every 15 min

After the first sync, it repeats every 15 minutes.

Or right away when you press Sync now.

Key location checked Nov 4, 2026 in the Lemon Squeezy API docs.

What you'll see

One app's revenue in the live demo. Lemon Squeezy apps get the same view, without revenue by source.

One app's Revenue tab in BugOtter: MRR, a waterfall of how it moved in 30 days, a forecast, revenue, paying subscribers and trials
  1. MRR per app, from your store's subscriptions.
  2. How it moved: new, upgrades, downgrades and cancellations.
  3. A 30-day forecast if the last 30 days repeat.
  4. Trials, and what they're worth if they pay.
  • Orders and renewals after refunds. Lemon Squeezy reports refunds on the order, with its date, so a refund shows on the day it happened.
  • Leaving soon: subscriptions you or the customer cancelled, with the day they end.
  • Failed payments. Failed orders and renewals open an issue on the app and alert you.
  • Customers, anonymous: paying, cancelling or at risk, and lifetime paid. No names or emails.
BugOtter's Where it comes from card: revenue for the last 30 days by product, with payments and share
  1. Revenue by product for the last 30 days, with payment counts and share.

Revenue by traffic source: not yet for Lemon Squeezy

Here's why, and what to do in the meantime.

To link a payment to the visit that brought it, BugOtter needs the visit id on something it can read later.

Lemon Squeezy lets you pass custom data to a checkout, but it only comes back in webhooks, not on the orders and subscriptions BugOtter reads through the API. So there's no checkout snippet to add today, and no traffic source column for Lemon Squeezy revenue.

What you can do now: track the purchase as a goal

Filter Analytics by any source, page or country and the goals list shows how many purchases it led to. You'll see which posts bring buyers, just not the amount.

Thank-you page
// On your thank-you page (or after Lemon.js reports a successful checkout)
window.bo?.track("purchase", { plan: "pro" });

If revenue per source matters most to you, Stripe, Polar and Creem all support it today. Stripe needs no code at all for Payment Links.

How MRR is counted for Lemon Squeezy

Yearly ÷ 12

Price times quantity, turned into a month using the price's renewal interval.

Every 3 months ÷ 3.
  • What counts: active, past-due and unpaid subscriptions, plus cancelled ones until their end date. Trials count once they pay. Paused and expired don't count.
  • Discounts: not subtracted from MRR. Revenue does subtract them: each payment counts its subtotal minus discounts.
  • Tax: left out. Lemon Squeezy is the merchant of record and keeps the tax; BugOtter counts the subtotal.
  • Refunds from the last 90 days of orders are subtracted. A refund on an older order isn't picked up yet.

Check a month by hand with the MRR calculator.

Read-only toward Lemon Squeezy

BugOtter never creates checkouts, refunds, cancels or emails anyone. Its Lemon Squeezy code only reads, and connecting or disconnecting is only in the app, never through the MCP server.

Because Lemon Squeezy keys can't be limited, delete the key in Lemon Squeezy if you stop using BugOtter. Disconnecting in BugOtter deletes the Lemon Squeezy data it copied.

Lemon Squeezy next to the other payment providers

BugOtter reads four providers. Here's what each one gives you.

What BugOtter reads from each payment provider
FeatureStripePolarLemon SqueezyCreem
Access
The key you give BugOtterYesRestricted key, Read onlyYesOrganization token, read scopesPartlyAPI key (can't be limited)PartlyAPI key (can't be limited)
Revenue
Revenue after refundsYesYesYesYes
MRR and how it movedYesYesYesYes
Trials and when they endYesYesYesYes
Cancellations scheduled (leaving soon)YesYesYesYes
Why customers cancelledYesYesNoNo
Refunds on the day they happenedYesPartlyWith refunds:readPartlyOrders from the last 90 daysPartlyDated by the payment
Failed payment alertsYesNoYesYes
Linking and testing
Revenue by traffic sourceYesPayment Links: automatic. Your checkout: metadataYesCheckout metadataNoNot yetPartlySubscriptions, via checkout metadata
Test modeYesrk_test_ keys, marked Test modeNoNot yet (the sandbox is a separate API)YesTest-mode API keysYescreem_test_ keys, marked Test mode

Questions

Does BugOtter show revenue by traffic source for Lemon Squeezy?

Not yet. Lemon Squeezy only returns checkout custom data in webhooks, and BugOtter reads Lemon Squeezy through its API, so it can't link a payment to the visit that started it. You still get revenue and MRR per app, and you can track purchases as a goal to see which sources convert.

Can I limit the Lemon Squeezy API key to reading?

Lemon Squeezy's docs don't offer read-only keys, so the key you paste could make changes. BugOtter's Lemon Squeezy code only sends read requests: it never creates checkouts, refunds or cancels anything, and coding agents can't reach the connection over MCP. You can delete the key in Lemon Squeezy at any time.

Why is MRR different from what Lemon Squeezy shows?

BugOtter counts each subscription at its price times quantity, turned into a month, and doesn't subtract discounts. A subscription you cancelled keeps counting until it actually ends, because it's still paid for until then.

Are renewals counted, or only first orders?

Both. The first payment of a subscription is an order; every renewal after it is a subscription invoice, and BugOtter reads those too.

Does it work in test mode?

Yes. Create the API key with test mode on in Lemon Squeezy and BugOtter reads your test orders and subscriptions. BugOtter doesn't label a Lemon Squeezy connection as test mode, so swap to a live key before you trust the numbers.

How often does it sync?

Every 15 minutes, or right away when you press Sync now. The first sync reads the last 90 days of orders and renewals and every current subscription.

Your store's numbers, next to everything else your app does.

14 days of everything, no card needed. Plans from $10 a month, billed yearly.