Importance and expiry¶
Phones now decide for themselves what deserves attention. iOS has interruption levels and AI summaries, and Android's Notification Organizer silences promotions by default. A message that says how important it is, and when it stops mattering, is handled better by the device. It also gives Cue's policy something real to decide on.
Importance¶
| Level | Use it for | iOS | Android | Telegram | |
|---|---|---|---|---|---|
low |
Informational: a weekly summary, a new follower | passive (no sound) | normal priority | silent | Importance: low |
normal |
Most messages (default) | active | channel default | normal | none |
high |
Time-sensitive: "your order is at the door" | time-sensitive | high priority | normal | Importance: high |
critical |
Security and safety: a login from a new device | time-sensitive | high priority | normal | Importance: high |
Policy treats critical differently from the rest: it breaks through quiet hours and
frequency caps. To stop that being abused, it is only honoured in categories people
cannot unsubscribe from (allow_unsubscribe: false). Anywhere else it is stored and
delivered as high. Unsubscribes, muted channels, cooldowns and deduplication always
apply.
Set importance on a rule, or on a direct send:
POST /v1/rules
{"key": "new-login", "event": "auth.login_new_device", "template": "new-login",
"category": "security", "channels": ["push", "email"], "importance": "critical"}
POST /v1/messages
{"recipient": "user-42", "template": "courier-arriving", "channels": ["push"],
"importance": "high", "expires_at": "2026-10-10T18:30:00Z"}
Templates can read it as {{ importance }}, and connectors receive it as
delivery.importance. The webhook payload includes it too.
Expiry¶
A one-time code is useless after five minutes, and "your driver is here" is wrong an hour later. Give such messages an expiry:
- direct sends:
expires_at; - rules:
expires_after_seconds, counted from when the event is processed.
Cue drops the message (suppressed, reason expired) if quiet hours would delay it past
its expiry, and checks again right before sending, so a slow worker or a provider outage
never delivers stale news. Push connectors pass the expiry on to the push service as well
(FCM ttl, APNs apns-expiration), so a phone that was offline does not show it later.
Actions¶
Templates can add up to four buttons. Their label and url are templates:
"en": {
"title": "Your order shipped",
"body": "Order {{ data.order_id }} is on its way.",
"actions": [
{"id": "track", "label": "Track", "url": "https://shop.example/track/{{ data.order_id }}"},
{"id": "dismiss", "label": "Not now"}
]
}
| Connector | What it does with actions |
|---|---|
fcm |
data.actions (JSON) for your app to render as notification actions |
telegram |
Inline keyboard buttons for actions with a url |
smtp |
"Label: URL" lines in the text part |
webhook |
content.actions, as is |