Revenue API
Connect your own Stripe account or Lemon Squeezy store, read only, and ask for the numbers a solo founder checks: MRR, who started paying, who cancelled, and what was collected. It is deliberately small. It is also what lets Launch tell you which waitlist signups became customers.
What exists today
- You connect Stripe in the dashboard with a restricted key (rk_live_…) that has read access to Customers, Subscriptions, Invoices, Products and Events. Secret keys (sk_…) are refused.
- Launch never writes to your Stripe account. The client it uses for your account can only issue GET requests, and that rule is covered by tests.
- The key is encrypted at rest, is never returned by any endpoint or MCP tool, and is deleted together with all synced data when you disconnect or delete the project.
- Selling through Lemon Squeezy? Paste an API key and pick the store. A Lemon Squeezy key cannot be limited to reading, so the promise is Launch's: its Lemon Squeezy client can only send GET requests, covered by tests. Payments are counted before tax, with refunds taken off.
- A project can connect Stripe and Lemon Squeezy both; the numbers add up per currency.
- Customers, subscriptions and paid invoices are copied into Launch and refreshed hourly from Stripe's event feed, so reads are fast and do not spend your Stripe rate limit.
- MRR is an operational number: yearly plans divided by twelve, quantities included, running coupons applied. Metered and tiered prices count as zero and refunds are not subtracted. It is not accounting revenue.
- Amounts are reported per currency in the smallest unit and are never converted or added together.
- There is no MCP tool that connects Stripe, and no tool takes a key as input. A payment-account credential should not pass through an AI conversation.
Endpoints
| GET | /v1/integrations/stripe | Connection status, last sync, counts |
| GET | /v1/integrations/lemonsqueezy | Lemon Squeezy store status, last sync, counts |
| GET | /v1/revenue/summary | MRR, active, trialing, new, churned, collected |
| GET | /v1/revenue/series | Collected revenue per day, week or month |
| GET | /v1/revenue/events | Recent payments and cancellations |
| GET | /v1/revenue/by-source | Paying customers by first-touch source or country |
| GET | /v1/revenue/economics | ARPA, monthly churn and 12-month lifetime value |
Full reference with request and response schemas: docs.nordva.dev. Every response uses the same envelope and stable error codes.
MCP tools
The same operations are available to Claude Code, Claude Desktop and Cursor through the Nordva MCP server at mcp.nordva.dev:
get_stripe_connection_statusget_lemonsqueezy_connection_statusget_revenue_summaryget_revenue_seriesget_revenue_by_sourceget_revenue_economicslist_recent_payments
Arguments, example prompts and client setup →
Questions
- Can Launch charge, refund or change anything in my Stripe account?
- No. Launch only reads. It asks for a restricted key with read permissions, and the code path that talks to your account cannot send anything but a GET request.
- Why a restricted key and not my secret key?
- Stripe requires third parties to use restricted keys or OAuth, and a secret key can do anything in your account. If you paste one by mistake Launch rejects it, does not store it, and tells you to roll it.
- How fresh are the numbers?
- Each connection syncs about once an hour. Every response includes the sync status and the time of the last successful sync, and says so when the first import is still running or the key has been revoked.
- Does it work with Stripe test mode?
- Yes. A key starting with rk_test_ connects a test-mode account, and responses are marked as test mode.
- Can Launch refund or cancel anything in my Lemon Squeezy store?
- It never does. A Lemon Squeezy API key cannot be restricted to reading, so the guarantee is in Launch's code: the client that talks to your store can only send GET requests, and the tests check every request. The key is encrypted and never shown again.