4 operations. Every schema and example on this page is generated from the platform contract.
Merchant view of one customer's loyalty behaviour: activity timeline, favourite day and time, average days between visits, visit streak, weekly trend, loyalty level and rollup stats (stamps, redemptions, progress towards the current reward). Scoped to the merchant’s own store.
Store whose customer to inspect (also authorises the merchant).
The customer to summarise (must belong to store_id).
stampredemptionvoucher_earnedvoucher_expiredcurl -G "https://www.membber.com/api/v1/analytics/customer" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066" \
--data-urlencode "customer_id=96607d1c-0000-4000-8000-d0c500000096"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/analytics/customer", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066", customer_id: "96607d1c-0000-4000-8000-d0c500000096" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getCustomerAnalytics(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066", customerId: "96607d1c-0000-4000-8000-d0c500000096")
).ok.body.json
print(response){
"id": "00000d1b-0000-4000-8000-d0c500000000",
"display_name": "<display_name>",
"phone_last4": "+44 7700 900123",
"customer_since": "<customer_since>",
"last_visit": "<last_visit>",
"days_since_last_visit": 1,
"total_stamps": 1,
"total_redemptions": 1,
"current_progress": 1,
"goal_stamps": 1,
"loyalty_level": "<loyalty_level>",
"favorite_day": {
"day": "<day>",
"percentage": 1
},
"favorite_time": {
"time_range": "<time_range>",
"percentage": 1
},
"avg_days_between_visits": 1,
"visit_streak": 1,
"recent_activity": [
{
"id": "00000d1b-0000-4000-8000-d0c500000000",
"type": "stamp",
"date": "<date>",
"details": "<details>"
}
],
"visits_by_day": [
{
"day": "<day>",
"visits": 1,
"isHighest": true
}
],
"visits_over_time": [
{
"weekLabel": "<weekLabel>",
"visits": 1,
"trend": 1
}
],
"store": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"code": "EXAMPLE10",
"name": "Example name",
"goal": 1
}
}Merchant redemption analytics for the Analytics tab: voucher totals (created, redeemed, pending, expired), the redemption rate, average days to redeem, redemption counts by day of week with the peak day, and a privacy-safe list of recent redemptions.
Store whose redemption analytics to return (also authorises the merchant).
DEPRECATED alias for a rolling window; prefer preset or start_date/end_date. Days (default 1, max 90).
Max recent redemptions to return (default 20, max 100).
Preset range (defaults per endpoint). Use "custom" with start_date and end_date for an arbitrary range.
todaylast_7dlast_14dlast_30dlast_90dlast_6mlast_12mcustomCustom range start, store-local YYYY-MM-DD (inclusive). Required when preset is "custom".
Custom range end, store-local YYYY-MM-DD (inclusive). Required when preset is "custom".
curl -G "https://www.membber.com/api/v1/analytics/redemption" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/analytics/redemption", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getRedemptionAnalytics(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066")
).ok.body.json
print(response){
"period": {
"days": 1,
"start_date": "<start_date>",
"end_date": "<end_date>"
},
"metrics": {
"total_created": 1,
"total_redeemed": 1,
"pending_redemption": 1,
"expired": 1,
"redemption_rate": 1,
"avg_days_to_redeem": 1,
"peak_day": "<peak_day>"
},
"by_day_of_week": [
{
"day": "<day>",
"count": 1
}
],
"recent_redemptions": [
{
"id": "00000d1b-0000-4000-8000-d0c500000000",
"voucher_code": "EXAMPLE10",
"voucher_type": "<voucher_type>",
"customer_display": "<customer_display>",
"redeemed_at": "<redeemed_at>",
"created_at": "<created_at>",
"days_to_redeem": 1
}
],
"store": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"code": "EXAMPLE10",
"name": "Example name",
"goal": 1
}
}Merchant analytics for the Analytics tab: stamps / redemptions / customers / new customers for the period with percentage change vs the previous period, a daily breakdown for charts, averages, and the voucher redemption rate.
Store whose analytics to summarise (also authorises the merchant).
DEPRECATED alias for a rolling window; prefer preset or start_date/end_date. Days (default 1, max 90).
Preset range (defaults per endpoint). Use "custom" with start_date and end_date for an arbitrary range.
todaylast_7dlast_14dlast_30dlast_90dlast_6mlast_12mcustomCustom range start, store-local YYYY-MM-DD (inclusive). Required when preset is "custom".
Custom range end, store-local YYYY-MM-DD (inclusive). Required when preset is "custom".
curl -G "https://www.membber.com/api/v1/analytics/summary" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/analytics/summary", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getStoreAnalytics(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066")
).ok.body.json
print(response){
"period": {
"days": 1,
"start_date": "<start_date>",
"end_date": "<end_date>"
},
"summary": {
"total_stamps": {
"value": 1,
"change": 1
},
"total_redemptions": {
"value": 1,
"change": 1
},
"total_customers": {
"value": 1
},
"new_customers": {
"value": 1,
"change": 1
}
},
"averages": {
"stamps_per_day": 1,
"redemptions_per_day": 1,
"redemption_rate": 1
},
"daily_breakdown": [
{
"date": "<date>",
"stamps": 1,
"redemptions": 1
}
],
"store": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"code": "EXAMPLE10",
"name": "Example name",
"goal": 1
}
}Merchant customer leaderboard for the Analytics tab: every store customer ranked by total approved stamps, total redeemed vouchers, or most recent visit, with progress toward the store goal and a privacy-safe display name.
Store whose customers to rank (also authorises the merchant).
Max customers to return (default 10, max 50).
Ranking: by total stamps (default), total redemptions, or most recent visit.
stampsredemptionsrecentcurl -G "https://www.membber.com/api/v1/analytics/top-customers" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/analytics/top-customers", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getTopCustomers(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066")
).ok.body.json
print(response){
"customers": [
{
"id": "00000d1b-0000-4000-8000-d0c500000000",
"display_name": "<display_name>",
"phone_last4": "+44 7700 900123",
"customer_number": 1,
"total_stamps": 1,
"total_redemptions": 1,
"current_progress": 1,
"last_visit": "<last_visit>",
"customer_since": "<customer_since>"
}
],
"total_count": 1,
"sort_by": "<sort_by>",
"store": {
"id": "00000d1b-0000-4000-8000-d0c500000000",
"code": "EXAMPLE10",
"name": "Example name",
"goal": 1
}
}