Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
By reading the Product Innovation blog, you will learn about what's new across all of the products in our growing Qlik product portfolio.
The Support Updates blog delivers important and useful Qlik Support information about end-of-product support, new service releases, and general support topics.
This blog was created for professors and students using Qlik within academia.
Hear it from your Community Managers! The Community News blog provides updates about the Qlik Community Platform and other news and important announcements.
The Qlik Digest is your essential monthly low-down of the need-to-know product updates, events, and resources from Qlik.
The Qlik Learning blog offers information about the latest updates to our courses and programs, as well as insights from the Qlik Learning team.

Use and practice of the container and visual part with transposed buttons and graphics

Use this practice to learn more about the container's functionality in a fun and dynamic way and then be able to apply it in official and formal projects that require a visual environment with this approach.

Team members to explore the container's functionalities

Practice of transposed objects with the purpose of implementing it in formal projects
Custom CSS has been a popular workaround in Qlik Sense for years, helping developers tweak layouts, hide buttons, and get around styling limitations. But things are shifting. With the Multi-KPI object being deprecated and native styling options getting stronger with every release, it’s a good time to rethink how we approach custom styling in Qlik Sense moving forward.
In this post, we’ll break down:
Let’s dive in!
Why is custom CSS used in Qlik Sense?
In the past, Qlik’s built-in styling options were limited. That led to many developers using CSS to:
Most of this was made possible by either creating custom themes, building extensions, or using the Multi-KPI object as a helper to inject CSS code. But as powerful as these techniques were, they also came with downsides, like breakage after updates or difficulty governing app behavior at scale.
So, What’s Changing?
The biggest shift is the deprecation of the Multi-KPI object, which has served as a popular CSS injection tool. Here's what you need to know:
EOL of the Multi-KPI object is May 2026:
If you’ve been using the Multi-KPI as a styling workaround, it’s time to plan for alternatives.
Native Styling Has Come a Long Way
Before reaching for CSS, it's worth exploring what Qlik now offers natively. Many of the styling tweaks that once required CSS are now fully supported in the product UI.
Here’s a quick look at recent additions:
|
|
Native styling available now or coming in the next update |
|
Straight Table |
Background images, word wrap, mini charts, zebra striping, null styling, header toggle |
|
Pivot Table |
Indentation mode, expand/collapse, RTL support, cyclic dimensions |
|
Text Object |
Bullet lists, hover toggle, border control, support for up to 100 measures |
|
Line Chart |
Point and line annotations |
|
Scatter Plot |
Reference lines with slope, customizable outline color and width |
|
Layout Container |
Object resizing and custom tooltips |
|
Navigation Menu |
Sheet title expressions, left/right panel toggle, divider control |
And this list keeps growing. If you're building new apps or redesigning old ones, these built-in features will cover a huge percentage of use cases.
Many deprecated CSS tricks are now native. Check out the full Obsolete CSS Modifications post for examples and native replacements.
What About Themes?
Themes are not going anywhere. In fact, they remain the most robust and supported way to apply consistent styling across your app portfolio.
With custom themes, you can:
You can still include CSS files in themes, but remember:
If you're new to themes, Qlik.dev has a great guide to get started, or checkout my previous blog post for some tips and tricks.
Still Need Custom CSS? Here’s What You Can Do
If your use case goes beyond what native styling or themes can handle—like hiding a specific button, or styling based on object IDs—you still have a few options:
What's Missing
A lot of Qlik users have voiced the same thing: "we still need an officially supported way to inject CSS at the sheet or app level"
Some have suggested:
Qlik has acknowledged this feedback and hinted that future solutions are being considered.
What You Should Do Today
That’s a wrap on this post. With more native styling features on the way, I’ll be keeping an eye out and will be likely sharing a follow-up as things evolve. If you're in the middle of refactoring or exploring new approaches, stay tuned, there’s more to come.
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 to Qlik 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
Hello Qlik Users,
Execution tokens will become header parameters on February 1st, 2026.
On January 13th, 2025, Qlik introduced breaking changes to the execution token functionality for triggered automations.
One of the biggest shifts in education over the past few years has been the rise of self-paced learning. With students juggling busy schedules, internships, part-time jobs, and extracurricular activities, the traditional classroom model doesn’t always provide the flexibility they need. That’s why universities and employers alike are placing more emphasis on programs and tools that let learners set their own pace.
Self-paced learning allows students to:
Revisit difficult topics without feeling rushed.
Move ahead quickly in areas they already understand.
Balance academics with personal and professional responsibilities.
And it’s not just about convenience. Research shows that when students have control over their learning journey, they retain more knowledge and build stronger skills for the real world.
The Qlik Academic Program is designed with this same philosophy in mind. Every student and educator who joins the program gets free, self-paced access to:
Online training modules on data analytics and visualization.
Qualifications and certifications to showcase on a resume or LinkedIn profile.
Interactive lesson plans and resources that can be used in or outside the classroom.
Qlik software, so students can practice and apply their skills right away.
Whether you’re a professor designing flexible assignments or a student looking to upskill on your own schedule, Qlik’s Academic Program makes it possible to learn at your pace and still achieve professional-level results.
With the demand for data literacy and analytics skills growing across every industry, students who take advantage of self-paced resources like Qlik’s Academic Program are positioning themselves ahead of the curve. Employers aren’t just looking for degrees—they want proof of hands-on, applicable skills. Earning Qlik qualifications through self-paced learning is one way to stand out.
Education isn’t just happening in the classroom anymore—it’s happening anytime, anywhere. If you’re ready to take control of your learning journey and gain the skills employers value most, the Qlik Academic Program is here to support you every step of the way.
👉 Sign up today and start learning at your own pace: https://www.qlik.com/us/company/academic-program
Hi everyone,
Want to stay a step ahead of important Qlik support issues? Then sign up for our monthly webinar series where you can get first-hand insights from Qlik experts.
The Techspert Talks from August look at Migrating to Qlik Cloud Analytics.
But wait, what is it exactly?
Techspert Talks is a free webinar held on a monthly basis, where you can hear directly from Qlik Techsperts on topics that are relevant to Customers and Partners today.
In this session we covered:

Some of the discoveries from using this app include: Business users can easily upload and manage non-system data to enhance dashboards. Automated user and timestamp logging improved transparency and governance. KPI-based folder navigation made organizing and locating files much simpler. Quick upload/delete reduced delays and improved reporting efficiency. Developers were freed from repetitive manual uploads and could focus on higher-value work.

The app has empowered business teams with self-service data uploads, reduced dependency on IT, and accelerated reporting cycles. By making complete and reliable data quickly available in dashboards, it has improved both decision-making speed and confidence.

The app is primarily used by business stakeholders such as Deputy Managers, managers, analysts, and operations teams across different functions. It is accessed directly in Qlik SaaS and used frequently to upload KPI-specific data not available in core systems. Since multiple departments rely on it, the app has become an important enabler for timely reporting and analysis.

The app has empowered business teams with self-service data uploads, reduced dependency on IT, and accelerated reporting cycles. By making complete and reliable data quickly available in dashboards, it has improved both decision-making speed and confidence.
You might be familiar with the concept of Window functions from Excel or SQL and know just how convenient and powerful they can be. Well, Qlik has one that you can use right in your Load Script!
Simply put, the Window function performs calculations over multiple rows producing a value for each row separately, unlike aggregate functions that will give a single value for the group of rows aggregated together.
You can think of it as looking through a window at your dataset and only seeing a subset based on different parameters you set which we will go over in a minute.
If you wanted to calculate the average transaction_amount by customer, you could of course do this in the chart expression with something like this: aggr(avg(transaction_amount), customer_id), or if you’re in the Load Script, perform another load and use Group By as follows:
Temp:
//inline load here
Transactions:
NoConcatenate Load
transaction_id,
transaction_date,
transaction_amount,
transaction_quantity,
customer_id,
size,
color_code
Resident Temp;
Load customer_id,
Avg(transaction_amount) AS AvgAmount
Resident Transactions
Group By customer_id;
But this requires a separate load and can’t just be done on the same loaded table, and it might not be ideal for more complex use cases.
This is where the Window function comes in, and the above can be re-written as follows:
Temp:
//inline load here
Transactions:
NoConcatenate Load
transaction_id,
transaction_date,
transaction_amount,
transaction_quantity,
customer_id,
size,
color_code,
Window(Avg(transaction_amount),customer_id) as AvgCustTransaction
Resident Temp;
Much easier!
Syntax:
Let’s take a closer look at the function syntax to understand it a little more and see what other capabilities it has:
Window( input_expr, [partition1, partition2, ...], [sort_type, [sort_expr]], [filter_expr], [start_expr,end_expr] )
Refers to the input expression calculated and returned by the function. It must be any expression based on an aggregation, such as Median(Salary). For example:
Window(Median(Salary)) as MedianSalary
The input can also be a field name with no aggregation applied and in that case Qlik treats it like the Only() function. For example:
Window(Salary,Department) as WSalary
After input_expr, you can define any number of partitions. Partitions are fields that define which combinations to apply the aggregations with. The aggregation is applied separately with each partition. (Think of it as the Group By clause). Multiple partitions can be defined. For example:
Window(Avg(Salary), Unit, Department, Country) as AvgSalary
The sort type and the sort expression can be specified optionally. sort_type can have one of two values ASC (Ascending sorting) or DESC (Descending sort)
If sort_type is defined, then the sorting expression must also be defined. This is an expression that decides the order of the rows within a partition.
For example:
Window(RecNo(), Department, 'ASC', Year)
// results within the partition are sorted Ascendingly by year
The optional Filter Expression is a Boolean expression that decides whether the record should be included in the calculation or not.
This parameter can be omitted completely, and the result should be that there is no filter.
For example:
Window(avg(Salary), Department, 'ASC', Age, EmployeeID=3 Or EmployeeID=7) as wAvgSalaryIfEmpIs3or7
Optionally, you can set the argument for sliding window functionality. A sliding window requires two arguments:
For example, if you want to include the 3 preceding rows, the current row, and the 2 following row:
Window(concat(Text(Salary),'-'), Department, 'ASC', Age, Year>0, -3, 2) as WSalaryDepartment
Examples:
Let’s take a look at different use case examples:
1- Adding a field containing an aggregation
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id) as AvgCustTransaction;
Load * Inline [
transaction_id, transaction_date, transaction_amount, transaction_quantity, customer_id, size, color_code
3750, 20180830, 23.56, 2, 2038593, L, Red
3751, 20180907, 556.31, 6, 203521, M, Orange
3752, 20180916, 5.75, 1, 5646471, S, Blue
3753, 20180922, 125.00, 7, 3036491, L, Black
3754, 20180922, 484.21, 13, 049681, XS, Red
3756, 20180922, 59.18, 2, 2038593, M, Blue
3757, 20180923, 177.42, 21, 203521, XL, Black
3758, 20180924, 153.42, 14, 2038593, L, Red
3759, 20180925, 7.42, 5, 203521, M, Orange
3760, 20180925, 80.12, 18, 5646471, M, Blue
3761, 20180926, 3.42, 7, 3036491, XS, Black
3763, 20180926, 63.55, 12, 049681, S, Red
3763, 20180927, 177.56, 10, 2038593, L, Blue
3764, 20180927, 325.95, 8, 203521, XL, Black
];
2- Adding a field containing an aggregation filtered for specific values
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id, color_code = 'Blue') as AvgCustTransaction;
Load * Inline [
// Table goes here
];
3- Adding a field with a sliding window
Transactions:
Load
*,
Window(Avg(transaction_amount),customer_id, 'ASC', -1, 1, 0, 1) as AvgCustTransaction;
Load * Inline [
// Table goes here
];
This concludes this post, I hope you found it helpful!
A qvf with all the scripts is attached for reference.
- Thanks
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.
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:
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.
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.
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’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.