App Analytics
curl --request GET \
--url https://api.launchmystore.io/apps/developer/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.launchmystore.io/apps/developer/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.launchmystore.io/apps/developer/analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.launchmystore.io/apps/developer/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.launchmystore.io/apps/developer/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.launchmystore.io/apps/developer/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.launchmystore.io/apps/developer/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data.apps": [
{
"appId": "<string>",
"name": "<string>",
"installCount": 123,
"rating": 123,
"reviewCount": 123
}
],
"data.totalRevenue": 123,
"data.totalInstalls": 123,
"data.totalTransactions": 123,
"data.installations": [
{}
],
"data.activeSubscribers": 123,
"data.total": 123,
"data.success": 123,
"data.failed": 123,
"data.pending": 123,
"data.retrying": 123
}App Analytics
App Analytics
Developer analytics: aggregate installs and revenue, per-app installations, webhook delivery health, and function execution logs.
GET
/
apps
/
developer
/
analytics
App Analytics
curl --request GET \
--url https://api.launchmystore.io/apps/developer/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.launchmystore.io/apps/developer/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.launchmystore.io/apps/developer/analytics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.launchmystore.io/apps/developer/analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.launchmystore.io/apps/developer/analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.launchmystore.io/apps/developer/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.launchmystore.io/apps/developer/analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data.apps": [
{
"appId": "<string>",
"name": "<string>",
"installCount": 123,
"rating": 123,
"reviewCount": 123
}
],
"data.totalRevenue": 123,
"data.totalInstalls": 123,
"data.totalTransactions": 123,
"data.installations": [
{}
],
"data.activeSubscribers": 123,
"data.total": 123,
"data.success": 123,
"data.failed": 123,
"data.pending": 123,
"data.retrying": 123
}App analytics surface the operational health of your published apps —
distinct from the store-level analytics at
The aggregate counts are returned under
For the individual delivery records (with request/response bodies and retry
history), use
A companion route,
/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.
curl -X GET "https://api.launchmystore.io/apps/developer/analytics" \
-H "Authorization: Bearer <DEVELOPER_JWT>"
array
number
Sum of developer-net amount across all paid transactions (rounded to 2 decimals).
integer
Sum of
installCount across all apps.integer
Count of paid billing transactions.
{
"status": 200,
"state": "success",
"message": null,
"data": {
"apps": [
{ "appId": "fb7c1c8b-8e1d-4f4e-a05c-1b8c5a3b9f02", "name": "Tiered Discounts", "installCount": 142, "rating": 4.7, "reviewCount": 18 }
],
"totalRevenue": 1172.75,
"totalInstalls": 142,
"totalTransactions": 96
},
"count": null,
"pagination": null
}
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.
string
required
App UUID. The caller must own it.
curl -X GET "https://api.launchmystore.io/apps/developer/<APP_ID>/installations" \
-H "Authorization: Bearer <DEVELOPER_JWT>"
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).integer
Installations that are active with an active or trialing billing status.
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.
string
required
App UUID. The caller must own it.
curl -X GET "https://api.launchmystore.io/apps/developer/<APP_ID>/webhook-deliveries/stats" \
-H "Authorization: Bearer <DEVELOPER_JWT>"
data (wrapped as
{ status, state, data }):
integer
Total delivery attempts logged.
integer
Deliveries that succeeded.
integer
Deliveries that failed after the final retry.
integer
Deliveries not yet attempted.
integer
Deliveries scheduled for a retry.
{
"status": 200,
"state": "success",
"data": {
"total": 8421,
"success": 8394,
"failed": 27,
"pending": 0,
"retrying": 0
}
}
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.
string
required
App UUID. The caller must own it.
string
required
Function handle, or
all for every function in the app.integer
default:"1"
integer
default:"50"
string
Filter to one execution status.
curl -X GET "https://api.launchmystore.io/apps/developer/<APP_ID>/functions/all/logs?limit=50" \
-H "Authorization: Bearer <DEVELOPER_JWT>"
GET /apps/developer/:appId/functions/:handle/runs
(limit, status), returns the per-run records the dashboard renders in its
runs panel.
Error codes
| Code | Description |
|---|---|
401 | Missing or invalid developer JWT. |
403 | The calling developer does not own this app (per-app routes). |