Docs · 4/13 Revenue

Revenue

BugOtter reads your payments from Stripe, Polar, Lemon Squeezy or Creem and shows what each app earns: MRR, customers, churn, profit and which traffic sources pay. It only reads: it never charges, refunds or emails your customers. Read this to connect a provider, or when a number doesn't look right.

In 30 seconds

Settings → Connections → paste a read-only key for your provider → Connect. Then Revenue → Sources and pick which app each product belongs to.

Connect a provider

Open Settings → Connections → Payment providers. You can connect more than one.

  • Stripe: in Stripe, open Developers → API keys → Create restricted key. Give it Read on Products, Prices, Invoices, Checkout Sessions, Refunds and Subscriptions. Paste it in Restricted key (rk_live_… or rk_test_…) and click Connect.
  • Polar: open Settings → Developers → New token for your organization, with the scopes products:read, orders:read and subscriptions:read (add refunds:read to see refunds). Paste it in Organization access token.
  • Lemon Squeezy: open Settings → API → Create API key. Paste it in API key.
  • Creem: open Developers → API keys and copy the key (creem_test_… works for test mode). Paste it in API key. Creem keys can't be limited to reading yet; BugOtter only reads anyway.

When it works you see "Connected. Found N payments and N subscriptions."

Link products to apps

Revenue follows the product. Open Revenue → Sources, and for each product pick its app from the list (or Not an app (unassigned)). Matches BugOtter is fairly sure of are marked Suggested. A banner tells you when products earn money but aren't linked yet.

You can also do it from an app: Setup → See which sources pay → Link a product. Moving from one provider to another? Link the new product to the same app and its history carries on.

Syncing

Payments sync every 15 minutes. The first sync reads the last 90 days; MRR from before that is rebuilt from subscription start dates and drawn dashed. Each provider card shows when it last synced, with Sync now and Disconnect. Disconnecting deletes the synced revenue from BugOtter; nothing changes in your provider.

The Revenue page

Revenue in the top bar covers all your apps. Pick a range (7 days, 30 days, 90 days or 12 months) on Overview and Activity.

  • Overview: MRR and its yearly run rate, paying subscribers and trials, how MRR moved (new, upgrades, downgrades, cancellations; click a bar for the subscriptions behind it), a forecast once there are two weeks of data, which app makes money, what needs a look (failed payments, unlinked products), where revenue comes from (by product, country or source), and churn, lifetime value and recovered payments.
  • Portfolio: which apps are worth keeping over the last 30 days, tagged Keep, Watch or Put to sleep?. Suggestions only; nothing changes until you choose.
  • Customers: Paying, Cancelled and At risk (card failing, or gone quiet for 3 weeks). Click one for their timeline: where they came from, what they paid, and errors they hit. Where good customers come from shows which sources keep paying after 90 days.
  • Activity: every payment, refund and recovery, and your top subscriptions.
  • Sources: your providers, and which product belongs to which app.

Each app also has its own Revenue tab with the same numbers for that app.

Revenue Overview: MRR of $1,389 with its yearly run rate, a waterfall of how MRR moved over 30 days, a forecast, and revenue, subscribers and trials
  1. MRR and its yearly run rate.
  2. How MRR moved: new, upgrades, downgrades and cancellations. Click a bar for the subscriptions behind it.
  3. The forecast, once there are two weeks of data.
  4. Paying subscribers and trials, with what trials are worth if they pay.
Where it comes from: revenue split by product, with tabs for By country and By source
  1. Split by product, country or traffic source.
  2. Each row shows the amount and its share.

"Why doesn't this match Stripe?" under MRR explains exactly how it's counted. In short: active and past-due subscriptions at their price, as a monthly amount (yearly ÷ 12). Trials count once they pay. Currencies are never converted or added together.

MRR goal

On Revenue → Overview, click Set an MRR goal, enter the amount and currency, then Set goal. Progress shows under MRR. Change goal or Remove goal any time.

Running costs and profit

Add what each app costs to run, so you see profit, not only revenue. Open the app → Revenue → Running costs → Add a cost: a name (Vercel, OpenAI, a domain…), the amount and currency, and a month or a year. Up to 30 per app. Yearly costs count as a twelfth each month. Different currencies stay separate; nothing is converted. A Profit column then shows on Revenue → Overview.

Revenue badge

A public "Verified by BugOtter" badge with your revenue, for your site or a launch post. Open the app → Settings → Verified revenue badge (shown once a product is linked). Pick Show MRR, Show a range (like "$100–500") or Uptime only, then Copy HTML or Copy Markdown. It's off until you choose. It shows totals for that app only, in its main currency, updated every 10 minutes.

Share a win

When a good-news alert arrives (a first sale, a new MRR high, a best week, a traffic jump), click Share this win. Choose Show the amount or not, then Post on X, Copy link or Download image. The link shows that card and nothing else from your account.

Common questions

"That's a publishable key (pk_…)"

Stripe has several keys. Create a restricted key (rk_…) under Developers → API keys, with read access.

The Stripe card says "Missing a permission"

Your key works but can't read everything. The message under it names what's missing (Invoices, Checkout, Refunds or Subscriptions). Edit the key in Stripe to add that read permission; no need to connect again.

The Stripe card says "Needs a new key"

Stripe no longer accepts the key: it was deleted, rolled or expired. Create a new restricted key with read access and connect again.

My revenue doesn't show on the app

The product isn't linked to that app yet. Open Revenue → Sources and pick the app for it.

The MRR doesn't match my provider's dashboard

Open "Why doesn't this match Stripe?" under MRR for the exact rules. Differences usually come from trials, coupons, tax or one-time payments.

Why don't Lemon Squeezy payments show a traffic source?

Lemon Squeezy's API doesn't share checkout data yet, so BugOtter can't link a payment to a visit. Revenue itself is still counted.

"This Creem store has more than 50,000 …"

BugOtter reads up to 50,000 transactions, subscriptions or products per Creem store. Tell us and we'll raise it.

Can I hide revenue completely?

Yes. Turn Revenue off in Settings → Account → Modules you use. Every $ disappears from the app; your providers keep syncing in the background, read-only.

See alsoTraffic and analyticsAlerts and the digestPlans and limits