# Issue Wallet Pass

The **Issue Wallet Pass** element generates an Apple Wallet or Google Wallet pass for a traveler from a [Wallet Pass Campaign](/product/messaging-channels/wallet-passes/wallet-pass-campaigns/) and attaches the resulting links to the traveler's data in the journey.

<Aside type="note">
This element only issues the pass. It doesn't deliver it to the user. Add a [**Send Push**](/product/customer-journey/journey-elements/channels/push/) or [**Send Email**](/product/customer-journey/journey-elements/channels/email/) element after it to actually send the install link. See [Deliver the pass to the traveler](#deliver-the-pass-to-the-traveler) below.
</Aside>

## Prerequisites

Create at least one [Wallet Pass Campaign](/product/messaging-channels/wallet-passes/wallet-pass-campaigns/) for the application before adding this element. **Issue Wallet Pass** can only issue passes from an existing campaign. It can't design one.

## Add the element

1. Drag the **Issue Wallet Pass** element onto the canvas after the step that should trigger issuance.
2. Double-click the element to open its settings, and give it a name in **Step Name**. You'll pick this name later to reference the pass from a Send Push or Send Email element, so make it recognizable, for example `Loyalty card`.
3. In **Apple Wallet campaign** and **Google Wallet campaign**, search and select a campaign for either platform, or both. Each dropdown accepts one campaign. Leave a dropdown empty to skip that platform.

<Aside type="tip">
Selecting both platforms lets the same journey step cover iPhone and Android travelers at once. Each platform issues (or reuses, see [Repeat issuance is idempotent](#repeat-issuance-is-idempotent) below) its own pass independently for the same traveler.
</Aside>

### Fill in personal fields

Under **Personal fields on the pass**, the element lists the campaign's [**Personal** fields](/product/messaging-channels/wallet-passes/wallet-pass-campaigns/#set-shared-and-personal-fields) that need a value from somewhere else, the same fields that appear as editable inputs in the campaign's own **Issue pass** dialog. A personal field defined as just a tag placeholder, like `{Seat}`, resolves automatically per traveler and isn't listed here. The campaign's **Shared** fields aren't configurable here either, because a campaign update already pushes them to every issued pass.

If you selected campaigns for both platforms, the list is the union of both campaigns' fields. A field only one platform's campaign declares is filled just for that platform's pass.

For each listed field, open its value dropdown:

* **Static value:** type one value for every traveler who reaches this element.
* Any other option is an event earlier in the traveler's path through the journey. Selecting one reveals an **Attribute** field. Choose the attribute to pull the field's value from, the same mechanism used by [Update user profile](/product/customer-journey/journey-elements/flow-controls/update-user-profile/#dynamic-tag-value).

<Aside type="caution">
If a dynamic field's source event never fired for a traveler, or the attribute has no value, Pushwoosh leaves that field out rather than sending it empty. The pass falls back to the campaign's own default for that field, and the traveler isn't dropped. This differs from a missing dynamic source in [**Time Delay**](/product/customer-journey/journey-elements/flow-controls/time-delay/#use-a-date-from-a-webhook-response), which does drop the traveler.
</Aside>

## Repeat issuance is idempotent

If the same traveler reaches this element again, for example after looping back in the journey, Pushwoosh returns the pass already issued to them instead of creating a new one. Each traveler holds at most one pass per campaign.

## When a traveler is dropped

**Issue Wallet Pass** drops the traveler, with no automatic retry, in two cases:

* The traveler has no [User ID](/product/pushwoosh-knowledge-hub/users-userids/). A wallet pass is issued to a user, not an anonymous device, so there's nobody to issue it to.
* Issuing the pass failed for a configured campaign, for example because it was deleted, archived, or now belongs to a different application. This applies even if only one of two configured platforms failed: the traveler doesn't continue with a partial result.

See [No User ID](/product/troubleshooting/drop-offs-in-customer-journey/#no-user-id) and [Pass issuance failed](/product/troubleshooting/drop-offs-in-customer-journey/#pass-issuance-failed) for what to check.

## Deliver the pass to the traveler

Issuing a pass publishes an event under this element's step name, carrying these attributes:

| Attribute | Platform | Contains |
| :--- | :--- | :--- |
| `apple_install_link` | Apple Wallet | URL to install the pass |
| `apple_serial_number` | Apple Wallet | The pass's serial number |
| `google_save_link` | Google Wallet | URL to save the pass |
| `google_serial_number` | Google Wallet | The pass's serial number |

Only the attributes for the platform(s) you configured on the element are published.

Add a [**Send Push**](/product/customer-journey/journey-elements/channels/push/) or [**Send Email**](/product/customer-journey/journey-elements/channels/email/) element after **Issue Wallet Pass**, then personalize its content with [Dynamic Content or Liquid Templates](/product/customer-journey/journey-elements/dynamic-content-and-liquid-templates-in-journeys/): choose the **Issue Wallet Pass** element by the step name you gave it, then pick the attribute, the same shape a [**Webhook**](/product/customer-journey/journey-elements/channels/webhook/#map-webhook-response-data-to-variables) step's mapped response uses. For example, insert `apple_install_link` into a push or email so the traveler receives a tappable link to add the pass to their wallet.

The serial number attributes aren't meant for message content. Use them to look up the pass later, for example when [attaching it to a campaign by serial number](/product/messaging-channels/wallet-passes/wallet-pass-campaigns/#attach-an-existing-pass-to-a-campaign).

<Aside type="caution">
**Issue Wallet Pass** doesn't have its own statistics yet. The element's panel shows only entries and drop-offs, not how many passes were issued. To confirm delivery, check the downstream Send Push or Send Email element's statistics instead.
</Aside>