points.expiration-approaching
Sent when a loyalty member's points expiration reminder becomes due, with the member's profile and the points about to expire.
When it fires
- For each reminder stage turned on in your loyalty settings,
FRIENDLYorLAST, when its day before the expiration date comes. - Cevoid checks the reminder again when it sends the delivery: if the member is no longer an active member, the reminder stage is turned off, the points already expired or the expiring amount or date changed, nothing is sent.
points,balanceanddays_remainingindata.points_expirationare read when the delivery is sent.
Receive it
Pick points.expiration-approaching in a webhook destination's events, or tick All events. See Create a destination.
To filter it or wait before sending, send it from a Flow on the Points expiration approaching trigger instead. See Send from a Flow.
Payload
{
"created_at": "2026-11-02T09:30:00.000Z",
"data": {
"points": {
"expiring_30d": 400,
"expiring_60d": 650,
"expiring_90d": 750,
"lifetime_earned": 5400,
"lifetime_spent": 4150,
"next_expiration_at": "2026-12-31T00:00:00.000Z",
"pending": 100,
"spendable": 1150,
"total": 1250
},
"points_expiration": {
"balance": 1150,
"date": "2026-12-31T00:00:00.000Z",
"days_remaining": 30,
"points": 400,
"stage": "FRIENDLY",
"window_ends_at": "2027-01-01T00:00:00.000Z"
},
"profile": {
"avatar_url": "https://cdn.cevoid.com/avatars/prf_sarah/profile.jpg",
"bio": "Lifestyle creator and photography enthusiast",
"birthday": "1992-04-18",
"country": "US",
"created_at": "2026-01-15T09:30:00.000Z",
"email": "sarah.johnson@example.com",
"external_id": "customer_7391056823401",
"first_name": "Sarah",
"id": "prf_sarah",
"language": "en",
"last_name": "Johnson",
"location": "San Francisco, CA",
"name": "Sarah Johnson",
"notes": "VIP customer; prefers email communication",
"social_instagram_handle": "sarah.lifestyle",
"social_tiktok_handle": "sarah.creates",
"social_x_handle": "sarah_j",
"updated_at": "2026-01-20T14:22:15.000Z"
},
"tier": {
"current_tier": {
"expires_at": "2026-12-31T23:59:59.999Z",
"icon_url": "https://cdn.cevoid.com/tiers/silver.png",
"id": "tier_silver",
"name": "Silver"
},
"next_tier": {
"entry_rewards": [
{
"icon_url": "https://cdn.cevoid.com/rewards/reward-icon.png",
"title": "10% Off Reward",
"type": "DISCOUNT_CODE"
}
],
"icon_url": "https://cdn.cevoid.com/tiers/gold.png",
"id": "tier_gold",
"milestones": [
{
"current": 750,
"percent_complete": 75,
"remaining": 250,
"required": 1000,
"type": "POINTS"
}
],
"name": "Gold",
"perks": [
{
"value": "Exclusive early access to launches"
}
]
}
}
},
"id": "evt_m3p82kdq5xw7tz4c",
"type": "points.expiration-approaching",
"version": 1
}Show all 81 linesShow fewer lines
versionnumberrequiredThe version of this event type. A published version only gains fields, so ignore fields you do not use; a breaking change is a new version.
idstringrequiredStable event id (evt_ plus 16 characters), also sent as the webhook-id header. Retries and manual replays send the same id, so ignore an event whose id you have already processed.
typestringrequiredWhat data describes. New types are added over time, and an endpoint on "All events" receives them, so ignore any type you do not handle.
created_atstring<date-time>requiredWhen the event happened, as an ISO 8601 timestamp.
originobjectWhy your endpoint received the event. Omitted when the event was forwarded without a Flow of your own.
dataobjectrequiredThe resources the event carries, keyed by resource name. type decides which resources are included, and resources your plan does not include are left out.