SUBSCRIPTION and SUBSCRIPTION_EVENT reports, normalize all proceeds to a monthly basis, and convert every currency to USD using historical exchange rates — so a yearly subscription priced in EUR contributes the right MRR amount on the day it was sold.
Requires connected ASC account. Connect your App Store Connect API key and Vendor Number in appeeky.com → Settings → Integrations. Subscription reports refresh daily and right after you connect.
Pro feature — requires Indie plan or higher.
Get Subscription Metrics
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
from | string | 30 days ago | Start date YYYY-MM-DD. |
to | string | today | End date YYYY-MM-DD. |
appId | string | — | Filter to one App Store Connect app ID. Omit to roll up across all your apps (MRR is summed, churn is paying-subscriber-weighted). |
Field reference
totals
Headline numbers across the requested window.
| Field | Description |
|---|---|
mrr_usd | Monthly Recurring Revenue for the most recent day in the window, in USD. Yearly subs are normalized to proceeds / 12, weekly to proceeds × 4.345, etc. Includes only paying subscribers (introductory $0 offers contribute 0). |
mrr_delta_pct | Relative change in MRR vs the first day of the window. 0.0832 = +8.32%. |
arr_usd | Annual Run Rate — mrr_usd × 12. |
paying_subscribers | Active paying subscribers on the most recent day. Excludes free trials. |
arpu_usd | Average Revenue Per User — mrr_usd / paying_subscribers. |
avg_churn_rate | Weighted average churn over the window (weighted by paying_subscribers so a tiny app with 100% churn doesn’t dominate the rate). 0.0412 = 4.12% monthly churn. |
trial_conversion_rate | trial_conversions / trial_starts over the window. 0.3620 = 36.2% of trials become paying subs. |
new_subscriptions, canceled_subscriptions, refunded_subscriptions, trial_starts, trial_conversions, expired_subscriptions | Cumulative event counts in the window. |
apps
One row per app, sorted by mrr_usd descending. Each row is the latest day’s snapshot for that app, with 30-day rolling event counts. Includes the app’s name and icon so dashboards don’t need a second round-trip per app.
series
Daily time series ready for charting. When appId is omitted, MRR and event counts are summed across apps, and churn is paying-subscriber-weighted (not a simple mean — same logic as totals.avg_churn_rate).
| Field | Description |
|---|---|
metric_date | ISO date YYYY-MM-DD. |
mrr_usd | MRR for that day. |
arpu_usd | mrr_usd / paying_subscribers for that day. |
paying_subscribers | Active paying subscribers on that day. |
new_subscriptions | New paying subs that day. |
canceled_subscriptions | Cancellations (including auto-renew off). |
refunded_subscriptions | Apple-issued refunds. |
reactivated_subscriptions | Lapsed users who came back. |
trial_starts | New free-trial starts. |
trial_conversions | Trials that converted to paying. |
expired_subscriptions | Subscriptions that lapsed without renewing. |
billing_retries | Renewals Apple is retrying after a payment failure. |
churn_rate | canceled_subscriptions / paying_subscribers_yesterday, rounded to 6 decimals. |
How the numbers are computed
MRR — monthly normalization and FX
MRR — monthly normalization and FX
We download Apple’s daily
SUBSCRIPTION report. For each row, we:- Skip rows with
Active Standard Price Subscriptions = 0(the user is in a free trial or intro offer). - Normalize
Developer Proceedsto a monthly basis using the subscription duration:- 1 week →
× 4.345 - 1 month →
× 1 - 2 months →
÷ 2 - 3 months →
÷ 3 - 6 months →
÷ 6 - 1 year →
÷ 12
- 1 week →
- Convert the result from the customer’s currency to USD using the historical exchange rate for that day (Frankfurter, ECB-sourced). A subscription sold in EUR on April 1st is converted at April 1st’s rate, not today’s.
- Sum across all active subs for that app and date.
Churn — paying-subscriber-weighted
Churn — paying-subscriber-weighted
For each When you query without A 10-user app with 100% churn next to a 10,000-user app with 5% churn produces a weighted churn near 5%, which reflects business reality.
(app, date) we compute:appId, churn across apps is weighted by paying subscribers, not averaged:Trial conversion rate
Trial conversion rate
trial_starts in March and trial_conversions in April. Over a long enough window the ratio converges to the true conversion rate; over a short window it can read above 100% if a backlog of older trials converts (this is normal).Event categories
Event categories
We map Apple’s free-text event strings to consistent categories:
Unknown event strings are logged and ignored — they won’t break aggregation.
| Apple event | Mapped to |
|---|---|
Subscribe, Renew | new_subscriptions |
Cancel, Auto-Renew Off | canceled_subscriptions |
Refund | refunded_subscriptions |
Reactivate | reactivated_subscriptions |
Subscribe with Trial, Free Trial Started | trial_starts |
Convert to Paid Subscription | trial_conversions |
Subscription Expired | expired_subscriptions |
Billing Retry | billing_retries |
MCP Tool
This endpoint is exposed as an MCP tool so AI assistants can analyze revenue health on your behalf:| Tool | Description |
|---|---|
asc_subscription_metrics | MRR / ARR / ARPU / churn / trial conversion + daily series |
Common Workflows
Daily revenue dashboard
JavaScript
Identify your highest-churn app
JavaScript
Error Codes
| Status | Code | When |
|---|---|---|
| 401 | INVALID_API_KEY | Invalid or inactive API key |
| 403 | PRO_FEATURE | Free plan — upgrade to Indie or higher |
| 404 | USER_NOT_FOUND | User not in system (connect ASC first) |
| 429 | RATE_LIMIT_EXCEEDED | Not enough credits |
| 500 | METRICS_ERROR | Database or sync error |
Limits & Caveats
- Data is computed from Apple’s daily reports, which are typically available 1–2 days after the day they cover. Today’s date will usually have no data; yesterday’s may be partial.
- MRR uses developer proceeds (post-Apple-cut), not list price. This matches what hits your bank account.
- Churn is computed from cancellation events, not from comparing subscriber counts day-over-day. This avoids skew from new subscribers added the same day.
- Refunds reduce revenue but are reported separately; they do not subtract from
mrr_usddirectly. For “net MRR after refunds”, subtractrefunded_subscriptions × ARPUfrommrr_usd. - Backfill on first connect covers the last 30 days.

