WalletPassAPI

Featured actions in Apple Wallet

iOS 27 puts up to two action buttons beneath a pass, such as Call, Go to location or View membership benefits. All 14 types, which to choose, and how to add them.

· 5 min read

A gym membership in Apple Wallet with two featured actions beneath it, Book an Appointment and Go to Location, beside the same pass in Google Wallet with the actions as links.

Until iOS 27, anything a pass could link to was in its details: holders had to open the pass, tap the details, and find the link among the terms. Featured actions move the most useful ones to the front. With iOS 27 and watchOS 27, a pass can show up to two actions as cards beneath it in Wallet, such as calling the shop, getting directions or booking an appointment.

This guide covers what featured actions are, the 14 types Apple offers, how to choose between them, and how to add them with WalletPassAPI.

Apple describes each featured action as an icon, a short call to action, and what happens when it's tapped: a website opens, the Phone app calls a number, or Maps opens at a place. You choose from Apple's predefined types, and each has its own icon and wording, so the cards look the same on every pass and people know what they do.

A pass can have at most two, and Apple recommends no more than two meaningful actions: pick the ones that matter most to the person holding the pass.

Featured actions work on every pass style in iOS 27, and the new poster layout supports them too (Apple Wallet's poster layout).

The 14 action types

Apple groups the types by the kind of pass they suit:

ActionWhat it opensTypeSuits
View ScheduleThe event's scheduleviewScheduleEvents
Watch TrailerA trailer for an upcoming eventwatchTrailerEvents
Listen to MusicA playlist of the artist or artistslistenToMusicEvents
CallThe Phone app, to call supportcallAny pass
Go to LocationMaps, at one placeplaceAny pass
Add to BalanceA page to top up a balanceaddToBalanceMemberships
Order Delivery or PickupOrdering for pickup or deliveryorderMemberships
Shop Online or In-AppYour online or in-app shopshopMemberships
View Membership BenefitsBenefits, points and tiersmembershipBenefitsMemberships
Book an AppointmentBooking a time slotbookAppointmentMemberships
Book a CarCar rentalbookCarMemberships
Book a FlightBooking a flightbookFlightMemberships
Book a StayBooking a hotel or other staybookStayMemberships
View Offers and RewardsThe member's offers or rewardsviewOffersRewardsMemberships, events and any pass

The full list, with Apple's previews of each card, is in Defining the metadata of your Wallet pass.

Choosing your two

Start from what holders do next, not from what you'd like to promote.

Each link should go straight to the thing the card promises: the booking page rather than your homepage, and the member's rewards rather than a sign-in screen where you can.

Add them with WalletPassAPI

Featured actions are the pass's featuredActions: up to two, each with an id (your name for it, unique on the pass), a type from the table, and where it goes.

Here's a membership pass with two:

curl "https://api.walletpassapi.com/v1/passes" \
  -H "Authorization: Bearer $WALLET_API_KEY" \
  -H "Idempotency-Key: member-2088" \
  -H "Content-Type: application/json" \
  -d '{
    "organizationName": "Acme Fitness",
    "logoText": "Acme Fitness",
    "description": "Acme Fitness membership",
    "style": "loyalty",
    "primaryFields": [
      {
        "key": "plan",
        "label": "Membership",
        "value": "Gold"
      }
    ],
    "featuredActions": [
      {
        "id": "book",
        "type": "bookAppointment",
        "url": "https://fitness.example.com/book"
      },
      {
        "id": "gym",
        "type": "place",
        "placeIdentifier": "I7C250D2CDCB364A",
        "url": "https://maps.google.com/?q=Acme+Fitness"
      }
    ],
    "barcodeValue": "MEMBER-2088",
    "barcodeFormat": "QR"
  }'
const res = await fetch("https://api.walletpassapi.com/v1/passes", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.WALLET_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "member-2088",
  },
  body: JSON.stringify({
    "organizationName": "Acme Fitness",
    "logoText": "Acme Fitness",
    "description": "Acme Fitness membership",
    "style": "loyalty",
    "primaryFields": [
      {
        "key": "plan",
        "label": "Membership",
        "value": "Gold"
      }
    ],
    "featuredActions": [
      {
        "id": "book",
        "type": "bookAppointment",
        "url": "https://fitness.example.com/book"
      },
      {
        "id": "gym",
        "type": "place",
        "placeIdentifier": "I7C250D2CDCB364A",
        "url": "https://maps.google.com/?q=Acme+Fitness"
      }
    ],
    "barcodeValue": "MEMBER-2088",
    "barcodeFormat": "QR"
  }),
});
const data = await res.json();
import os

import requests

res = requests.post(
    "https://api.walletpassapi.com/v1/passes",
    headers={"Authorization": f"Bearer {os.environ['WALLET_API_KEY']}", "Idempotency-Key": "member-2088"},
    json={
        "organizationName": "Acme Fitness",
        "logoText": "Acme Fitness",
        "description": "Acme Fitness membership",
        "style": "loyalty",
        "primaryFields": [
            {
                "key": "plan",
                "label": "Membership",
                "value": "Gold",
            },
        ],
        "featuredActions": [
            {
                "id": "book",
                "type": "bookAppointment",
                "url": "https://fitness.example.com/book",
            },
            {
                "id": "gym",
                "type": "place",
                "placeIdentifier": "I7C250D2CDCB364A",
                "url": "https://maps.google.com/?q=Acme+Fitness",
            },
        ],
        "barcodeValue": "MEMBER-2088",
        "barcodeFormat": "QR",
    },
)
data = res.json()
<?php

$ch = curl_init("https://api.walletpassapi.com/v1/passes");
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("WALLET_API_KEY"),
        "Content-Type: application/json",
        "Idempotency-Key: member-2088",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "organizationName" => "Acme Fitness",
        "logoText" => "Acme Fitness",
        "description" => "Acme Fitness membership",
        "style" => "loyalty",
        "primaryFields" => [
            [
                "key" => "plan",
                "label" => "Membership",
                "value" => "Gold",
            ],
        ],
        "featuredActions" => [
            [
                "id" => "book",
                "type" => "bookAppointment",
                "url" => "https://fitness.example.com/book",
            ],
            [
                "id" => "gym",
                "type" => "place",
                "placeIdentifier" => "I7C250D2CDCB364A",
                "url" => "https://maps.google.com/?q=Acme+Fitness",
            ],
        ],
        "barcodeValue" => "MEMBER-2088",
        "barcodeFormat" => "QR",
    ]),
    CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);

To change a pass's actions later, send it again with Update a pass. Installed passes refresh on holders' phones, so a seasonal link, such as a new booking page, reaches everyone who has the pass. The dashboard's editor has a Featured actions section that previews each card.

Both actions in a pass must have different ids. A place action without a Place ID, or an action without a link, is refused with a validation_error naming the field, so you find out when you send the pass rather than on someone's phone.

On Google Wallet and older iPhones

Featured actions are Apple's, and need iOS 27. On older iPhones the pass works as before, without the cards.

Google Wallet has no featured action cards. WalletPassAPI shows each action as a link on the Google Wallet pass, worded from its type, so Android holders can still reach it. That's why a place action can carry a url: give it a Google Maps link and it opens the Maps app on Android. Without one, the link goes to the place on Apple Maps.

Checklist

Questions

Two at most. Apple recommends keeping to the actions that matter most to the person holding the pass.

iOS 27 or watchOS 27. On older iPhones the pass works as before, without the cards.

Google Wallet has no featured action cards. WalletPassAPI adds each action to the Google Wallet pass as a link instead.

What does a Go to Location action need?

The venue's Apple Maps Place ID, which you can look up with Apple's Place ID Lookup. With WalletPassAPI it's the action's placeIdentifier, and an optional url gives Google Wallet a link to open.

Yes. Update the pass with its new actions, and installed copies refresh on holders' phones.

Further reading