Skip to content
BusinessReports

Business

Reports

Dashboard, analytics, activity and acquisition.

Pilotv1

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

GET/reports/definitions

Scopereports: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

timeZonestringRequired
filtersobject[]Required
filters[].namestring
filters[].descriptionstring
metricsobject[]Required
metrics[].namestring
metrics[].reportenum
One of dashboard, analytics, activity, acquisition, passes.
metrics[].definitionstring
Request
curl "https://app.revisit.cards/v1/developer/reports/definitions" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "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

GET/reports/dashboard

Scopereports: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".
programIduuid
branchIduuid

Returns 200

hasCustomersbooleanRequired
headlineobjectRequired
healthobjectRequired
lastActivityAtstring or null
menuViewsobject
periodobjectRequired
period.bucketenum
One of hour, day.
period.keystring
period.fromstring
period.tostring
rowNowobjectRequired
startedOnstringRequired

Errors

  • 403INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
  • 403FEATURE_REQUIRED
Request
curl "https://app.revisit.cards/v1/developer/reports/dashboard" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "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

GET/reports/analytics

Scopereports: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".
programIduuid
branchIduuid

Returns 200

bucketenumRequired
One of day, week.
kpisobjectRequired
newCustomers, stamps, redeems, each with current, previous and change.
rangestringRequired
repeatobjectRequired
repeat.ratenumber or null
repeat.repeatersinteger
repeat.visitorsinteger
seriesobject[]Required
series[].datestring
series[].stampsinteger
series[].redeemsinteger
topCustomersobject[]Required
topCustomers[].customerIdstringRequired
topCustomers[].visitsintegerRequired

Errors

  • 403INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
  • 403FEATURE_REQUIRED
Request
curl "https://app.revisit.cards/v1/developer/reports/analytics" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "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

GET/reports/activity

Scopereports: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".
cursorstring
programIduuid
branchIduuid

Returns 200

nextstring or nullRequired
Cursor of the next page; null at the end.
itemsobject[]Required
items[].amountinteger or nullRequired
items[].atdate-timeRequired
items[].branchNamestring or nullRequired
items[].cardNamestring or nullRequired
items[].cardTypestring or nullRequired
items[].detailstring or nullRequired
items[].eventenumRequired
One of stamp, redeem, join, pass.
items[].idstringRequired
items[].maskedPhonestring or nullRequired
Last four digits only, like •••• 4821.
items[].programIdstring or nullRequired

Errors

  • 403INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
Request
curl "https://app.revisit.cards/v1/developer/reports/activity" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "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

GET/reports/acquisition

Scopereports: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

joinsintegerRequired
opensintegerRequired
rangeenumRequired
One of 7d, 30d, 90d, all.
browsersobject[]Required
browsers[].countintegerRequired
browsers[].labelstringRequired
channelsobject[]Required
channels[].countintegerRequired
channels[].labelstringRequired
countriesobject[]Required
countries[].countintegerRequired
countries[].labelstringRequired
devicesobject[]Required
devices[].countintegerRequired
devices[].labelstringRequired
osListobject[]Required
osList[].countintegerRequired
osList[].labelstringRequired
placementsobject[]Required
placements[].countintegerRequired
placements[].labelstringRequired

Errors

  • 403INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
Request
curl "https://app.revisit.cards/v1/developer/reports/acquisition" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "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

GET/reports/passes

Scopereports: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[]Required
types[].typeenumRequired
One of giftCard, offer, eventTicket, boardingPass, transit, generic.
types[].issuedintegerRequired
types[].usedintegerRequired
types[].spentinteger or nullRequired
Gift cards only
types[].balanceOutstandinginteger or nullRequired
Gift cards only

Errors

  • 403INSUFFICIENT_SCOPEthis key lacks the scope the route needs.
Request
curl "https://app.revisit.cards/v1/developer/reports/passes" \
  -H "Authorization: Bearer $DEVELOPER_API_KEY"
Response
{
  "data": {
    "range": "7d",
    "types": [
      {
        "balanceOutstanding": 0,
        "issued": 40,
        "spent": 500,
        "type": "giftCard",
        "used": 12
      }
    ]
  },
  "requestId": "c593335f-111e-4255-bd3e-fe1f0f0831a2",
  "success": true
}