Core Concepts
Before diving into the API, it's helpful to understand WalletWerk's data model and how the pieces fit together.
Data Model
WalletWerk organizes wallet cards in a hierarchical structure:
Data Hierarchy
Organization → Campaigns → Recipients → Wallet Cards → Provider Objects
- Organization: Your WalletWerk account (one organization per account)
- Campaigns: Top-level containers that define card design, shared data, and settings
- Recipients: People who receive wallet cards (always associated with a campaign)
- Wallet Cards: The actual cards that end up in users' wallets
- Provider Objects: Platform-specific instances (Apple Wallet, Google Wallet, EUDIW)
Campaigns
A Campaign is the top-level container for your wallet card program. Think of it as a "template" that defines:
- Card design — colors, images, branding
- Shared data — event details, venue, dates, terms
- Target providers — Apple Wallet, Google Wallet, or both
- Lifecycle dates — start and end dates
Campaigns are typically created once and then populated with recipients. When you update a campaign (e.g., change the venue), those changes automatically propagate to all active wallet cards.
Campaign Types
Request Parameters
| Type | Use Case |
|---|---|
event | Conferences, concerts, meetups |
membership | Gym memberships, loyalty programs |
coupon | Discount codes, promotions |
access | Building access, VIP passes |
generic | Any other card type |
Barcodes
Wallet cards can include a barcode for scanning/validation. The barcode type and value are configured per campaign.
Barcode Types
Request Parameters
| Type | Description | Use Case |
|---|---|---|
none | No barcode displayed | Cards without scanning requirements |
qr | QR Code (default) | Mobile-friendly, recommended for most use cases |
aztec | Aztec code | High-density data, common in travel/transport |
pdf417 | PDF417 | High capacity, used in boarding passes |
code128 | Code 128 | Linear barcode for legacy scanners |
Barcode Value Strategies
Request Parameters
| Strategy | Description |
|---|---|
auto (default) | Each recipient gets a unique auto-generated code |
custom | You provide the barcode value via recipientData.barcodeValue |
Setting Barcode Type:
Set the barcode type in campaignData when creating or updating a campaign:
{
"campaignData": {
"barcodeType": "qr",
"barcodeValueStrategy": "auto"
}
}
Custom Barcode Values:
When using barcodeValueStrategy: "custom", provide the barcode value in the recipient's recipientData:
{
"email": "john@example.com",
"name": "John Doe",
"recipientData": {
"barcodeValue": "TICKET-12345-ABC"
}
}
Recipients
A Recipient represents a person who will receive a wallet card. Recipients are always associated with a campaign and can have:
- Contact info — email (required), name, phone
- External ID — your internal user/customer ID for syncing
- Recipient data — individual overrides (seat number, ticket tier, etc.)
When you add a recipient to a campaign, WalletWerk automatically:
- Creates a wallet card combining campaign + recipient data
- Generates download URLs for each enabled provider
- Optionally sends an invite email
Key point: Recipients can exist across multiple campaigns. The same email address in different campaigns gets separate wallet cards.
Recipient Invitation Flow
Recipients are created with status "pending". To invite them:
- Create recipient → Status:
"pending"(no wallet card yet) - Call
/inviteendpoint → Wallet card created → Status:"invited"→ Email sent (ifsendEmail: true)
The invitation process is explicit and separate from creation. You must call the /invite endpoint to:
- Create the wallet card
- Mark recipient as "invited"
- Send email (optional, with customizable content)
Wallet Cards
A Wallet Card is the actual card that ends up in someone's Apple Wallet or Google Wallet. Each card:
- Belongs to one campaign
- Is linked to one recipient
- Has one or more provider objects (Apple, Google, EUDIW)
- Tracks its own lifecycle status
Cards are created automatically when you add recipients. You don't need to create them manually.
Wallet Card Lifecycle
Understanding the card lifecycle helps you track engagement and troubleshoot issues.
Status Flow
pending → created → invited → active ↓ revoked / removed / deleted
Status Values
Response Fields
| Status | Description |
|---|---|
pending | Recipient added, card creation in progress |
created | Card generated, ready to distribute |
invited | Download URL sent to recipient |
active | User added card to their wallet and card is live, receiving updates |
revoked | Card invalidated via API or dashboard (issuer-initiated) |
removed | User removed card from their wallet (user-initiated) |
deleted | Recipient removed from campaign (filtered out of API responses by default) |
Status Transitions
Response Fields
| Transition | Trigger |
|---|---|
pending → created | Wallet card successfully generated |
created → invited | You call the /invite endpoint |
invited → active | User clicks "Add to Wallet" |
active → revoked | You call the /revoke endpoint (issuer-initiated) |
active → removed | User removes card from their wallet (user-initiated) |
Any → deleted | Recipient is deleted from campaign |
Callbacks from Wallet Providers
Apple and Google send callbacks when users interact with cards. WalletWerk automatically updates status based on these callbacks:
Response Fields
| Event | Description | Status Update |
|---|---|---|
SAVE / INSTALL | User added the card to their wallet | walletCardStatus → active |
DELETE / UNINSTALL | User removed the card from their wallet | walletCardStatus → removed |
You can poll the /status endpoint to check the current status, or subscribe to webhooks for real-time updates.
Real-time Updates
One of WalletWerk's key features is live updates. When you modify a campaign or recipient, changes propagate to all active cards.
What Gets Updated
Response Fields
| Update Type | Propagates To |
|---|---|
| Campaign name change | All cards in campaign |
| Venue/location change | All cards in campaign |
| Date/time change | All cards in campaign |
| Recipient name change | That recipient's card |
| Recipient data change | That recipient's card |
How It Works
- You call
PATCH /campaigns/{id}orPATCH /recipients/{id} - WalletWerk finds all active cards affected
- Card data is updated in our system
- For Apple: Cards update on next wallet sync (usually minutes)
- For Google: Cards update immediately
Push Notifications
You can send push notifications to users with active cards:
/campaigns/{campaignId}/notificationscampaigns:writeSend a push notification to all recipients with active wallet cards in a campaign.
Notifications appear on the user's lock screen, linked to their wallet card.