Skip to content

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.

SlotParticipants (default)From → To
Dimension 1Message ID — unique per messageMessage ID — unique per message
Dimension 2Participant — the speakerFrom — the sender
Dimension 3Conversation / thread (optional)To — the recipient, one per row
Dimension 4To (optional)Conversation / thread (optional)
Measure 1Message text, e.g. Only([MsgText])Message text, e.g. Only([MsgText])
Measure 2Integrity probe, Count([MsgId]) — or a field only the messages table has, when the id also keys another tableIntegrity probe, counting a field only the messages table has, e.g. Count([MsgText])
Measure 3 and laterOptional KPIs, shown in the message's detailsthe 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 ​

SettingDefaultWhat it does
Show whole conversationsOffSelecting 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 modelParticipants (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 sideOffA lane per value of the Conversation / thread dimension, the most recently active on the left
Most conversations side by side41 to 10. Shown when side by side is on. A narrow object fits fewer: each lane is at least 220 pixels wide
ScrollingLinked — rows line up in timeOr Free — each conversation scrolls on its own. Shown when side by side is on

Appearance ​

SettingDefaultWhat it does
LayoutRail (any number of participants)Or Two-sided (per conversation), which puts one side of each conversation on the right
Own participantemptyShown 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()
DensityAutomatic (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 avatarsOnThe round picture or initials beside each message. Ultra compact never shows them
Date separatorsOnA line where a new day starts
Group messages within (seconds)1200 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 boxOnThe find box in the bar above the conversation
Show overview rulerOnThe ticks beside the conversation where the highlights and search matches are. It appears only while there are some
Text sizeFollow densityOr 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 controlOnThe text size control in the bar, a reader's own choice of size
Show copy button on messagesOnThe 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.

SettingDefaultWhat it does
Timestamp (numeric)emptyPuts messages in time order, groups them by time and by day — e.g. Num(Min([SentAt]))
Timestamp (display)emptyThe time shown with each message — e.g. Only(Time([SentAt]))
Avatar URLemptyAn https:// address, or a content library path such as /content/Default/ada.png
Media referenceemptyReserved for a future release
Message kindemptyA message's kinds — e.g. Only([MsgKind]), or Concat(DISTINCT [MsgKind], ',') for several
Show kinds as chipsOffEach kind as a chip above the message text
Kinds are separated byComma (,)Or Semicolon (😉, Vertical bar (|) or Do not split. Shown with chips on
Most chips per message31 to 20; the rest fold into one +N chip. Shown with chips on
Own message (1/0)empty1, 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 colouremptyColours the bubble's rail — e.g. Only([SpeakerColor])
Badge textemptyA 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.

SettingDefaultWhat it does
Highlight fieldNoneThe field whose values are highlighted wherever they occur in the messages
…or type a field nameemptyThe same setting, typed: for a hidden field, or when the field list cannot be read. match and [match] both work
Highlight possible valuesOnWith nothing selected in the highlight field, highlight the values the other selections leave possible
Most values to highlight10001 to 10,000. When there are more, the first in sort order count
Select by clicking a highlightOnA click on a highlight selects its value instead of doing what a click on the message does
Match caseOffOn: "Istanbul" no longer highlights "ISTANBUL"
Whole values onlyOnOff: a value is highlighted inside longer words too
Flexible whitespaceOnOff: spaces and line breaks must match exactly
Show highlight summaryOnThe 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.

SettingDefaultWhat it does
Category fieldNoneThe field that groups the highlighted values into categories
…or type a field nameemptyThe same setting, typed
Colour expressionemptyEvaluated for each category, returns its colour — e.g. RGB(68, 119, 170) or '#4477aa'. Empty: the theme's colours
Show legendOnThe categories and how many highlights each has
Show category labelsOffEach highlight boxed, with its category names after it

Details ​

SettingDefaultWhat it does
Show details asAutomatic (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 ​

SettingDefaultWhat it does
Message orderOldest firstOr Newest first, which starts at the other end and keeps the newest rows when Maximum messages cuts them short
Clicking a messageSelects the participant (sender)Or Selects the recipient (From → To), Selects the conversation, Selects the message, Opens the details or Does nothing
Message bodyPlain textOr Markdown, rendered without raw HTML. Field values often contain *, _ and #, which markdown would reformat
Maximum messages50001 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 conversationsOnDraws 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 ​

MessageWhen
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 conversationThe engine failed. Its own message follows, or Unknown error.

Banners above the conversation ​

MessageWhen
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 modelThe 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 engineThe engine failed working out the highlighted values. Red
2 values selected in HlKeyword, but excluded by other selectionsValues 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 messagesThe 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 earlyAdded 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 modelThe 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 6003The 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 colourIt returned something that is not a colour

In the bar ​

MessageWhen
3 selected values · 12 highlights in 5 messages — 1 selected value · none found in these messagesThe highlight summary, while Show highlight summary is on. possible values when nothing is selected in the highlight field
Select values in HlKeyword to highlight themNothing is selected in the highlight field, and Highlight possible values is off
No values of HlKeyword are possible with the current selectionsNothing is selected in the highlight field, and the other selections leave no value of it possible
24 messages in 3 conversations · 8 matching the selectionWhole 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 matchesThe find box's counter. 3 of 12+ or 12+ matches when the search stopped at its limit
3 of 7 — 7 — NoneThe keywords' counter
1–4 of 12Which 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 rowsThe 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.

MessageWhen
Qlik Sense did not select in Author; the field may be lockedQlik 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 AuthorThe engine failed the selection
Selected “reload” in HlKeywordA 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 lockedA click on a highlight or a chip, in a locked field
There is no value to select in HlKeywordA highlight whose value the field does not hold
Could not select in HlKeyword: the selection in progress could not be confirmedA selection pending in the object's own selection mode could not be confirmed first
Copied the messageThe copy button on a message worked
Copied 120 messages as text — Copied 1,204 messages from 4 conversations as JSONCopy conversation as text or as JSON worked
The browser did not allow copying to the clipboardThe browser refused every way of copying
Whole conversations: the engine would not read the conversation in a state of its ownWhole conversations could not be started

On a message ​

MessageWhere
merged — Message ID is not uniqueA 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 IDA badge, and its tooltip, on a message whose id another message from the same sender has
3 recipientsA 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:

MessageWhy
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.

KeysWhat 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 boxThe next or the previous find match
F3 / Shift+F3The 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 / EndThe first or the last message
Page Down / Page UpTen 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 messageSelects 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 messageOpens or closes the message's details
Escape on a messageEach 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 boxClears 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 ​

LimitValueWhere it shows
Rows readMaximum messages: 5000 by default, 1 to 50,000. Counts rows, so a message to several recipients uses one per recipientA banner says what was left out
Dimensions and measuresUp to 4 dimensions and 10 measures—
Conversations side by sideMost conversations side by side: 4 by default, 1 to 10; each lane at least 220 pixels wideThe line above the lanes, and the stepper in the bar
Values highlightedMost values to highlight: 1000 by default, 1 to 10,000The highlight summary, as a banner
Values and categories read20,000 rows of value and category together, with a category fieldThe highlight summary: their categories filled 20,000 rows
Highlights drawn with every message on screen20,000, when Virtualize long conversations is offThe highlight summary: the first 20,000 of them marked
Highlights and search matches searched for1,000,000the search stopped early in the highlight summary; a + after the find box's count
Kind chipsMost chips per message: 3 by default, 1 to 20; at most 100 kinds kept per messageA +N chip
Recipients in a message's header3 names, then and 2 moreThe details list up to 50

The JSON a copied conversation holds ​

Copy conversation as JSON writes an object with these keys, in this order:

KeyHolds
exportAlways "chatbox.qs conversation"
schemaVersion2
exportedAtWhen the copy was made, in UTC — "2026-10-09T12:00:00.000Z"
extensionVersionThe Chatbox.qs version that made it — "0.6.3"
conversationA summary of what was copied — below
highlightsA summary of the highlighting, or null while nothing is highlighted — below
messagesThe messages, in the order shown; with conversations side by side, one lane after another — below

conversation

KeyHolds
messagesHow many messages were copied. With conversations side by side, those in the lanes shown
rowsHow many rows the conversation holds — every conversation's, with lanes
rowsReadHow many of them were read. Rows, not messages: one per recipient in From → To
truncatedtrue 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

KeyHolds
fieldThe highlight field
source"selected" or "possible": whether the values are the ones selected in the field, or the ones possible
valuesHow many values are highlighted
valuesLeftOuttrue when Most values to highlight left values out
categoryFieldThe category field, or null
totalHow many highlights there are
messagesWithHow many messages have one
searchTruncatedtrue 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

KeyHolds
idThe Message ID, as text
authorThe sender: the Participant or From value
recipientsEvery To value, each once — "(no recipient)" for a missing one. null without a To dimension
threadThe Conversation / thread value, or null
timeTimestamp (numeric), in ISO 8601 — below. null without one
timeTextTimestamp (display), as the object shows it, or null
kindMessage kind, as the expression returns it, or null
badgeBadge text, or null
format"text" or "markdown", from Behaviour → Message body
bodyThe message as it was written — the markdown itself, for a markdown message. "" when there is none
plainTextFor 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
highlightsPresent 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.

Released under the MIT licence.