Admin Guide

Messages

A message is a push notification sent to a group of users. The Messages section is where you create campaigns: one-time and scheduled broadcasts with flexible audience and content settings.

Message statuses

Each message goes through several statuses. Understanding statuses helps you track what stage a broadcast is at.

draft
scheduled
sending
sent
cancelled
draft
Draft

Message is saved but not sent. Saved as a historical artifact in some scenarios.

scheduled
Scheduled

Message is waiting for the specified time. Automatically transitions to sending when the worker polls the queue (every 15 seconds).

sending
Sending

Worker is actively dispatching notifications. Audience is split into batches of 500 subscribers.

sent
Sent

All batches have been processed. Delivery is complete — analytics are available.

cancelled
Cancelled

Message was manually cancelled before or during sending.

Creating a message

Click "Create message" in the toolbar. The form consists of three blocks.

Block 1: Audience

Determines who will receive the notification.

Send to all

All active subscribers of the app will receive the notification (all browsers with permission). Use for important general announcements.

By segments

Select one or more Include segments (who receives) and, if necessary, Exclude segments (who to exclude). Audience = union of Include minus intersection with Exclude.

💡
The same segment cannot be added to both Include and Exclude at the same time — the system will show a validation error.

Block 2: Notification content

Choose the content source: manually or from a template.

FieldRequiredDescription
TitleYesNotification title. Recommended up to 60 characters — long titles are truncated by the browser.
BodyYesNotification body. Up to 120–200 characters depending on the platform.
URLNoThe page that opens when the notification is clicked. If not specified — the app homepage opens.
ImageNoURL of the image displayed in the notification (large photo). Supported in Chrome and Edge on desktop. Recommended size: 1080×565.
TagNoSlug string for grouping notifications in the browser. A notification with the same tag replaces the previous one.
ℹ️
In the Tag field, use a slug string (e.g. orders or promo). If the browser receives two notifications with the same tag, the second replaces the first — this prevents notification "spam" for the same event.

From template

Switch the source to "From template" and select the desired template from the list. The Title, Body, URL, Image, and Tag fields will be filled automatically from the template and will not be editable. To change content — create a new template or edit the existing one.

Template variables

Any text field in a message supports dynamic variables that are substituted by the worker at send time. This allows URLs, titles, and notification tags to be unique for each campaign.

VariableWhat is substitutedWhere to use
{{ title }}Message titleURL, image, tag
{{ sendDate }}Send date in YYYY-MM-DD formatURL, tag
{{ messageId }}Unique message IDURL, tag
{{ tag.KEY }}Value of user tag KEY — unique for each recipientURL, tag
text
// URL — UTM tags with campaign name and date:
https://example.com/promo?utm_campaign={{ title }}&utm_content={{ messageId }}&date={{ sendDate }}

// Tag — unique for each broadcast (notifications don't replace each other):
{{ messageId }}

// Tag — fixed (repeat broadcast replaces previous unread):
promo
💡
Variables are especially useful in the Notification Tag field: passing {{ messageId }} as a tag gives each broadcast a unique tag — notifications from different campaigns will not replace each other in the user's browser. Conversely, a fixed tag (e.g. promo) means a repeat broadcast will replace the previous unread notification.

Personal variables from user tags

In addition to campaign variables, URLs and other fields can use individual user tags — values stored in each specific subscriber's profile. Syntax:

{{ tag.KEY }}— substitutes the value of tag KEY for each recipient individually

At send time, the worker replaces the variable with the tag value for that specific user. Each recipient sees their own personalized link.

Example: abandoned product view

1
On the site: setting a tag for the user

When a user views a product, your site records a tag. You can see it in Users → user profile → Tags block:

js
// Tag is set automatically by your site
// when the user views a product page.
//
// In Users → user profile → Tags you will see:
//
//   Key                          Value
//   dropped_view_product_url     /products/iphone-15-pro
//   last_category                electronics
2
In the message template: using the tag in URL

In the "Click URL" field of the template, specify the variable:

text
// "Click URL" field in the message template:
https://example.com{{ tag.dropped_view_product_url }}
3
At send time: each recipient gets their own link

The worker substitutes the tag value for each user:

text
// User user-42 (tag = "/products/iphone-15-pro"):
→  https://example.com/products/iphone-15-pro

// User user-99 (tag = "/products/samsung-s24"):
→  https://example.com/products/samsung-s24

// User user-01 (tag not set):
→  https://example.com  ← empty string instead of variable
⚠️
If a user does not have the tag set — the variable is replaced with an empty string. A URL like https://example.com (without a path) will work as a link to the homepage. It's better to segment the audience in advance: send the campaign only to users who have the dropped_view_product_url tag. To do this, add the rule "Tag 'dropped_view_product_url' exists" in the segment.

Where user tags are configured

Tags are stored in each user's profile and managed from the Users section:

1
Go to Users and find the desired user by External ID.
2
Open the user profile — the "Tags" block shows all set tags with their keys and values.
3
Available actions:
  • Add tag — "+" button in the block header → enter key and value.
  • Edit — "⋮" button next to the tag → "Edit" → change key or value → Save.
  • Delete — "⋮" button → "Delete".
ℹ️
Tags are set automatically by your site at the moment of an event (product view, add to cart, etc.). Manual management in the admin is useful for debugging, adjusting values, or adding test tags before launching a campaign.

Block 3: Send mode

Send now

The message is immediately queued and begins delivering to active subscribers. Status instantly becomes sending.

Schedule

Specify a future date and time. The message gets scheduled status and will be sent automatically at the specified moment. A scheduled message can be cancelled before it transitions to sending.

Preview

The creation form shows a live preview of the notification — how it will look on the user's device (with title, body, and URL). Check it before sending.

Message analytics

On the detail page of each sent message, the delivery funnel is available:

Sent

Number of subscribers for whom delivery was attempted.

Delivered

Notification was successfully received by the browser (push server returned 200/201).

Clicked

User clicked on the notification.

Failed

Delivery failed (expired endpoint, network error).

CTR

Clicked ÷ Delivered × 100%. Audience engagement metric.

ℹ️
CTR (Click Through Rate) = Clicked ÷ Delivered × 100%. A good benchmark for web push is 5–15% depending on the topic.

Cancelling a scheduled message

Open the detail page of a message in scheduled status and click "Cancel". Once it transitions to sending status, cancellation is not possible — delivery has already begun.

Related sections

← Segments

Create segments in advance to use them in the "By segments" field.

← Templates

Create message templates for reusable campaign content.

← Settings → UTM

If UTM parameters are enabled, they are automatically added to the URL of all notifications sent from this app.