Flow Queue

What is the Flow Queue?

The Flow Queue controls the order in which unclaimed conversations are served to agents. When an agent asks for the next ticket (or previews the queue), the Flow Queue decides which conversation comes first.

Every team has one Flow Queue setting. It picks one of three algorithms, and, for the advanced option, lets you tune exactly how much different signals matter.

If a team has never configured the queue, it defaults to FIFO.

The three algorithms


AlgorithmIn shortConfigurable?
FIFO | Oldest first. Simple and predictable. | No
Zuzana Magic | Balanced blend of time, urgency, and sentiment. | No (pre-tuned)
Custom | Full control over weights, plus tag, channel, subject, and sender boosts. | Yes

1. FIFO (First In, First Out) 📥

Oldest first. Simple and predictable.

Conversations are served in strict chronological order, oldest waiting first. Ordering is by the time of the last message, falling back to when the ticket was created for conversations that have no message yet (COALESCE(last_message_at, ticket_created_at) ASC).

No urgency, sentiment, or boosts are applied. Every conversation scores the same (0); the only thing that matters is how long it has been waiting.

Best for: teams that want a fair, fully predictable queue with no AI-driven reordering.

2. Zuzana Magic ✨

Balanced algorithm using time, urgency, and sentiment.

Zuzana Magic ranks conversations by a composite score built from a fixed, pre-tuned mix of signals. You cannot change these weights, that is the point: it is a sensible default that works well without any configuration.

The built-in mix is:


SignalWeightWhat it measures
Time decay | 40 | How long the conversation has been waiting (reaches full score at 48 hours) 
Urgency | 35 | AI-detected urgency of the conversation (0 to 100) 
Sentiment | 25 | Negative customer sentiment (0 to 100) 
Language match | 0 | Disabled in Magic mode

Conversations are ranked highest score first, so an urgent, upset customer who has been waiting a while rises to the top even if an older, calmer ticket exists.

Best for: most teams that want intelligent prioritization out of the box, with zero setup.

3. Custom 🎛️

Full control over weights, tag boosts, and rules.

Custom mode uses the same scoring engine as Zuzana Magic, but you control every input. Set each weight from 0 to 100, and layer on four kinds of "boosts" to push specific conversations up the queue.

Tunable weights:


SettingRangeMeaning
time_decay_weight | 0 to 100 | How strongly older conversations are prioritized
time_decay_max_hours | 1 to 720 | Hours of waiting at which time decay hits its maximum (default 48)
urgency_weight | 0 to 100 | How much AI-detected urgency matters
sentiment_weight | 0 to 100 | How much negative sentiment matters
language_match_weight | 0 to 100 | Bonus when the conversation language matches the agent's language

Four boost maps (each entry is a key with a boost value from 0 to 100):

  • Tag boosts (tag_boosts): boost conversations carrying a given tag. Keyed by tag ID. If a conversation has several boosted tags, the highest boost wins.
  • Channel boosts (channel_boosts): boost by channel. Allowed channels: email, chat, social, review.
  • Subject boosts (subject_boosts): boost when the conversation title contains a substring (case-insensitive), for example refund or urgent. The highest matching boost wins.
  • Sender boosts (sender_boosts): boost conversations from a specific customer email (matched case-insensitively), for example your VIP or partner addresses.

Best for: teams with specific business rules, such as surfacing VIP customers, prioritizing live chat over email, or bubbling up refund requests.

How scoring works (Magic and Custom)

Each conversation gets a score that is the sum of eight components:

score = time_decay + urgency + sentiment + language_match
      + tag_boost + channel_boost + subject_boost + sender_boost

Weighted factors each contribute weight/100 x normalized_signal, where the normalized signal runs from 0 to 1:

  • time_decay: waiting time divided by time_decay_max_hours, capped at 1.0
  • urgency: urgency / 100, capped at 1.0
  • sentiment: sentiment / 100, capped at 1.0
  • language_match: 1.0 when the languages match, otherwise 0

Boosts each add boost_value / 100 to the score (so a boost of 100 adds 1.0).

Conversations are then ordered by total score, highest first. In FIFO mode this scoring is skipped entirely and only waiting time is used.

Note: boosts only apply in Custom mode. Zuzana Magic ignores all four boost maps.

Worked example (Custom)

{
  "algorithm": "custom",
  "time_decay_weight": 50,
  "time_decay_max_hours": 48,
  "urgency_weight": 40,
  "sentiment_weight": 20,
  "language_match_weight": 10,
  "tag_boosts": { "tag_vip_customer_id": 100 },
  "channel_boosts": { "chat": 75, "email": 25 },
  "subject_boosts": { "refund": 90, "urgent": 80 },
  "sender_boosts": { "vip@bigcustomer.com": 100 }
}

With this configuration, a VIP customer emailing about a "refund" gets a large head start, live chat outranks email, and older tickets still steadily climb thanks to time decay.

Configuring the Flow Queue

You can change the algorithm and all settings from the Helpdesk settings page in the app. Only the fields you provide are changed; anything you leave out keeps its current value. To clear a boost group, set it to an empty object.

Quick recipes:

  • Oldest tickets always first: set algorithm to fifo.
  • Smart default, no setup: set algorithm to zuzana_magic.
  • Fine-grained control: set algorithm to custom, then tune the weights and boosts.