Skip to main content

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:

FieldValuesEffect
targetALL, SPECIFICEvery holder, or only the customers listed in clients
typeINSTANT, SCHEDULEDRight now, or at scheduleAt (required with SCHEDULED)
categoryINFORMATIVE, COMMERCIALService information or marketing: eldo wallet checks the customer’s consent for each category at send time
clientsid, title, messageWith 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​

POST/push-notificationsTry it
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​

POST/push-notificationsTry it
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."
}
]
}'

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.

Classify honestly

"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/history records 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.uninstalled webhook 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​

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 SCHEDULED rather 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.
iOS behaviour

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​

API news, once a month

New endpoints, upcoming changes, guides and use cases. No spam, one-click unsubscribe.

Report a technical problem

An API error, a pass that does not update, an email that does not arrive? Describe the problem: our technical team will answer.

For a fast answer, include:

  • The method and endpoint (e.g. POST /clients)
  • The error code returned (errorCode) and the body sent
  • The date and time of the call
  • The identifiers involved (customer, template, pass)

Never include an API token or a password.

AI assistant

Beta

Loading…

AI-generated answers (Claude): double-check important details.

Sign in to use the assistant