# Live Activity

The **Live Activity** element sends the push that starts, updates, or ends an iOS Live Activity — the lock-screen and Dynamic Island card for a flight, delivery, ride, or similar live status. One element sends one action: add a **Live Activity** element set to **Start** to create the card, then later **Live Activity** elements set to **Update** or **End** to change or close the same card.

<Aside type="note">
This element needs a published widget schema first. Publish one from [Applications → Configure → Live Activity schemas](/developer/api-reference/live-activity-schemas-api/#managing-schemas-in-the-control-panel), or read [Writing a schema](/developer/api-reference/live-activity-schemas-api/#writing-a-schema) if you're not sure what to put in it.
</Aside>

## Example use cases

### Flight status

Start the card at check-in, update it as the flight progresses, end it after landing.

* **Start trigger:** `CheckInCompleted`
* **Update trigger:** `FlightStatusChanged`
* **End trigger:** `FlightLanded`
* **Card key:** event `CheckInCompleted`, attribute `flight_number`
* **Content:** `gate`, `status`, `estimatedTime` from the widget's schema

### Food delivery tracking

Start the card when an order is placed, update it as the courier moves, end it on delivery.

* **Start trigger:** `OrderPlaced`
* **Update trigger:** `CourierStatusChanged`
* **End trigger:** `OrderDelivered`
* **Card key:** event `OrderPlaced`, attribute `order_id`
* **Content:** `courierName`, `eta`, `distanceMeters`

### Ride-hailing

Start the card when a ride is requested, update it while the driver approaches, end it when the ride completes.

* **Start trigger:** `RideRequested`
* **Update trigger:** `DriverStatusChanged`
* **End trigger:** `RideCompleted`
* **Card key:** event `RideRequested`, attribute `ride_id`
* **Content:** `driverName`, `etaMinutes`, `plateNumber`

## Prerequisites

Before you add this element:

* **iOS Live Activity support** in your app. See the [iOS SDK Live Activities guide](/developer/pushwoosh-sdk/ios-sdk/ios-live-activities/).
* **A published widget schema.** [Publish one](/developer/api-reference/live-activity-schemas-api/#create) for the `ActivityAttributes` type your app declares — see [Writing a schema](/developer/api-reference/live-activity-schemas-api/#writing-a-schema).

## Add the element

1. Drag the **Live Activity** element onto the canvas — it's in the palette's **Channels** group.
2. Double-click the element to open its settings.
3. Enter a name in **Step name**.
4. In **Action**, choose **Start**, **Update**, or **End**.
5. In **Widget** and **Schema version**, select the `ActivityAttributes` type and the schema version to render the form from. Both selectors are available for every action.

### Set the card key (Start only)

A **Start** element can set **Card key: event** and **Card key: attribute** — the event and attribute whose value tells one traveler's card apart from another's, for example a flight number or an order ID.

<Aside type="tip">
Leave the card key empty to give each traveler one card at a time, addressed by their traveler ID alone.
</Aside>

An **Update** or **End** element doesn't set its own key. Instead, pick the **Start** element it targets under **Card created by** — the key shows read-only as **Card key (from the start element)**, inherited from that Start element so the update lands on the same card.

### Fill in the card content

Set **Card language** to `default` or a specific language code — content set under `default` is the fallback for any language you don't fill in separately.

**Start** and **Update** elements show one field per property in the selected schema version, under the widget's content-state fields — type a literal value or a personalization placeholder into each.

<Aside type="note">
An **End** element skips content-state fields entirely — there's no card content left to update once it's closing.
</Aside>

Under **Alert title** and **Alert text**, set the banner shown on the lock screen — available for all three actions.

<Aside type="caution">
With neither **Alert title** nor **Alert text**, this action's push carries no banner and no sound. The card still starts, updates, or ends, but silently. Fill in at least one of the two for any action that should surface on a locked screen.
</Aside>

Set **Sound** to a sound file already uploaded to the app — it only plays together with **Alert title** or **Alert text**, same as the banner.

### Set delivery priority and timing

In **Delivery priority**, choose **Immediate** to wake the device and play the sound right away, or **Quiet** to let iOS batch the delivery. Leave it on **Default (batched)** to match iOS's own default.

The last field in that row depends on the action:

* **Start** and **Update** show **Stale after, min** — once this many minutes pass, iOS dims the shown numbers as out of date, but the card stays on screen. Send another update before it runs out.
* **End** shows **Dismiss after, min** instead — how long the closed card stays on the lock screen before iOS removes it.

### Personalize the content

Like other channel elements, **Live Activity** has an **Overwrite personalization** block: turning it on and checking a placeholder's **Overwrite placeholder** box maps that placeholder, in **Alert title**, **Alert text**, or any content-state field, to an event's attribute instead of a device tag.

Click **Apply** to save the element settings.

## Limitations

* **No delivery or open metrics.** iOS applies a Live Activity update by talking to APNs directly — it doesn't launch your app or run its SDK code, so Pushwoosh only knows the push left its servers, not whether the device received or rendered it. The element's panel shows **Total entries** and a drop-off breakdown (**No Live Activity token**, **Live Activity send failed**), and nothing past that.
* **Sound isn't guaranteed on every update.** iOS rate-limits Live Activity alerts on its own — an identical update can play a sound one time and arrive silently the next.
* **A push-to-start Start action can be silently throttled.** After roughly ten **Start** actions for the same traveler in quick succession, Apple stops delivering the underlying push-to-start notification without an error, while the journey still shows the traveler as delivered. Space out repeated test runs.