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 Authorization header on every call.
  • Generic sending — a client_id / client_secret pair, with the live-notification:status scope.

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.

See also