In this blog post, I will illustrate two ways that an image in an analytics app can be changed dynamically based on selections. In one example, a layout container and the show condition is used to control which image is visible. In a second example, an IF statement is used to determine which image URL to use. In the second example, I will also review how to obtain the URL for an image in the media library of an analytics app.
Let’s begin by looking at the first example. In this example, we have an app on automobiles. When the user selects one of the automobile names, a picture of the car will be visible. If no cars are selected, then an image of all 4 automobiles should be displayed. Below is the image with no selections and all 4 cars visible.
When the Nebula model is selected, the sheet updates and only the Nebula model is visible.
In this example, a layout container has 5 Text & image objects – one image for each automobile model and one image for all cars.
A show condition like this is used to determine if the Text & image object should be visible. Only one image will be visible at any given time.
Now, let’s look at another example of how the background image can be dynamically displayed using an URL. In this example, one Text & image object is needed. In the properties of the object, under Presentation > Styling, a background image can be set. When URL is selected from the drop-down list, the option to enter an expression is available. Note that you want to edit the Background image setting that is in Presentation > Styling, not the Background image section in the properties panel.
The IF statement below checks to see which automobile model is selected to determine which image to show. If there is not a selection on the model, then the image of all the automobiles is displayed. In this example, the URLs for the media library images were used, but you could also link to images in an external source like an Amazon s3 bucket.
To find the URL for images in the media library, you can open the media library or use a sheet in the app that has the image on it. In my Chrome browser, I opened the Developer tools to inspect the image. In Chrome, the Developer tools can be opened by using Ctrl-Shift-I or from the three-dots icon in the upper right corner of the browser window and selecting More tools > Developer tools. Once the Developer tools window is open you can inspect an element by clicking on the Elements tab and then selecting the image in the highlighted box below. This will allow you to select elements on the page.
In the analytics app, click on the image in the library so that it appears in the preview window. When you click on the image in the preview window, you will see that a line in the html is highlighted. If necessary, expand the code to find the URL for the image.
Copy the URL that is listed in the src attribute for the img tag (see below). In the expression, you can use the full URL that includes https:// and the tenant name or just what is displayed in the src tag. Repeat these steps for each image.
I found this insight useful, and I hope you do, too. I would like to thank my colleagues @Charles_Bannon for the blog idea and use of his app to provide examples and @Ouadie for the tip on how to capture the media library URL.
Thanks,
Jennell
...View More
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