You can send a wallet push straight from a CRM automation - when a customer's balance changes, they book a table, or hits any condition your flow can detect. It's the same push as a manual notification, just fired by your CRM instead of by you clicking send.
If the trigger is simply "this field on the customer just changed value" - a store credit balance, a tier - the easier route is an automated notification rule set on the template. PocketPass watches for the change itself, so there's no automation to build in your CRM. Come back here when the trigger genuinely lives in your CRM's own logic (a specific email opened, a specific list joined).
The notification webhook key
Every CRM webhook uses the same auto-generated notification webhook key for your account — a pkw_live_… value shown inline on each integration's settings page (Settings → Integrations → your CRM). You never need to mint one yourself. Rotating it from any of the four pages replaces the value everywhere at once, so every wired webhook stops working until you re-paste the new key.
The key is scoped to "trigger a push notification" only — a leaked value can send messages to your customers' passes but can't read or modify anything else. For full programmatic access (managing passes, templates, webhooks) you still create a regular API key under Settings → API keys.
The request
Most providers do the same thing: a webhook step that POSTs to PocketPass. Klaviyo, Mailchimp, HubSpot and Omnisend can add an Authorization header, so the key travels there. Me&u Connect's webhook step only accepts body fields, so the key travels as an apiKey field in the JSON body. ActiveCampaign's Webhook action gives you a URL and nothing else, so everything travels in the query string.
Constant Contact and Campaign Monitor are the exceptions: neither has a webhook step at all. Constant Contact's Automation Path Builder and Campaign Monitor's journeys can send email and SMS, wait, branch, update a custom field, and move people between lists - but neither can call an external URL. Trigger pushes for those accounts from Zapier or the PocketPass API instead; the pass id is on each contact as the pocketpass_id custom field on Constant Contact, and PocketPass ID on Campaign Monitor.
Klaviyo / Mailchimp / HubSpot / Omnisend — header auth:
POST https://<your-domain>/api/v1/passes/notify
Authorization: Bearer pkw_live_YOUR_KEY
Content-Type: application/json
{
"id": "<pass-id merge tag>",
"message": "Your balance was updated"
}
Me&u Connect — body auth:
POST https://<your-domain>/api/v1/passes/notify
Content-Type: application/json
{
"id": "<pass-id merge tag>",
"message": "Your balance was updated",
"apiKey": "pkw_live_YOUR_KEY"
}
ActiveCampaign — query auth. Its Webhook action has one field, the URL, and the body it sends is ActiveCampaign's own contact data rather than anything you compose. So the whole request is a URL:
POST https://<your-domain>/api/v1/passes/notify?apiKey=pkw_live_YOUR_KEY&id=%POCKETPASS_ID%&message=Your%20points%20were%20updated
Treat that URL as a secret — your notification key is in it. The ActiveCampaign page in PocketPass composes the whole thing for you, message and merge tags included.
The id is the customer's PocketPass pass ID, supplied as a merge tag so it resolves per contact when the flow runs. The message is the text that appears on their locked device.
The pass-ID merge tag per provider
The only thing that changes between providers is the merge tag you put in id.
Klaviyo - {{ person.PocketPassID }}, sent from a Webhook action in a Flow.
Mailchimp - *|PPID|*, sent from a webhook step in an automation.
Me&u Connect - {contact.pocketpassId} (single-brace, sproutsend syntax — not double).
Constant Contact - [[custom.pocketpass_id]]. There is no webhook step in Constant Contact, so use this from Zapier or the API rather than from a Constant Contact automation.
Campaign Monitor - [PocketPassID,fallback=]. Same story: no webhook step in Campaign Monitor journeys, so use this from Zapier or the API.
ActiveCampaign - %POCKETPASS_ID%, put in the URL of a Webhook action in an automation. ActiveCampaign resolves personalization tags inside the URL, which is what makes the query-string form above work.
Omnisend - {{ contact.customProperties.pocketpass_id }}, sent from a Send HTTP request step in an automation. Omnisend's HTTP step accepts custom headers and a JSON body, so this rides in the same header-auth request as Klaviyo, Mailchimp and HubSpot.
HubSpot - {{ contact.pocketpass_id }}. Two ways to send it from a workflow: use the PocketPass-installed Send PocketPass push custom action (any Hub on Professional or above), or use the built-in Send a webhook action (Operations Hub Professional only). See Connect HubSpot for the details.
The exact endpoint URL, key, and body are copy-pasteable in the dashboard. Go to Notifications → New notification → (your CRM) — or Settings → Integrations → (your CRM) — and it shows the request pre-filled for your domain, your key, and your CRM's merge tag.
It only fires for installed passes
A push has to land on a device that holds the pass, so this only works for customers who have installed theirs - they're the ones who have a PocketPass ID to send. Contacts who never added their pass have no ID, so the merge tag is empty and nothing sends. That's expected, not an error.
If you want those customers to receive pushes, get them to install first - see Turn customers into passes for adding install buttons to your emails.
Guard the trigger so it only runs for contacts who hold a pass. A flow that POSTs for every contact will make a lot of empty-ID calls that do nothing. Where your CRM allows it, gate the webhook step on the "installed" flag PocketPass writes back.
Same push, different trigger
What arrives on the device is identical to a manual notification sent from /dashboard/notifications - a live wallet update with your message. The difference is only what fires it: your CRM's logic instead of a person. Everything else - delivery, how it shows on the lock screen, who can receive it - is the same.
Because it's the same push, the audience rules still apply per pass: one call updates one customer's pass. To message a whole group at once, use a notification with an audience instead.
Where to go next
- Sending a notification - the manual version of the same push.
- Choosing an audience - targeting a group rather than one pass.
- API authentication - creating and securing the key.