Skip to main content
GET
App Analytics
App analytics surface the operational health of your published apps — distinct from the store-level analytics at /api/v1/analytics/* (which report a merchant’s sales / orders / customers, not the app developer’s own metrics). These endpoints are read by the developer dashboard in the admin and are scoped to the calling developer account. They live under the developer namespace /apps/developer/... — there is no /apps/developer/:appId/analytics/* sub-namespace; the capabilities below are split across the real routes. Auth: developer JWT (MERCHANT or PARTNER role). The storeId / developer account is resolved from the token; per-app routes additionally verify that the caller owns the :appId.
The merchant-facing /api/v1/analytics/* endpoints documented in Analytics overview report a different metric set (sales, orders, conversion) and require the read_analytics OAuth scope. The developer routes below are JWT-only and have no OAuth scope.

Aggregate analytics

GET /apps/developer/analytics Returns a flat aggregate across all of the developer’s apps — per-app install counts and ratings, plus total developer-net revenue, installs, and paid-transaction count. There is no :appId param and no day-bucketed time series.
data.apps
array
data.totalRevenue
number
Sum of developer-net amount across all paid transactions (rounded to 2 decimals).
data.totalInstalls
integer
Sum of installCount across all apps.
data.totalTransactions
integer
Count of paid billing transactions.

Per-app installations

GET /apps/developer/:appId/installations Returns the raw installation rows for one app (with the installing store attached), plus an active-subscriber count and total-install count. This is a list, not a bucketed series.
appId
string
required
App UUID. The caller must own it.
data.installations
array
Installation rows, newest first. Each includes installationId, storeId, status, billingStatus, installedVersion, autoUpdate, pinnedVersion, billingStartDate, trialEndsAt, createdAt, updatedAt, and a nested store (id, business, storeURL, email).
data.activeSubscribers
integer
Installations that are active with an active or trialing billing status.
data.totalInstalls
integer
Installations not pending uninstall.

Webhook delivery health

GET /apps/developer/:appId/webhook-deliveries/stats Aggregate delivery counts across all of the app’s registered webhooks. Delivery uses 3-retry exponential backoff (1m / 5m / 15m); a delivery is counted as failed only after the final retry returns non-2xx.
appId
string
required
App UUID. The caller must own it.
The aggregate counts are returned under data (wrapped as { status, state, data }):
data.total
integer
Total delivery attempts logged.
data.success
integer
Deliveries that succeeded.
data.failed
integer
Deliveries that failed after the final retry.
data.pending
integer
Deliveries not yet attempted.
data.retrying
integer
Deliveries scheduled for a retry.
For the individual delivery records (with request/response bodies and retry history), use GET /apps/developer/:appId/webhook-deliveries (paged via page, limit, and optional status / topic filters).

Function execution logs

GET /apps/developer/:appId/functions/:handle/logs Paged execution-log records for one function. Pass all as the :handle to pull a unified feed across every function in the app.
appId
string
required
App UUID. The caller must own it.
handle
string
required
Function handle, or all for every function in the app.
page
integer
default:"1"
limit
integer
default:"50"
status
string
Filter to one execution status.
A companion route, GET /apps/developer/:appId/functions/:handle/runs (limit, status), returns the per-run records the dashboard renders in its runs panel.

Error codes

CodeDescription
401Missing or invalid developer JWT.
403The calling developer does not own this app (per-app routes).