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.
Why not just use bookmarks?
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 orReplay 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.
What can you do with the Qlik Trail extension?
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
Demo
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 Storyand Sales Opswith 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)
Setup
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.
Trail 1 — Executive Story
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 = Cheesequick A/B inside the same region.
Step 3 — “West vs Northeast · Fresh Fruit”Selections: Region = West, Northeast, Product Group = Fresh Fruitsame category across two regions to see differences.
Step 4 — “Northeast focus: PA · Fresh Fruit”Selections: Region = Northeast, State = Pennsylvania, Product Group = Fresh Fruitdrill to a particular state.
Presenting: select the group → Replay from start. If questions land on Step 4, use Replay to here.
Trail 2 — Sales Ops Story
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
Tips when building trails
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
Sharing your trails
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.
Tech notes
1) Module & CSS injectionLoad 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 stateRead 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 selectionsClear 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 windowAvoid 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 & persistenceTrails 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
...View More
Delivering a multilingual Qlik Sense app shouldn’t mean forcing users to pick their preferred language every time. In this post, I explore how to streamline the experience by automatically detecting a user’s locale from their Qlik Cloud profile and instantly adapting the app’s interface - no dropdowns, no extra clicks.
Building on the well-known community approach shared by Jennel, this method keeps the flexibility of translation tables while removing friction for end users. The result? A truly seamless multilingual experience that feels natural and effortless.
The Pick function is a chart and script function that can be used to return the nth expression in a list based on a field or value. It is a good alternative to a large or nested If statement where each If statement needs to be evaluated. With the pick function, one value is read to determine which expression should be returned.
The syntax of the pick function according toQlik Help looks like this:
pick(n, expr1[ , expr2,...exprN])
The first parameter (n) should be an integer. Based on this value, the first expression, second expression, third expression or nth expression is returned. Let’s look at an example. In the table below, there are three dimensions listed – the state abbreviation, the state name and a state code for the U.S. region the state is in.One is the Northeast region, 2 is the Midwest region, 3 is the South region and 4 is the West region.
The pick function can be used to show the region name that is represented by the state code. This can be done by adding the measure below to the table.
The pick function will assess the value of StateCode and based on that return a region. With the measure added to the table, the region name can also be displayed as seen below.
The pick function measure used in the table above is simpler than a nested if statement and is easy to read. It optimizes the table, returning results faster and using less resources to evaluate. Try it out.
Thanks,
Jennell
...View More
If you’re running Qlik on-premise, NPrinting is the go-to for producing highly formatted, template-based reports. It works seamlessly with QlikView and Qlik Sense Enterprise on Windows, letting you design in familiar tools like Excel, Word, PowerPoint, and PixelPerfect, then deliver reports as PDFs, HTML, or Office files to folders, the NPrinting NewsStand, email recipients, or even the Qlik Sense Hub — all with scheduling, cycling, and bursting built in.
In Qlik Cloud, reporting takes a different shape. You still have built-in options for creating and delivering reports directly in the tenant interface, but you also gain something new: an API-driven approach that opens up possibilities well beyond what’s available in the UI. And that’s where the Qlik Cloud Reporting API comes in.
What You Can Do in Qlik Cloud (Inside the Interface):
Qlik Cloud Reporting allows you to create reports from apps using native templates or PixelPerfect templates, then distribute them as PDFs, Excel files, or other formats. Through the tenant interface, you can:
Create and edit report templates
Apply selections and filters
Schedule recurring reports
Deliver reports to email recipients or Qlik Cloud spaces
These capabilities are fully documented in Qlik Help, and for many users, the UI-based workflow is all they need.
Why Go Beyond the Tenant Interface?
The Reporting API enables everything above — but from outside Qlik Cloud.That means you can:
Trigger reports from external systems
Integrate reporting into your own applications
Automate delivery to custom destinations
Include Qlik reports in larger automated workflows (think: customer portals, scheduled partner updates, or triggered operational reports)
If you’ve ever wished you could generate a Qlik report as part of an end-to-end automation pipeline, the API is the key.
Reporting with Qlik Automate
Not every reporting workflow requires custom code. Qlik Automate lets you build automated reports using the Qlik Reporting Service through a low-code, drag-and-drop interface. Reports can be delivered as PDF or PowerPoint and distributed via email or cloud connectors like SharePoint, OneDrive, Dropbox, Google Cloud Storage, Amazon S3, or SFTP.
Some common use cases include:
Bursted reports where each recipient only sees their own data
Looping reports that generate one page per dimension value (e.g. region or product)
Cross-app reporting combining insights from multiple Qlik Sense apps
External delivery to recipients without Qlik Cloud accounts
Think of Automate as the middle ground — more flexible than the tenant UI, but easier to adopt than full API coding.
How the Qlik Cloud Reporting API Works
At its core, the process involves:
1- Sending a POST request to create a report generation job.
2- Polling the outputs endpoint to check when the job is complete.
3- Downloading the generated file once it’s ready.
Here’s a real example:
Step 1: Request a Report
POST https://<tenant>/api/v1/reports
Body:
{
"type": "sense-pixel-perfect-template-1.0",
"sensePixelPerfectTemplate": {
"appId": "1234567-a480-43f5-bc88-825736d8842f",
"templateId": "1a2b3c-ba56-46ee-ac74-4746dd145816",
"templateLocation": {
"path": "https://<tenant>/api/v1/report-templates/3de5c6c2-ba56-46ee-ac74-4746dd145816",
"format": "url"
},
"selectionChain": [
{
"selectionType": "selectionFilter",
"selectionFilter": {
"selectionStrategy": "stopOnError",
"selectionsByState": {
"$": [
{
"fieldName": "Currency",
"defaultIsNumeric": false,
"values": [{ "text": "USD", "isNumeric": false }]
},
{
"fieldName": "Year",
"defaultIsNumeric": true,
"values": [{ "number": 45778, "isNumeric": true }]
}
]
}
}
}
]
},
"output": { "type": "pdf", "outputId": "pp", "pdfOutput": {} }
}
Response:
{
"message": "Report request has been accepted and is being processed.",
"outputsUrl": "https://<tenant>/api/v1/reports/1234567-bed1-4024-8614-37bb898a41b0/outputs",
"requestId": "987654321-bed1-4024-8614-37bb898a41b0"
}
Here, you’ll notice:
outputsUrl gives you the endpoint to poll for the report status.
requestId uniquely identifies the job.
Step 2: Poll for the Output
GET https://<tenant>/api/v1/reports/{requestId}/outputs
Response:
{
"data": [
{
"cycleSelections": [],
"location": "https://<tenant>/api/v1/temp-contents/2342346c185413cc5ec121b",
"outputId": "pp",
"sizeBytes": 382078,
"status": "done",
"traceId": "abc1234d2e88db9bc155d8a732132899d"
}
],
"links": {
"self": {
"href": "https://<tenant>/api/v1/reports/{requestId}/outputs"
}
}
}
Key things to look for in the response:
status — "done" means the report is ready.
location — the direct link to the generated file.
Step 3: Download the File
Once the status is "done", perform a GET to the location URL.
For example:
GET https://<tenant>/api/v1/temp-contents/2342346c185413cc5ec121b
This returns the actual PDF (or other format, depending on your request).
Where to Learn More:
You can visit these pages for full API documentation and working samples:
Qlik Cloud Reporting API Docs
Reporting API Samples
Qlik Help – Reporting Overview
Qlik Cloud’s tenant interface is powerful for building and scheduling reports right inside your analytics environment — but the Reporting API takes it further. By integrating directly with your external systems, you can build modern, automated, and scalable reporting workflows that go well beyond what’s possible within the tenant.
If you’re ready to move from manual scheduling to full automation, the Reporting API is where you start.
...View More
Enhancements have been made to the line chart plugin feature that allows point and lines to be added to the line chart. These enhancements include features such as labels for points and lines, placement options for labels, and point symbol, size and color styling options. In the chart below, there is a line chart showing the daily page views for a site over time. Notice the point annotations for the highest and lowest daily page views days.
Let’s look at how these were created and the new features that are now available. Points and lines can be added to a line chart from the properties panel under Add-ons > Shapes.
The shape options that can be added are point and line. To add a point for the highest daily page views, a dimension value needs to be entered. It can be hard-coded, or it can be an expression. In this example, I used an expression to show the highest day in the current year. Measure input is set to measure index and the index is set to 0 to use the first measure in the line chart. Shown below are the styling options now available to use. Star was the symbol selected from the list of 7 options (circle, cross, diamond, saltire, square, star and triangle). The point color and outline are a color that stands out in the chart.
The same procedure was followed to add the symbol for the lowest daily page views. The expression was modified as well as the symbol and symbol color. The Colored background was checked to give a dark background to the label to make it easier to read.
Notice how these annotations highlight aspects about the line chart that may be significant or that the developer wants to point out. Let’s add a line to this chart to see what it looks like. To add a line to this chart that connects these points, a new line shape needs to be added with the value or expression for the line endpoints. Like the points, the line can be colored, and the line thickness, type and curve can also be styled.
These shapes do not replace the reference lines or dimension reference lines that can be added to a line chart. They can still be added to a line chart. The shapes feature should be used to add context to a line chart to enable better understanding. Check out Qlik Help to learn more.
Thanks,
Jennell
...View More
In this blog post, I will cover some enhancements that have been made to the Pivot table. The Pivot table is like a Straight table in that it takes multiple dimensions and measures, but what makes it stand apart from the Straight table is that the columns and rows can be reorganized providing various views and subtotals. The Pivot table can be found in the Qlik Visualization bundle under Custom objects.
The styling option continues to improve, giving the developer flexibility in styling the header, dimension, measure, total and null values in the chart. Text and background colors can be adjusted based on an expression as well. Rows can be indented, which I like because it looks more compact and takes up less space on the left.
Indented
Not indented
As you can see in the images above, a row can be presented as a link by changing the Representation to Link and adding a URL.
Indicators can also be added to cells alongside the text to call the user’s attention to something. For example, in the image below, a red yield indicator is shown when the sales value is less than 1,000 and a green dot is shown when the sales value is greater than 20,000.
Right-to-left support is available in the Pivot table as well for those who read right-to-left.
This setting can easily be toggled in the Settings of an app in the Appearance section.
While in view mode, rows and columns can be expanded or collapsed by either clicking the – or + sign or by opening the menu and selecting collapse or expand. From the menu, the sort order, search and selections can also be set.
Another enhancement of the Pivot table is the ability to use a cyclic dimension for the rows or columns. In the Pivot table below, a cyclic dimension with 3 fields (Category Name, Product and Product Name) is used for the rows. Notice that only one field of the cyclic dimension is visible at a time.
From the Pivot table, the cyclic dimension can be changed by opening the menu and selecting the desired dimension. To learn more about cyclic dimensions, check out one of my previous blog post.
Try out the Pivot table (found in the Visualization bundle) the next time you are developing an app to make use of the new enhancements. Check out Qlik Help for more information on the Pivot table and take a look at the What’s New app to see the Pivot table used in this blog post.
Thanks,
Jennell
...View More