BusinessReports
Business
Reports
Dashboard, analytics, activity and acquisition.
The dashboard, analytics, activity feed and join-source figures the business sees in the app, for the same days. Customers appear only as ids and masked numbers. One key gets 60 report reads a minute.
Paths are relative to https://app.revisit.cards/v1/developer.
What each report figure means
/reports/definitionsScopereports:read
Requires reports:read (in Read-only and Full access). Static: the filters, limits and the meaning of every metric, plus the time zone.
Returns 200
timeZonestringRequiredfiltersobject[]Requiredfilters[].namestringfilters[].descriptionstringmetricsobject[]Requiredmetrics[].namestringmetrics[].reportenum- One of
dashboard,analytics,activity,acquisition,passes. metrics[].definitionstring
curl "https://app.revisit.cards/v1/developer/reports/definitions" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"filters": [
{
"description": "Collect 10, get 1 free",
"name": "Mishti Ghor"
}
],
"metrics": [
{
"definition": "definition",
"name": "Mishti Ghor",
"report": "dashboard"
}
],
"timeZone": "Asia/Dhaka"
},
"requestId": "ef57f1e1-f48c-43eb-8692-ad0a01103705",
"success": true
}Dashboard figures
/reports/dashboardScopereports:read
Requires reports:read (in Read-only and Full access). Read only, 60 reads a minute per key. The figure is the one the business sees in the app for the same filters, computed by the app's own query, for the key's business (a test key reads the invented workspace). Days are Asia/Dhaka days. A key limited to programs or branches reads only inside them and, with several, must name one (programId / branchId), else 403 INSUFFICIENT_SCOPE; a program or branch outside the business or the key is 404. Customers are ids and masked numbers only: no name, whole number, email, device or address. period is today, 7d, 30d (default) or 90d; 90d needs advanced reporting (403 FEATURE_REQUIRED). The dashboard's "Recent customers" list is not part of it (read customers with customers:read).
Query
periodenum- One of
today,7d,30d,90d. Default"30d". programIduuidbranchIduuid
Returns 200
hasCustomersbooleanRequiredheadlineobjectRequiredhealthobjectRequiredlastActivityAtstring or nullmenuViewsobjectperiodobjectRequiredperiod.bucketenum- One of
hour,day. period.keystringperiod.fromstringperiod.tostringrowNowobjectRequiredstartedOnstringRequired
Errors
- 403
INSUFFICIENT_SCOPEthis key lacks the scope the route needs. - 403
FEATURE_REQUIRED
curl "https://app.revisit.cards/v1/developer/reports/dashboard" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"hasCustomers": false,
"headline": {},
"health": {},
"period": {
"bucket": "hour",
"from": "2026-11-03",
"key": "welcome",
"to": "2026-11-03"
},
"rowNow": {},
"startedOn": "2026-11-03"
},
"requestId": "b7d1f4ff-4063-4e71-a575-a79a426680a6",
"success": true
}Analytics figures
/reports/analyticsScopereports:read
Requires reports:read (in Read-only and Full access). Read only, 60 reads a minute per key. The figure is the one the business sees in the app for the same filters, computed by the app's own query, for the key's business (a test key reads the invented workspace). Days are Asia/Dhaka days. A key limited to programs or branches reads only inside them and, with several, must name one (programId / branchId), else 403 INSUFFICIENT_SCOPE; a program or branch outside the business or the key is 404. Customers are ids and masked numbers only: no name, whole number, email, device or address. Needs the Analytics screen feature; 90d and all need advanced reporting (403 FEATURE_REQUIRED). topCustomers are ids and visit counts.
Query
rangeenum- One of
7d,30d,90d,all. Default"30d". programIduuidbranchIduuid
Returns 200
bucketenumRequired- One of
day,week. kpisobjectRequired- newCustomers, stamps, redeems, each with current, previous and change.
rangestringRequiredrepeatobjectRequiredrepeat.ratenumber or nullrepeat.repeatersintegerrepeat.visitorsintegerseriesobject[]Requiredseries[].datestringseries[].stampsintegerseries[].redeemsintegertopCustomersobject[]RequiredtopCustomers[].customerIdstringRequiredtopCustomers[].visitsintegerRequired
Errors
- 403
INSUFFICIENT_SCOPEthis key lacks the scope the route needs. - 403
FEATURE_REQUIRED
curl "https://app.revisit.cards/v1/developer/reports/analytics" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"bucket": "day",
"kpis": {},
"range": "30d",
"repeat": {
"rate": 1,
"repeaters": 64,
"visitors": 128
},
"series": [
{
"date": "2026-11-03",
"redeems": 19,
"stamps": 7
}
],
"topCustomers": [
{
"customerId": "eb83b9c0-5619-432d-b857-cef7fcf84edb",
"visits": 342
}
]
},
"requestId": "fa419836-ee66-451e-8459-ff5df9c65470",
"success": true
}The activity feed
/reports/activityScopereports:read
Requires reports:read (in Read-only and Full access). Read only, 60 reads a minute per key. The figure is the one the business sees in the app for the same filters, computed by the app's own query, for the key's business (a test key reads the invented workspace). Days are Asia/Dhaka days. A key limited to programs or branches reads only inside them and, with several, must name one (programId / branchId), else 403 INSUFFICIENT_SCOPE; a program or branch outside the business or the key is 404. Customers are ids and masked numbers only: no name, whole number, email, device or address. The app's live feed, newest first, 30 events a page, walked with the opaque next cursor. Includes stamps and redemptions a service wrote through the API, with the same semantics as the counter's. Card changes are not part of it. Needs the Activity plugin (404 while off) and the activity log feature.
Query
kindenum- One of
all,stamps,redemptions,joins. Default"all". cursorstringprogramIduuidbranchIduuid
Returns 200
nextstring or nullRequired- Cursor of the next page; null at the end.
itemsobject[]Requireditems[].amountinteger or nullRequireditems[].atdate-timeRequireditems[].branchNamestring or nullRequireditems[].cardNamestring or nullRequireditems[].cardTypestring or nullRequireditems[].detailstring or nullRequireditems[].eventenumRequired- One of
stamp,redeem,join,pass. items[].idstringRequireditems[].maskedPhonestring or nullRequired- Last four digits only, like •••• 4821.
items[].programIdstring or nullRequired
Errors
- 403
INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
curl "https://app.revisit.cards/v1/developer/reports/activity" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"items": [
{
"amount": 1250,
"at": "2026-11-03T08:41:12.000Z",
"branchName": "Dhanmondi",
"cardName": "Mishti Ghor",
"cardType": "stamp",
"detail": "Morning shift",
"event": "stamp",
"id": "d12cc02b-02fe-4a1f-83b0-5414e70fd99c",
"maskedPhone": "•••• 4821",
"programId": "d7595bbd-4342-41b4-9037-2e61a9f8403f"
}
],
"next": "eyJvZmZzZXQiOjUwfQ"
},
"requestId": "a0cee60f-e7ce-495f-a61a-f9f2f5b8e846",
"success": true
}Where customers come from
/reports/acquisitionScopereports:read
Requires reports:read (in Read-only and Full access). Read only, 60 reads a minute per key. The figure is the one the business sees in the app for the same filters, computed by the app's own query, for the key's business (a test key reads the invented workspace). Days are Asia/Dhaka days. A key limited to programs or branches reads only inside them and, with several, must name one (programId / branchId), else 403 INSUFFICIENT_SCOPE; a program or branch outside the business or the key is 404. Customers are ids and masked numbers only: no name, whole number, email, device or address. Counts of join-page opens and joins by channel, device, system, browser, country and the printed display (?p= placement tag). Needs advanced reporting. A key limited to programs is refused (403): a page open has no program. A key limited to one branch reads that branch.
Query
rangeenum- One of
7d,30d,90d,all. Default"30d". branchIduuid
Returns 200
joinsintegerRequiredopensintegerRequiredrangeenumRequired- One of
7d,30d,90d,all. browsersobject[]Requiredbrowsers[].countintegerRequiredbrowsers[].labelstringRequiredchannelsobject[]Requiredchannels[].countintegerRequiredchannels[].labelstringRequiredcountriesobject[]Requiredcountries[].countintegerRequiredcountries[].labelstringRequireddevicesobject[]Requireddevices[].countintegerRequireddevices[].labelstringRequiredosListobject[]RequiredosList[].countintegerRequiredosList[].labelstringRequiredplacementsobject[]Requiredplacements[].countintegerRequiredplacements[].labelstringRequired
Errors
- 403
INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
curl "https://app.revisit.cards/v1/developer/reports/acquisition" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"browsers": [
{
"count": 12,
"label": "Morning menu"
}
],
"channels": [
{
"count": 12,
"label": "Morning menu"
}
],
"countries": [
{
"count": 12,
"label": "Morning menu"
}
],
"devices": [
{
"count": 12,
"label": "Morning menu"
}
],
"joins": 46,
"opens": 31,
"osList": [
{
"count": 12,
"label": "Morning menu"
}
],
"placements": [
{
"count": 12,
"label": "Morning menu"
}
],
"range": "7d"
},
"requestId": "3ba42326-5903-4609-bc64-b7e2eeae15a3",
"success": true
}Pass figures per pass type
/reports/passesScopereports:read
Requires reports:read. Read only, 60 reads a minute per key. The Passes panel of the app's Analytics screen for the same range: per pass type (gift card, offer, ticket, boarding pass, transit, generic), only types with something to show, passes issued and used in the range and, for gift cards, value spent in the range and the balance outstanding now, in whole poisha (undone uses left out). Needs analytics on the plan (90d and all also need advancedReporting) and the passes plugin (404 while off). A key limited to programs is refused (403 INSUFFICIENT_SCOPE): passes belong to no program. A key limited to one branch reads that branch; with several it must name one. Counts only, no customer data. A test key reads the invented workspace.
Query
rangeenum- One of
7d,30d,90d,all. Default"30d". branchIduuid
Returns 200
rangeenumRequired- One of
7d,30d,90d,all. typesobject[]Requiredtypes[].typeenumRequired- One of
giftCard,offer,eventTicket,boardingPass,transit,generic. types[].issuedintegerRequiredtypes[].usedintegerRequiredtypes[].spentinteger or nullRequired- Gift cards only
types[].balanceOutstandinginteger or nullRequired- Gift cards only
Errors
- 403
INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
curl "https://app.revisit.cards/v1/developer/reports/passes" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"range": "7d",
"types": [
{
"balanceOutstanding": 0,
"issued": 40,
"spent": 500,
"type": "giftCard",
"used": 12
}
]
},
"requestId": "c593335f-111e-4255-bd3e-fe1f0f0831a2",
"success": true
}