The Live Notification is the order-tracking notification that stays alive on the user's screen: a progress bar that advances as the order changes status, without creating a new notification for every update.
On Android it shows up in the drawer, on the lock screen and in the status bar chip (Android 16+). On iOS it shows up on the lock screen and in the Dynamic Island (iOS 16.2+).
How it works¶
The notification can only be started by the app — usually when the order is confirmed, after the user grants push permission. From then on it stays active on the device and is updated remotely on every delivery status change — either by the Abbiamo webhook or by a call from your own system to the Eitri API.
app (order confirmed) ──► starts the Live Notification on the device
▲
Abbiamo ──webhook──┐ │
├──► Eitri ──push─────┘ (updates status, text and progress)
your system ──API──┘
This means that:
- if the app has not started the notification for that order, no update will create one;
- the user must have granted push permission;
- if the user dismisses the notification, later updates do not recreate it.
1. Two ways to update¶
| Way | When to use it |
|---|---|
| Abbiamo webhook | The delivery operation runs on Abbiamo: it notifies Eitri on every status change, with no code on your side. |
| Eitri API (generic sending) | You have your own system (or another logistics provider) and already know the order status on your side. Your backend calls Eitri on every change. |
Both end in the same place: the notification already active on the device is updated. Use one or the other — there is no need to combine them.
2. Requesting access¶
Access is not self-service — it is generated by the Eitri platform team for your store.
Open a request with your Eitri contact (or through the support channel) providing:
| Information | Description |
|---|---|
| Integration type | Abbiamo webhook or generic sending through the API |
| Store / environment | The store environment that will receive Live Notifications (production, staging) |
| Technical owner | E-mail of whoever will receive and store the credentials |
| Abbiamo account | Webhook only: identification of the account/operation firing the events |
| Statuses to notify | Which delivery statuses should generate an update (e.g. picking, on the way, delivered) |
Depending on the option, the Eitri team gives you back:
- Abbiamo webhook — the endpoint URL to register as a webhook and an authentication
token, sent by Abbiamo in the
Authorizationheader on every call. - Generic sending — a
client_id/client_secretpair, with thelive-notification:statusscope.
The secret is delivered only once
It cannot be recovered later. Store it in a secrets vault (Vault, AWS Secrets Manager, etc.). If it is lost or leaked, ask the Eitri team for a rotation — a new credential is generated and the previous one stops working immediately.
Request one access per environment: the credential identifies the store, and events from one store cannot be sent with another store's credential.
Base URL (production): https://api.eitri.tech/push-notification-eitri-shop-api
Registering the webhook in Abbiamo¶
In the Abbiamo panel, register the delivery update webhook with the URL provided and the token in the
Authorization header. From then on, every delivery status change becomes an update of the
notification already active on the customer's device.
Sending the status through the API (generic sending)¶
First exchange the credentials for an access token:
curl --request POST \
--url https://api.eitri.tech/push-notification-eitri-shop-api/v1/oauth/token \
--header 'Content-Type: application/json' \
--data '{
"grant_type": "client_credentials",
"client_id": "pk_live_2f1c...",
"client_secret": "s3cr3t..."
}'
Reuse the token until it expires (use the expires_in from the response) instead of requesting a new
one for every send. It already identifies the store — there is no store field in the calls that
follow.
Then, on every order status change:
curl --request POST \
--url https://api.eitri.tech/push-notification-eitri-shop-api/v1/live-notifications/order-status \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <access_token>' \
--data '{
"orderId": "266694368",
"orderStatus": "DELIVERING",
"estimatedTime": "15:35"
}'
| Field | Required | Description |
|---|---|---|
orderId |
Yes | Order identifier, the same one the app used to start the notification |
orderStatus |
Yes | Status configured for your store (e.g. DELIVERING) |
estimatedTime |
No | Expected delivery time shown in the notification (e.g. 15:35) |
estimatedTime is the only content accepted in the body — text, icon and progress come from the
store configuration. If the configured status has no friendly name defined, orderStatus itself is
what shows on screen.
Response — 202 Accepted
{ "accepted": true, "requestId": "9c2a5f4e-..." }
Processing is asynchronous: the 202 means the request was accepted, not that the notification has
already been updated. Keep the requestId — that is what you give Eitri support to trace a send.
An empty orderId or orderStatus returns 400; a missing or expired token, or one without the
live-notification:status scope, returns 401/403.
Who receives it: only the devices that started the Live Notification for that order. Other devices of the same customer do not receive it, and an order with no active notification simply generates no send.
3. What you configure¶
What changes from store to store are the texts and the progress of each status — everything else (layout, field placement, bar behavior) is defined by the operating system and by the app.
For each configurable status you define:
| Item | What it is | Recommendation |
|---|---|---|
| Status name | Short label for the stage (e.g. Picking, On the way) |
1 or 2 words |
| Message | Sentence with the detail of that stage | one short sentence, never empty |
| Progress | How much of the bar is filled, from 0 to 1 | always move forward, never back |
| Icon | Icon displayed on iOS | one per stage, or the same for all |
The store name shown in the notification is configurable as well.
A status with no configured message generates no update — that is how you choose which stages the customer sees. Ask the Eitri team to add, change or remove a status.
The estimated time comes from the Abbiamo event itself (expected delivery date, in the by HH:mm
format) and is not configurable. The order number shown comes from the app.
4. How the data is displayed — Android¶
The system renders one notification across three different surfaces.
Expanded (drawer / lock screen)¶
┌─────────────────────────────────────────────────────────┐
│ [icon] store name · now ▾ │
│ │
│ Order #4821 │
│ John is 2 km away • by 15:35 │
│ │
│ ━━━━━━━━━━━━━━━━◉─────────────────────[📍] │
│ ↑ progress │
└─────────────────────────────────────────────────────────┘
Collapsed (single line)¶
┌─────────────────────────────────────────────────────────┐
│ [icon] Order #4821 John is 2 km away • by 15:35 ▾ │
│ ━━━━━━━━━━━━◉──────────────[📍] │
└─────────────────────────────────────────────────────────┘
The store name tends to be cut off in this state.
Status bar chip (the "Live Update")¶
┌──────────────────────────────┐
│ [◔] On the way 14:32│
└──────────────────────────────┘
| Content | Where it shows | Usable length |
|---|---|---|
| Order number | title (1st line, bold) | ~30 characters |
| Message | body, first part | ~40 characters before truncating |
| Estimated time | body, right after " • " |
short |
| Store name | header subtext | ~15 characters |
| Status name | status bar chip | ~10 characters — the tightest one |
| Progress | tracker position on the bar | — |
Two Android characteristics
The configured icon is not used. Every status uses the app's default notification icon.
The bar has no stage milestones. It is continuous: only the tracker moves, and the animation is the system interpolating between two updates.
5. How the data is displayed — iOS¶
Each surface is a different drawing of the same content.
Lock screen / banner¶
┌──────────────────────────────────────────────────────────┐
│ [🚚] Order #4821 by 15:35 │
│ Central Bakery │
│ ───────────────────────────────────────────────────── │
│ On the way John is 2 km away │
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │
└──────────────────────────────────────────────────────────┘
The only layout where all contents appear together.
Expanded Dynamic Island¶
╭───────────────────────────────────────╮
│ [🚚] Order #4821 by 15:35 │
│ │
│ John is 2 km away │
│ ▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░░ │
╰───────────────────────────────────────╯
Compact Dynamic Island¶
╭─────────────────────╮
│ [🚚] by 15:35 │
╰─────────────────────╯
Minimal Dynamic Island¶
╭────╮
│[🚚]│ ← icon only
╰────╯
| Content | Lock screen | Expanded DI | Compact DI | Minimal DI |
|---|---|---|---|---|
| Icon | ✅ left | ✅ leading | ✅ leading | ✅ only content |
| Order number | ✅ title | ✅ center | ❌ | ❌ |
| Store name | ✅ under the title | ❌ | ❌ | ❌ |
| Status name | ✅ left, bold | ❌ | ❌ | ❌ |
| Message | ✅ right, gray | ✅ bottom | ❌ | ❌ |
| Estimated time | ✅ top-right | ✅ trailing | ✅ trailing | ❌ |
| Progress | ✅ bar | ✅ bar | ❌ | ❌ |
In the compact Dynamic Island the estimated time shares space with the clock and truncates beyond ~6
characters: by 15:35 fits, 15 minutes does not.
6. When the notification does not show up¶
Delivery is asynchronous and, in some situations, the event is received without generating an update:
- the app did not start the Live Notification for that order (unsupported device, push permission denied, or the order does not match the app's rules);
- there is no message configured for that status;
- the user dismissed the notification for that order.
If you have doubts about a specific delivery, give Eitri support the order and the timestamp of the
event — or the requestId, when the send was made through the API.