Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
When I’m exploring a Qlik app, I often want to show exactly how I reached a view—without typing instructions or jumping on a call.
Qlik Trail is a small extension I created that does just that: Click Record, make your selections, and you’ll get a tidy list of steps that you can replay from start to finish, or jump to a specific step. Then, when you’re happy with the journey, you can export the trail as JSON and hand it to someone else so they can import and run the same sequence on their side.
Bookmarks are great for destinations (one final selection state). Qlik Trail is more about the path:
Multiple steps in a defined order (A → B → C)
Replay from start for narration or Replay a specific step
Export/import a whole journey, not a bunch of one-offs
You can use bookmarks to save a point in time, and use Qlik Trail when the sequence matters more.
Record steps manually, or toggle Auto to capture each change
Name, duplicate, reorder, delete, or ungroup steps
Organize steps into Groups (Executive Story, Sales Ops, Training, …)
Replay to here (apply one step) or Replay from start (play the group)
Export / Import trails as JSON
Before we go into how the extension was built, let's see a demo of how it can be used.
I’ll share two practical trails an Executive Story and Sales Ops with selections you can record and replay on your end, for this demo I'll use the Consumer Goods Sales app (which you can get here: https://explore.qlik.com/details/consumer-goods-sales)
Upload the extension .zip file in the Management Console, then add Qlik Trail (custom object) to a sheet.
Optional: enable Auto-record in the object’s properties if you want every change captured while you explore.
Toolbar (left to right): Record, Replay from start, Delete, Delete all, Auto, Group filter, New group, Export, Import.
Create Group: Executive Story
Step 0 — “US overview: top categories”
Selections: (none)
Step 1 — “Northeast · Fresh Vegetables”
Selections: Region = Northeast, Product Group = Fresh Vegetables
Step 2 — “Northeast · Cheese (A/B)”
Selections: Region = Northeast, Product Group = Cheese
quick A/B inside the same region.
Step 3 — “West vs Northeast · Fresh Fruit”
Selections: Region = West, Northeast, Product Group = Fresh Fruit
same category across two regions to see differences.
Step 4 — “Northeast focus: PA · Fresh Fruit”
Selections: Region = Northeast, State = Pennsylvania, Product Group = Fresh Fruit
drill to a particular state.
Presenting: select the group → Replay from start. If questions land on Step 4, use Replay to here.
Create Group: Sales Ops Story
Step 1 — “South · Ice Cream & Juice (summer basket)”
Selections: Region = South, Product Group = Ice Cream, Juice
Step 2 — “Central · Hot Dogs (promo check-in)”
Selections: Region = Central, Product Group = Hot Dogs
Step 3 — “West · Cheese (margin look)”
Selections: Region = West, Product Group = Cheese
One idea per step. (Region + Category) or (Region + a couple of States)
Duplicate then tweak for fast A/B comparisons
Group by audience. Exec, Ops, Training
Ungrouped steps = scratchpad. Move into a group when it’s ready
After recording, drag to reorder so replay tells a clean story
Click Export to download qliktrail_export_YYYY-MM-DD_HHMM.json.
Your teammate can Import, pick a group, and hit Replay from start. Same steps, same order—no instructions needed.
1) Module & CSS injection
Load CSS once at runtime so the object stays self-contained:
define(['qlik','jquery','./properties','text!./style.css'], function(qlik, $, props, css){
if (!document.getElementById('qliktrail-style')) {
const st = document.createElement('style');
st.id = 'qliktrail-style';
st.textContent = css;
document.head.appendChild(st);
}
// …
});
2) Capturing selections per state
Read SelectionObject, group by qStateName, then fetch only selected rows via a lightweight list object. Store both text and numeric to be resilient to numeric fields:
app.getList('SelectionObject', function(m){
// build grouped { state -> [fields] }
});
...
app.createList({
qStateName: stateName || '$',
qDef: { qFieldDefs: [fieldName] },
qInitialDataFetch: [{ qTop:0, qLeft:0, qWidth:1, qHeight:10000 }]
}).then(obj => obj.getLayout() /* collect S/L/XS states */);
Snapshot (what we export/import):
{
"ts": "2025-03-10T14:30:00Z",
"states": [
{
"state": "$",
"fields": {
"Region": { "text": ["Northeast"], "num": [] },
"Product Group": { "text": ["Fresh Vegetables"], "num": [] }
}
}
]
}
3) Replaying selections
Clear target state, then select values. Prefer numbers when available; fall back to text:
app.clearAll(false, state);
...
field.selectValues(pack.num.map(n=>({qNumber:n})), false, false)
// fallback to qText
field.selectValues(pack.text.map(t=>({qText:String(t)})), false, false);
4) Auto-record with a quiet window
Avoid recording during replays to prevent ghost steps:
ui.replayQuietUntil = Date.now() + (layout.props.replayQuietMs || 1200);
if (Date.now() >= ui.replayQuietUntil && ui.autoOn) record();
5) Groups, ordering & persistence
Trails live in localStorage per app key. Groups look like { id, name, members:[stepId,…] }. Ordering is a simple seq integer; drag-and-drop reassigns seq inside the open list.
That’s Qlik Trail in a nutshell. It lets you hit record, name a few steps, and replay the story without hand-holding anyone through filters. Use Bookmarks to keep states, but Trail will help you keep tack of the sequence.
P.S: this extension is a work-in-progress experiment and not prod-ready, I'm planning to add more features to it and make it more stable in the future.
🖇 Link to download the extension: https://github.com/olim-dev/qlik-trail
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.