Apple Wallet and Google Wallet push notifications
A card in Apple Wallet or Google Wallet is a direct line to your customer’s lock screen. No app to install, no email lost in an inbox.
One endpoint, four settings
POST/push-notifications covers every case. Four fields drive the behaviour:
| Field | Values | Effect |
|---|---|---|
target | ALL, SPECIFIC | Every holder, or only the customers listed in clients |
type | INSTANT, SCHEDULED | Right now, or at scheduleAt (required with SCHEDULED) |
category | INFORMATIVE, COMMERCIAL | Service information or marketing: eldo wallet checks the customer’s consent for each category at send time |
clients | id, title, message | With SPECIFIC: the recipients, each with their own title and message if needed |
defaultTitle and defaultMessage apply to every recipient without a custom text.
Example: a scheduled announcement to everyone
- curl
- SDK Node.js
- nodejs
- php
- python
- java
- csharp
- go
- ruby
- CURL
curl -L 'https://api-v2.test.eldowallet.fr/push-notifications' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-lang: en' \
-H 'Authorization: Bearer <token>' \
-d '{
"defaultTitle": "Private sale",
"defaultMessage": "30% off for you this weekend.",
"target": "ALL",
"type": "SCHEDULED",
"category": "COMMERCIAL",
"scheduleAt": "2026-11-12T17:00:00.000Z"
}'
Example: one message per customer
- curl
- SDK Node.js
- nodejs
- php
- python
- java
- csharp
- go
- ruby
- CURL
curl -L 'https://api-v2.test.eldowallet.fr/push-notifications' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-lang: en' \
-H 'Authorization: Bearer <token>' \
-d '{
"defaultTitle": "Your balance",
"defaultMessage": "Your balance has been updated.",
"target": "SPECIFIC",
"type": "INSTANT",
"category": "INFORMATIVE",
"clients": [
{
"id": "$CLIENT_ID_1",
"message": "Marie, you have €31.40 left on your card."
},
{
"id": "$CLIENT_ID_2",
"message": "Loïc, two more trips until your next free one."
}
]
}'
Consent: informative or commercial
Each customer has preferences: pushInformativeEnabled and pushCommercialEnabled.
A COMMERCIAL notification does not reach a customer who opted out of marketing. Read and change preferences with GET/clients/{clientId}/communication-preferences and PUT/clients/{clientId}/communication-preferences.
"Your order is ready" is informative. "30% off this weekend" is commercial. Tagging a promotion as INFORMATIVE overrides the customer’s choice: don’t.
Why it matters
eldo wallet filters recipients at send time, based on the category you set. It doesn't read the message. A promotion sent as INFORMATIVE therefore also reaches customers who opted out of marketing.
What it costs you:
- Legal. In France and the European Union, electronic direct marketing relies on the person's consent (GDPR, CNIL rules). Messaging customers who opted out exposes you to complaints and penalties. Their opt-out is dated and kept: GET
/clients/{clientId}/communication-preferences/historyrecords it. - Losing the channel. An annoyed customer turns off the pass's notifications or removes it from their wallet. You then also lose the useful messages: order ready, delay, card renewal. The
pass.uninstalledwebhook tells you, too late. - Trust. A "service" notification hiding an ad teaches customers to ignore all your notifications, including the important ones.
- Skewed analytics. Your delivery statistics per category stop meaning anything, so you can't tell what works.
When in doubt, use COMMERCIAL: you reach fewer customers, but all of them agreed to hear from you.
Trip notifications
For transit tickets, target a trip, not every holder.
POST/transits/{transitId}/passes/trip/{tripNumber}/notify sends a message to every ticket sharing a tripNumber. See Update a trip.
Automatic notifications
Some events notify without any call from you: new card, balance update, new coupon, new event…
Rules are set per notification type and per channel (email, SMS, notification) in communicationRules (PATCH/wallet-settings). Customise the wording with notification templates (POST/notification-templates).
Track and manage
- GET
/push-notifications/{id}/stats: delivery of one notification. - GET
/push-notifications, GET/push-notifications/{id}: history. - PUT
/push-notifications/{id}, DELETE/push-notifications/{id}: edit or cancel a scheduled notification.
Best practices
- One message, one action. "Your order is ready, until Saturday 7 pm" beats a paragraph.
- Target. A push sent to everyone about something that concerns 10% of holders gets the card deleted.
- Mind the clock. Schedule with
SCHEDULEDrather than sending at 11 pm. - Space out scheduled sends. Two notifications scheduled too close together are rejected with
PUSH_NOTIFICATION_SCHEDULE_CONFLICT(409). - Use a future date. A date in the past returns
SCHEDUle_DATE_PASSED.
On iPhone, the notification shows because a pass field changes value. Two sends with exactly the same text in a row may show nothing the second time.
Go further
- Apple Wallet vs Google Wallet
- Locations: a notification without sending, when the customer walks by
- Pass not updating