Reference
Everything here is described where it is used, elsewhere on this site; this page is for looking a setting, a key, a limit or a message up.
Settings
The property panel's sections, in the order Qlik Sense shows them. A switch is On or Off; an expression is empty unless a default is given.
A new Chatbox.qs object is titled Conversation. The panel has no Sorting section: messages are ordered by Timestamp (numeric), under Message metadata, and Behaviour → Message order.
Data
The dimensions and measures, in order. What each slot is for depends on Conversation → Conversation model, and the panel names the role of each slot as it is filled. Up to four dimensions and ten measures.
| Slot | Participants (default) | From → To |
|---|---|---|
| Dimension 1 | Message ID — unique per message | Message ID — unique per message |
| Dimension 2 | Participant — the speaker | From — the sender |
| Dimension 3 | Conversation / thread (optional) | To — the recipient, one per row |
| Dimension 4 | To (optional) | Conversation / thread (optional) |
| Measure 1 | Message text, e.g. Only([MsgText]) | Message text, e.g. Only([MsgText]) |
| Measure 2 | Integrity probe, Count([MsgId]) — or a field only the messages table has, when the id also keys another table | Integrity probe, counting a field only the messages table has, e.g. Count([MsgText]) |
| Measure 3 and later | Optional KPIs, shown in the message's details | the same |
A dimension the conversation does not use is named so in the panel — Not used by the conversation — remove it — because an unused dimension splits messages into extra rows. Every dimension keeps Include null values on when it is added.
Conversation
| Setting | Default | What it does |
|---|---|---|
| Show whole conversations | Off | Selecting a person shows the conversations they are in, whole, rather than only their own messages. Readers can also turn it on and off in the bar above the conversation |
| Conversation model | Participants (one speaker dimension) | Or From → To (sender and recipient dimensions). Decides the role each new dimension takes, so choose it before adding them |
| Show conversations side by side | Off | A lane per value of the Conversation / thread dimension, the most recently active on the left |
| Most conversations side by side | 4 | 1 to 10. Shown when side by side is on. A narrow object fits fewer: each lane is at least 220 pixels wide |
| Scrolling | Linked — rows line up in time | Or Free — each conversation scrolls on its own. Shown when side by side is on |
Appearance
| Setting | Default | What it does |
|---|---|---|
| Layout | Rail (any number of participants) | Or Two-sided (per conversation), which puts one side of each conversation on the right |
| Own participant | empty | Shown with Two-sided. The person who goes on the right in every conversation they are part of — a name, or an expression such as =OSUser() |
| Density | Automatic (recommended) | Or Comfortable, Compact or Ultra compact: spacing, padding and the size of the avatars. Automatic picks Ultra compact at 320 pixels wide or less, Compact at 520 pixels wide or less or 260 pixels high or less, and Comfortable otherwise — measured on each lane when conversations are side by side |
| Show avatars | On | The round picture or initials beside each message. Ultra compact never shows them |
| Date separators | On | A line where a new day starts |
| Group messages within (seconds) | 120 | 0 to 600, in steps of 30. Messages from one sender this close together share a header; side by side with linked scrolling, messages this close together can share a row |
| Show search box | On | The find box in the bar above the conversation |
| Show overview ruler | On | The ticks beside the conversation where the highlights and search matches are. It appears only while there are some |
| Text size | Follow density | Or 10 px, 11 px, 12 px, 13 px, 14 px, 16 px, 18 px, 20 px or 24 px. Follow density is 13, 12 or 11 pixels as the density resolves to Comfortable, Compact or Ultra compact |
| Show text size control | On | The text size control in the bar, a reader's own choice of size |
| Show copy button on messages | On | The button that copies one message |
Message metadata
Expressions on the Message ID dimension, evaluated for each message. They add no columns and do not count against the engine's page limit. Each must aggregate — Only([Field]), not a bare field reference.
| Setting | Default | What it does |
|---|---|---|
| Timestamp (numeric) | empty | Puts messages in time order, groups them by time and by day — e.g. Num(Min([SentAt])) |
| Timestamp (display) | empty | The time shown with each message — e.g. Only(Time([SentAt])) |
| Avatar URL | empty | An https:// address, or a content library path such as /content/Default/ada.png |
| Media reference | empty | Reserved for a future release |
| Message kind | empty | A message's kinds — e.g. Only([MsgKind]), or Concat(DISTINCT [MsgKind], ',') for several |
| Show kinds as chips | Off | Each kind as a chip above the message text |
| Kinds are separated by | Comma (,) | Or Semicolon (😉, Vertical bar (|) or Do not split. Shown with chips on |
| Most chips per message | 3 | 1 to 20; the rest fold into one +N chip. Shown with chips on |
| Own message (1/0) | empty | 1, or Qlik's true, puts a message on the right; 0, or false, on the left — in any layout, Rail included. A comparison such as Only([Direction]) = 'outbound' returns exactly that. Anything else, null included, leaves it to the layout |
| Accent colour | empty | Colours the bubble's rail — e.g. Only([SpeakerColor]) |
| Badge text | empty | A short label beside the timestamp — e.g. Only([ThreadId]) |
Highlights
Everything after …or type a field name is shown once a highlight field is set.
| Setting | Default | What it does |
|---|---|---|
| Highlight field | None | The field whose values are highlighted wherever they occur in the messages |
| …or type a field name | empty | The same setting, typed: for a hidden field, or when the field list cannot be read. match and [match] both work |
| Highlight possible values | On | With nothing selected in the highlight field, highlight the values the other selections leave possible |
| Most values to highlight | 1000 | 1 to 10,000. When there are more, the first in sort order count |
| Select by clicking a highlight | On | A click on a highlight selects its value instead of doing what a click on the message does |
| Match case | Off | On: "Istanbul" no longer highlights "ISTANBUL" |
| Whole values only | On | Off: a value is highlighted inside longer words too |
| Flexible whitespace | On | Off: spaces and line breaks must match exactly |
| Show highlight summary | On | The line above the conversation that counts the highlights |
Categories
Shown once a highlight field is set; everything after …or type a field name once a category field is set too.
| Setting | Default | What it does |
|---|---|---|
| Category field | None | The field that groups the highlighted values into categories |
| …or type a field name | empty | The same setting, typed |
| Colour expression | empty | Evaluated for each category, returns its colour — e.g. RGB(68, 119, 170) or '#4477aa'. Empty: the theme's colours |
| Show legend | On | The categories and how many highlights each has |
| Show category labels | Off | Each highlight boxed, with its category names after it |
Details
| Setting | Default | What it does |
|---|---|---|
| Show details as | Automatic (recommended) | Or Side pane, Overlay or Inline expansion. Automatic picks a side pane at 720 pixels wide or more, an overlay at 360 pixels wide and 220 high or more, and an inline expansion otherwise — and an overlay rather than a side pane when conversations are side by side |
Behaviour
| Setting | Default | What it does |
|---|---|---|
| Message order | Oldest first | Or Newest first, which starts at the other end and keeps the newest rows when Maximum messages cuts them short |
| Clicking a message | Selects the participant (sender) | Or Selects the recipient (From → To), Selects the conversation, Selects the message, Opens the details or Does nothing |
| Message body | Plain text | Or Markdown, rendered without raw HTML. Field values often contain *, _ and #, which markdown would reformat |
| Maximum messages | 5000 | 1 to 50,000 rows. A message to several recipients uses one row per recipient. Rows beyond this are not read, and a banner says so |
| Virtualize long conversations | On | Draws only the messages near the part of the conversation on screen, so a long one stays responsive |
Add-ons
Qlik Sense's own Data handling settings, and nothing else.
About
The version installed — Chatbox.qs v0.6.3, say — and when it was built, with links to the documentation and to report an issue.
Messages
Everything Chatbox.qs says, word for word, so that searching for what is on the screen finds it. The names in the examples are made up: the object shows your own field, dimension and value names, and your own numbers. Counts in the banners about the data print without a thousands separator — 5000 — while the bar and the line above the lanes group them — 5,000.
Instead of the conversation
| Message | When |
|---|---|
| Add a unique Message ID and a Participant dimension, plus a Message text measure. | The object lacks a role it needs, in the Participants model. Below it, Missing: names the roles still needed, and Assigned: the ones already filled — Assigned: Message ID = MsgId · Conversation = ThreadId |
| Add a unique Message ID, a From and a To dimension, plus a Message text measure. | The same, in the From → To model |
| Loading conversation… — Loading 2000 of 5000 messages… | While the rows are read. The numbers count rows, not messages |
| No messages for the current selection. | Nothing survives the selections. An app's own calculation-condition message is shown instead, where there is one |
| The data returned 12 row(s), but none of them is a message: each is a value from a linked table that has no messages. | Every row read came from a table linked to a dimension, not from the messages |
| Could not load the conversation | The engine failed. Its own message follows, or Unknown error. |
Banners above the conversation
| Message | When |
|---|---|
| Showing the newest 5000 of 9000 messages. Filter to see the rest. | Maximum messages cut the rows, with Newest first or conversations side by side. the oldest with Oldest first; neither, when rows were cut at both ends, which happens only if the data changed while it was read |
| Showing 3871 messages from the newest 5000 of 9000 rows. Filter to see the rest. | The same, where a message spans several rows — one per recipient in From → To |
| 212 loaded row(s) were not messages — a table linked to a dimension adds a row for each value that has none — and they count against the limit. | Maximum messages was reached, and some of the rows read came from a linked table |
| 3 bubble(s) combine more than one message. The Message ID dimension is not unique — separate messages are being merged. | The integrity probe counted more than one row for a Message ID |
| 2 message(s) share a Message ID with a different message from the same sender. Make the id unique across conversations, not just within one. | Two different messages from one sender, in one conversation, have the same Message ID |
| 5 message(s) have no Message ID, so they cannot be selected or told apart. Every message needs an id. | Rows with a null Message ID |
| Not used by the conversation: Region. An unused dimension still splits messages into extra rows — remove it. | A dimension the conversation model has no role for |
| Conversations side by side need a Conversation / thread dimension. | Show conversations side by side is on without a thread dimension |
| The highlight field HlKeyword is not in the data model | The Highlight field names no field. Red |
| The highlights could not be calculated: Qlik engine error 6003 — The highlights could not be read from the Qlik engine | The engine failed working out the highlighted values. Red |
| 2 values selected in HlKeyword, but excluded by other selections | Values are selected in the highlight field, and the other selections exclude all of them |
| The first 1,000 of 20,017 selected values · 812 highlights in 240 messages | The highlight summary, as a banner, when Most values to highlight left values out. : their categories filled 20,000 rows follows the values when the category rows ran out first |
| …, the first 20,000 of them marked — … · the search stopped early | Added to the summary when more than 20,000 highlights were found with every message drawn, or when the search reached its limit |
| The category field HlCategory is not in the data model | The Category field names no field. Comes first in the summary |
| The categories could not be read from the Qlik engine — The categories could not be calculated: Qlik engine error 6003 | The engine failed working out the categories |
| The colour expression has an error: … | The Colour expression does not parse; the engine's own words follow |
| The colour expression names a field not in the data model: … | It names a field that does not exist — names fields for several |
| The colour expression returned "bluish", which is not a colour | It returned something that is not a colour |
In the bar
| Message | When |
|---|---|
| 3 selected values · 12 highlights in 5 messages — 1 selected value · none found in these messages | The highlight summary, while Show highlight summary is on. possible values when nothing is selected in the highlight field |
| Select values in HlKeyword to highlight them | Nothing is selected in the highlight field, and Highlight possible values is off |
| No values of HlKeyword are possible with the current selections | Nothing is selected in the highlight field, and the other selections leave no value of it possible |
| 24 messages in 3 conversations · 8 matching the selection | Whole conversations is on: the messages shown, and how many of them match the selection rather than give it context. Without lanes, 57 messages · 12 matching the selection |
| 3 of 12 — 12 matches — 1 match — No matches | The find box's counter. 3 of 12+ or 12+ matches when the search stopped at its limit |
| 3 of 7 — 7 — None | The keywords' counter |
| 1–4 of 12 | Which conversations are on screen, side by side, when more exist than fit |
| 4 of 12 conversations — 4 of 12 conversations among the newest 5,000 of 9,000 rows | The line above the lanes: some conversations have no lane, or Maximum messages cut the rows. 3 conversations among the newest 5,000 of 9,000 rows when every conversation read has a lane |
In the corner
A short notice in the corner of the object, for five seconds.
| Message | When |
|---|---|
| Qlik Sense did not select in Author; the field may be locked | Qlik Sense refused a click's selection — on a message, a lane header, a highlight or a legend chip. The name is the field's, or the dimension's own title where it is an expression; the dimension clicked where neither can be found |
| Could not select in Author: Qlik engine error 6003 — Could not select in Author | The engine failed the selection |
| Selected “reload” in HlKeyword | A click on a highlight or a legend chip selected. Selected “Reload” and “RELOAD” in HlKeyword for two values, Selected “Reload” and 2 more in HlKeyword for more. Nothing after a Ctrl+click or Cmd+click |
| HlKeyword is locked | A click on a highlight or a chip, in a locked field |
| There is no value to select in HlKeyword | A highlight whose value the field does not hold |
| Could not select in HlKeyword: the selection in progress could not be confirmed | A selection pending in the object's own selection mode could not be confirmed first |
| Copied the message | The copy button on a message worked |
| Copied 120 messages as text — Copied 1,204 messages from 4 conversations as JSON | Copy conversation as text or as JSON worked |
| The browser did not allow copying to the clipboard | The browser refused every way of copying |
| Whole conversations: the engine would not read the conversation in a state of its own | Whole conversations could not be started |
On a message
| Message | Where |
|---|---|
| merged — Message ID is not unique | A badge, and its tooltip, on a bubble that combines several messages |
| 2 messages share this Message ID, so Only() returns nothing. Use a unique id, or Concat() to show them together. | The body of such a bubble |
| shared id — A different message has the same Message ID | A badge, and its tooltip, on a message whose id another message from the same sender has |
| 3 recipients | A badge on a message to more than one person |
| This bubble combines 2 messages, because the Message ID is not unique. | In the details |
| A different message from the same sender has this Message ID. Make the id unique across conversations, not just within one. | In the details |
| Some recipients may be missing: the message limit cut the conversation part-way through this message. | In the details, when Maximum messages cut a message's rows |
| 1 attachment (rendering not yet supported) | In the details, when Media reference has a value |
| (no recipient) — (empty) — (unknown) — (no conversation) | Names the object gives a missing recipient, an empty value, a missing sender, and the lane of messages with no thread |
When the whole-conversations button is disabled
Hovering it says why:
| Message | Why |
|---|---|
| Whole conversations need the default state, not the alternate state Comparison. | The object reads in an alternate state |
| Whole conversations need a Message ID dimension on a field. | The Message ID dimension is an expression |
| Whole conversations need Participant on a field, not an expression. | The people or conversation dimensions are expressions — named as they are: From and To, Conversation |
Keyboard shortcuts
The conversation is one stop for the Tab key; the arrow keys move from message to message inside it. The find box, the step buttons, the whole-conversations button, the text size control, legend chips and lane headers are stops of their own.
| Keys | What they do |
|---|---|
| Ctrl+F (Cmd+F) | Goes to the find box, from anywhere in the object, with its text selected. Only while the find box is shown; otherwise the browser's own find |
| Enter / Shift+Enter in the find box | The next or the previous find match |
| F3 / Shift+F3 | The next or the previous find match |
| Ctrl+G / Ctrl+Shift+G (Cmd+G / Cmd+Shift+G) | The next or the previous find match |
| Alt+↓ / Alt+↑ | The next or the previous highlighted keyword |
| ↓ / ↑ | The next or the previous message |
| Home / End | The first or the last message |
| Page Down / Page Up | Ten messages on or back |
| → / ← | With conversations side by side, the neighbouring lane: its message in the same row with linked scrolling, the one at the top of its view with free scrolling |
| Enter on a message | Selects the value of the keyword stepped to, when the keywords were stepped last and that keyword is in this message — Ctrl+Enter (Cmd+Enter) adds or removes it. Otherwise it opens or closes the message's details |
| Space on a message | Opens or closes the message's details |
| Escape on a message | Each press does the first of these that applies: closes the details, lets go of the place stepped to, leaves the object |
| Escape in the find box | Clears what was typed, then leaves the object |
Stepping through find matches or keywords wraps around at either end; the arrow keys do not. The stop stepped to last is the one outlined. The keyboard never makes the selection a click on a message makes: Enter opens the details instead.
Limits
| Limit | Value | Where it shows |
|---|---|---|
| Rows read | Maximum messages: 5000 by default, 1 to 50,000. Counts rows, so a message to several recipients uses one per recipient | A banner says what was left out |
| Dimensions and measures | Up to 4 dimensions and 10 measures | — |
| Conversations side by side | Most conversations side by side: 4 by default, 1 to 10; each lane at least 220 pixels wide | The line above the lanes, and the stepper in the bar |
| Values highlighted | Most values to highlight: 1000 by default, 1 to 10,000 | The highlight summary, as a banner |
| Values and categories read | 20,000 rows of value and category together, with a category field | The highlight summary: their categories filled 20,000 rows |
| Highlights drawn with every message on screen | 20,000, when Virtualize long conversations is off | The highlight summary: the first 20,000 of them marked |
| Highlights and search matches searched for | 1,000,000 | the search stopped early in the highlight summary; a + after the find box's count |
| Kind chips | Most chips per message: 3 by default, 1 to 20; at most 100 kinds kept per message | A +N chip |
| Recipients in a message's header | 3 names, then and 2 more | The details list up to 50 |
The JSON a copied conversation holds
Copy conversation as JSON writes an object with these keys, in this order:
| Key | Holds |
|---|---|
export | Always "chatbox.qs conversation" |
schemaVersion | 2 |
exportedAt | When the copy was made, in UTC — "2026-10-09T12:00:00.000Z" |
extensionVersion | The Chatbox.qs version that made it — "0.6.3" |
conversation | A summary of what was copied — below |
highlights | A summary of the highlighting, or null while nothing is highlighted — below |
messages | The messages, in the order shown; with conversations side by side, one lane after another — below |
conversation
| Key | Holds |
|---|---|
messages | How many messages were copied. With conversations side by side, those in the lanes shown |
rows | How many rows the conversation holds — every conversation's, with lanes |
rowsRead | How many of them were read. Rows, not messages: one per recipient in From → To |
truncated | true when Maximum messages left rows out |
truncatedTo | "oldest" or "newest": which rows were kept. null when nothing was left out, or when rows were left out at both ends |
order | "oldest" or "newest", from Behaviour → Message order |
conversations | { "shown": 2, "total": 3 } — present only with conversations side by side |
highlights
| Key | Holds |
|---|---|
field | The highlight field |
source | "selected" or "possible": whether the values are the ones selected in the field, or the ones possible |
values | How many values are highlighted |
valuesLeftOut | true when Most values to highlight left values out |
categoryField | The category field, or null |
total | How many highlights there are |
messagesWith | How many messages have one |
searchTruncated | true when the search for them stopped early |
categories | [{ "name", "highlights", "messages" }], by name. A value in several categories counts in each |
noCategory | { "highlights", "messages" } for values with no category |
Each message
| Key | Holds |
|---|---|
id | The Message ID, as text |
author | The sender: the Participant or From value |
recipients | Every To value, each once — "(no recipient)" for a missing one. null without a To dimension |
thread | The Conversation / thread value, or null |
time | Timestamp (numeric), in ISO 8601 — below. null without one |
timeText | Timestamp (display), as the object shows it, or null |
kind | Message kind, as the expression returns it, or null |
badge | Badge text, or null |
format | "text" or "markdown", from Behaviour → Message body |
body | The message as it was written — the markdown itself, for a markdown message. "" when there is none |
plainText | For a markdown message only: the text it shows, its blocks separated by line breaks |
kpis | [{ "label", "text", "number", "varies" }], one per KPI measure. varies is true, with text empty and number null, when the rows of one message disagree |
highlights | Present only while something is highlighted: [{ "text", "start", "end", "values", "categories" }]. start and end count characters into body, or into plainText for a markdown message, end not included |
time has no time zone, because a Qlik timestamp has none — "2026-09-08T23:30:00.000" is the date and time the data holds, the same whoever copies it. Only a timestamp in Unix time, seconds or milliseconds since 1970, is a moment, and it is written in UTC with a Z: "2026-09-08T21:30:00.000Z".
The JSON leaves out search matches, avatars, accent colours and which side a message is on, and it does not mark which messages are context under whole conversations.