A table recipe is an easy, no-code way to prepare a data set for an app, data flow, script or ML experiment. It is a great way for new users to prepare their data and get started building an app without having to write the script to transform the data. It can also be used by experienced users for quick data prep. Table recipe is available in Qlik Cloud Analytics from the Analytics activity center > Prepare data. You can also access it from the + Create menu option or + Create New button in the catalog. To begin using it, open table recipe, give it a name and select the space you would like to create it in. Once that is done, you will be prompted to select the data set. Note - the table recipe processes one data set at a time.
Once a data file is selected, you can view the fields to confirm it is the correct data set and then you can load it into table recipe. Once it is loaded, you will see a pop up indicating the number of rows and columns in the dataset. Note that all the rows may not be loaded into the table recipe editor, but the recipe will be applied to the entire data set when it is run. Below is a look at the table recipe. On the left is the functions panel that includes several functions that can be used to prepare the data. Functions are grouped as general, columns, strings, dates, numbers and math. On the right is where the steps in our recipe will be added.
Let’s begin with a simple step like deleting a column. I have a Fax column that I do not need so to delete the column; I can click on the column menu (three vertical dots) and select Delete column.
The step will appear on the right in the table recipe, and I can click Apply to remove the Fax column.
Next, let’s split a column into two new columns. I have a Contact Name field with the contact’s full name. I would like to split the name into two fields – one for first name and one for last name. To do this, I will select the Split column function from the list of string functions on the left. Then I can update the details and apply the step. I will change the separator to a space since that is what separates the first and last name in the ContactName column.
Once I apply that step, I can see the two new fields it generated.
I will open the column menu and select Rename column to change the names of the new columns. Once I apply those steps, the columns and the recipe look like the image below. Keep in mind that the table recipe has steps that flow in a specific order. If those steps were to change, you may not get the expected results. For example, if I moved the rename column step above the split column step it would not work because the column I am renaming does not exist yet.
It is also easy to reorder the columns with the table recipe. The Reorder column function is found in the function group named Columns. Simply, select the column you would like to move and click on the Reorder column function. To move the Address column to the left of the City column, I will select the City column from the Anchor column drop down and then click Apply.
We are also able to apply filters to the data if we want to focus on specific rows. In this example, Country has two different values for the United States – USA and US. I would like to change the US values to USA.
After applying the filter, I can see that I have 6 rows with US as the Country. I can use the string Search and replace function to replace US with USA.
This step included my filter, so it only applied it to the rows I have filtered on.
Let’s perform one more step that I use all the time when loading data. We will extract date parts from the OrderDate field. This will allow us to create other date fields such as month and year fields. If I select the OrderDate field and then select the date function Extract date parts, I am presented with all the possible date part fields I can add as a column to my data set. I simply can toggle on any new fields I would like to add.
Once this step is applied, I can see the 4 new date fields I added.
When all the steps have been added to the table recipe, the next steps are to set the target and run the recipe. Setting the target is nothing more than giving the target file a name and file type (qvd, parquet, txt or csv) and selecting the space to create it in.
What is nice about the table recipe is the steps are applied and stored in a new file, separate from the original data set, so you do not have to worry about incorrectly modifying the data set. Once the target is set, the Incomplete recipe message at the top of the page will change to Valid recipe and the Run recipe button will be enabled. Once the recipe is run, you can view your new data set and use it accordingly. The target data set will be stored in the desired space and can be accessed anytime via the catalog.
Notice how all these steps we are creating are very easy and intuitive to build. You do not have to be an expert to perform these steps, and the editor is very user friendly and has a clean flow. What is also nice is that you can see that each step is working as expected when you apply it. Take this product tour to get a feel for the table recipe and then try it for yourself. To learn more, check out Qlik Help.
Thanks,
Jennell
...View More
Hey guys join @Jennell_Yorkmanand I for a quick community resource update as we highlight some of the latest ideas, enhancements, and best practices being shared across the Qlik Design Blog and Qlik Community.
From dashboard design and developer capabilities to visualization techniques and platform improvements, this session is a fast-paced roundup of useful content and community-driven insights to help you get more out of Qlik. Whether you’re building apps, designing dashboards, or exploring new capabilities, this is a great way to stay connected with what’s happening across the Qlik ecosystem.
Register here LinkedIn Live
...View More
Today I want to introduce you to a gem that you may be missing out on. It is the Do More with Qlik community forum lead by @Michael_Tarallo. This forum is made up of concise videos that cover everything from Qlik capabilities to innovative ways to solve business challenges. It is for users of all levels, beginners to seasoned Qlik users, with a wide range of topics. Check out this introductory video to learn more and bookmark the forum. You do not want to miss out on this!
Thanks,
Jennell
...View More
With less than 50 days to go before the 2026 World Cup kicks off across the US, Canada, and Mexico, I wanted to share a project I've been working on that brings together a few pieces of the Qlik platform I think work really well together: Choose Your Champion 2026.
It's a web app where anyone can fill out their World Cup bracket, get AI-powered predictions for every possible matchup in the tournament powered by Qlik Predict, explore historical World Cup data, and compete on a leaderboard as the competition unfolds.
You can try it here:https://webapps.qlik.com/choose-your-champion-2026/index.html#/
The app is powered by Qlik, with Qlik Cloud Analytics for the data model and Historical Analysis, Qlik Predict for the matchup predictions, and various Qlik APIs to wire everything into a React front-end.
In this post, I'll walk through how the predictions work under the hood, because that was the most interesting piece to build.
What's in the app:
Choose Your Champion is broken into 4 parts:
Build a bracket: Pick your group stage winners, advance teams through the knockout rounds, and lock in your champion.
Check the predictions: For every possible matchup in the tournament, the app surfaces a Qlik Predict generated win probability for each team plus a draw probability. When you're unsure about a matchup, you can pull up the prediction and use it to decide which team advances.
Explore historical World Cup data: The app includes various visualizations to help you uncover insights from past tournaments: goals, top scorers, host nation performance, biggest upsets. All powered by the associative engine.
Leaderboard: As real matches get played in June and July, submitted brackets are scored automatically and players are ranked in the leaderboard table.
Under the hood: how the predictions work
This was the fun part. The goal was simple, given two national teams, predict the outcome of a hypothetical match (team A wins / draw / team B wins), but the work that makes the predictions actually useful is mostly in the data, not the model (thanks to no-code ML with Qlik Predict).
1. The training dataset
I started with every international football match result from 1872 to March 2026. There's a well-maintained open dataset on GitHub (credit:martj42/international_results) that gets updated after every international window, about 49,000 matches in total.
From that raw history, I built a training dataset focused on the modern era (2010 onwards) and only competitive matches (qualifiers, continental tournaments, World Cup finals). Friendlies got filtered out because they're noisy since teams often don't play their A squads, and the stakes don't match what happens in a real tournament.
That left me with around 9,400 training rows, each representing a real historical match with a known result, enriched with 27 features describing both teams' state going into that match:
Elo ratings for both teams
FIFA rankings and points snapshot to the match date
Rolling 10-match form per team: win rate, goals for, goals against, goal difference
Head-to-head history in the last 10 meetings
Context flags: neutral venue, tournament tier, cross-confederation
World Cup pedigree: a score rewarding teams for deep runs in past tournaments, with more recent success weighted heavier
2. ML Experiment
Once the training CSV was in shape, I uploaded it to Qlik Predict, pointed at the result column as the target, and let it do its thing. This is where Qlik Predict really shines, zero code needed. No Python notebooks, no sklearn, no hyperparameter grids to tune. You just upload your data, pick a target, and it does the heavy lifting with full explainability on the outcomes and what drives the predictions.
Qlik Predict runs multiple algorithms in parallel: LightGBM, CatBoost, XGBoost, Random Forest, and a few others, tunes their hyperparameters, and picks the best performer by F1.
On my first run, I left all the columns in the dataset checked, including the team name columns (team_a, team_b). When I looked at the SHAP importance chart afterward, team_b and team_a were ranking as the #2 and #3 most influential features, meaning the model was essentially learning "team X usually wins" rather than learning from the engineered features.
I created a new version, went back to the Data tab, unchecked the team name columns and a few date fields (which were also ranking higher than they should), and re-ran the experiment. Qlik Predict automatically dropped several more low-importance features during training, leaving a clean, focused feature set. The F1 did not change a lot (stayed at ~0.50), but the SHAP chart now showed the model leaning on exactly the signals we want:
elo_diff
rank_diff
is_neutral
h2h_team_a_advantageetc...
A few other calls that mattered:
Filtering to competitive matches only. A friendly between a top side's B squad and a mid-tier opponent tells you almost nothing about what happens in a World Cup group stage game.
Exponential decay on World Cup pedigree. A deep run in 1970 still counts, but less than one in 2022.
Removing rows with too many missing features. FIFA rankings don't go back to the 90s for every team, so some rows had to get dropped.
3. The apply dataset
Training gives you a model and to use it, you need an apply dataset with new rows you want predictions for.
For Choose Your Champion, I generated every possible pairing of the 48 qualified teams, which comes out to 1,128 unique matchups. Each row has the same 27 features as the training dataset, but computed as a current snapshot: each team's Elo today, their current FIFA ranking, their most recent 10-match form, and so on.
I fed that into the deployed model and got back a probability distribution for every matchup: P(team_a_win), P(draw), P(team_b_win).
The web app
The web app is a React front-end that connects to the Qlik tenant over anonymous access via @qlik/api, so users never see a login screen or have to authenticate against a tenant. The bracket UI pulls predictions from the Qlik Sense data model, so whenever a user opens a matchup, they're looking at data straight from Qlik.
For the historical World Cup section, I used a mix of @qlik/embed components when I needed a quick, ready-to-use chart, and custom nebula.js + picasso.js visualizations when I needed more control over the styling to match the app's look and feel. Both approaches work against the same underlying Qlik Analytics app, so everything stays consistent and governed in one place.
A few takeaways
If you're thinking about building something similar, a few things worth keeping in mind:
Spend the time on feature engineering. The difference between a model that predicts noise and one that predicts football is almost entirely in the features. Qlik Predict handles algorithm selection and tuning well, but it can only work with what you feed it.
The integration is where Qlik Predict pays off. Once a model is deployed, scoring a new dataset and pulling scores back into a Qlik Cloud Analytics app takes one load script. No Python services to maintain, no separate MLOps platform to stand up, no JSON plumbing between systems. That end-to-end data prep, modeling, predictions, and analytics all living in one platform is the thing that made this project come together fast!
Go fill out your bracket
The World Cup starts June 11, so there's plenty of time to get your bracket in and earn your spot on the leaderboard before kickoff. If you're curious about how any of this was built, leave a comment or reach out to me directly!
And if you want to learn more about Qlik Predict and start using it, visit:https://www.qlik.com/us/products/qlik-predict
P.S: I have attached both Training and Apply datasets if you'd like to use them in your own Qlik Predict experiment.
Thank you!
...View More
As a follow-up to my previous blog post titled Finance Report with Waterfall Chart, I wanted to share an awesome demo that showcases financial reporting visualizations including a profit & loss statement with a waterfall chart.Qlik'sDennis Jaskowiak andEkaterina Kovalenko, and partner Dawid Marciniak from HighCoordination, created the Financial Analysis demo based off of Jedox data, incorporating many enhancements to the straight table and pivot table. In addition to the waterfall chart, they use inline SVG to create lollipop charts and bar charts in financial statements.
Here is a look at some of the sheets:
The Dashboard provides a high-level overview of profit and loss, cash flow and liquidity. On this sheet, view the use of inline SVG bar charts and lollipop charts.
The P&L sheet provides a more detailed look at profit and loss.
The Cost Center sheet uses the pivot table to show sales costs.
Find a detailed look of cash flow on the Cash Flow sheet.
This is just some of the sheets you will find in the Financial Analysis demo. If you are looking for appealing ways to visual your financial data while keeping it concise and clean, download the Financial Analysis demo (QVF)here.
Thanks,
Jennell
...View More
In this blog post, I will review some data flow processors that can be used to prepare your data in a data flow. Let’s start by quickly reviewing what a data flow is. In Qlik Cloud Analytics, a data flow is a no-code experience that visually allows you to prepare your data with drag and drop capabilities. It is intuitive and easy to use and does not require the user to have scripting experience. Data flow processors, along with sources and targets, are used to build a data flow. Each processor handles a specific data transformation task. Here you will find a full list of the data flow processors available.
This blog will touch base on a few processors to familiarize you with how they work and how easy they are to use. To begin, a data flow must first be created. There is more than one way to do this. From the Qlik Cloud Analytics catalog, click on the + Create new button and select Data flow or navigate to Prepare data from the menu and click on the add Data flow button at the top of the page.
+ Create new menu
+ Create new
Prepare data
MenuData flow
Once you name the new data flow, navigate to the Editor.
On the left, there are sources, processors and targets. The source is the data input, the processors are the data transformation types, and the targets are data outputs. Before we can look at the processors, we need to select our input data from the data catalog or a connection. Once that is in place, we can begin to explore the processor options. There are several data flow processors – too many to review in this blog but I will review three of the them - the Filter processor, the Join processor and the Unpivot processor.
Filter Processor
The filter processor filters data based on a condition. A processor can be added to the data flow canvas by dragging and dropping the processor onto the canvas or by clicking on the menu in the data source and selecting Add processor.
If you drag and drop the processor onto the canvas, you will need to connect the dots between the input and processor. If you add it from your data source menu, the dots will automatically be connected for you.
Each processor has a properties panel where the processor can be configured. In this example, let’s use the filter to select employees who live in the United States. To do this, first select the field to process – Country. There is an option to apply a function but one is not needed in this example.The operator will be equal, and the Value will be United States. Once the properties are entered, click the Apply button to save.
At the bottom of the page, I can preview the script (matching and not matching records) for the filter processor I just applied and see a preview of the data.
From the filter processor menu, there are a few options for my next step as seen below.
Add matching target will add a target to the data flow for the records that match the Country = United States filter. Add non-matching target will add a target to the data flow for the records that do not match the Country = United States filter. Matching and non-matching processors can also be added. For this example, I will add a matching target and in the properties panel, I will select the space, the extension (.qvd, .parquet, .txt or .csv) and the name of the target file. Like the sources, the target can be a data file or connection. Once I click Apply in the properties panel, I will see a message at the top right indicating that my flow is valid and ready to be run. Running the data flow will grab my Employees dataset, filter the data by country and store the results in a QVD named US Employess.
I now have a data file that has been transformed and prepared for use.
Join Processor
Now, let’s look at how we can join two data inputs into one data output. To do this, two data inputs are required. In the example below, ARSummary and ARSummary-1 are the two data inputs.
In the properties panel of the join processor, the join type is selected and the fields that should be used to link the two tables are selected. You can learn more about joins here. Once the target is added, the data flow can be run, and the result will be a single table with the records from the ARSummary table and the associated records from the ARSummary-1 table.
Unpivot Processor
If you are familiar with scripting, the unpivot processor is like a crosstable load. It allows you to rearrange a table so that column data becomes row data. It can transform a table like this:
To this:
Here is an example data flow with the unpivot processor:
In the properties panel of the unpivot processor, there are only a few settings to update. The first is the unpivot fields. Here is where the fields that we want to unpivot are selected. In this example, we want the year to be stored as row level data so we select them all.
The Attribute field name is the name we want to give to the unpivoted fields – in this case Year. The Value field name is the name of the data that is associated with the fields we are unpivoting – in this examples Sales.
After applying the changes and running the data flow, we will have a table transformed based on our specifications without any code.
In this blog post, we touched upon three of the many processors that can be used in a data flow. Note that a data flow can have many sources, processors and targets – it all depends on your needs. The visual interface of a data flow makes it easy to prepare your data without any code in an appealing design that is easy to follow. Try it out!
Thanks,
Jennell
...View More
When building dashboards that involve any kind of leaderboard or competitive comparison, it’s always good to show how rankings shift over time. Not just "who's #1 right now," but the full story: who climbed, who dropped, when the shift happened.
Qlik Sense doesn't have a native bump chart. The usual workaround is a line chart with pre-calculated ranks, but I wanted to push this further and add some more interactivity and options.
The idea for creating this extension came after doing some updates on the Formula1 web app which uses a native D3.js chart, so I wanted to transfer that code over to a Qlik Sense extension that can be reused in other apps.
The extension makes it easy for you. You just add two dimensions and one measure, and it takes care of everything else: ranking, time sorting, labels, hover highlighting, and field selections. The object properties will let you customize it to your needs.
In this post I'll walk through what it does, how it's structured, and how you can use it for various use cases.Github Repo:https://github.com/olim-dev/qlik-bump-chart
What is a Bump Chart?
A bump chart shows how entities change position relative to each other over time. Each entity gets a colored line. Rank #1 sits at the top. As rankings shift, lines cross, and you immediately see who's moving up, who's falling, and when an overtake happens.
What can you do with this extension?
Track rankings over any time dimension (quarters, months, weeks, laps)
Highlight top performers, bottom performers, or biggest movers automatically
Toggle between rank mode (auto-calculated) and position mode (raw measure as Y-axis)
Replay the line-drawing animation
Click labels or lines to make Qlik selections
Customize everything: line style, dot size, colors, labels, grid, tooltips
Use Cases
The pattern is always the same: entities, time periods, and a measure.
Sales: rep leaderboard over months
Marketing: brand awareness tracking, campaign effectiveness over quarters
Finance: fund performance rankings
HR: employee performance trends, team productivity rankings
Operations: supplier quality rankings, efficiency metric evolution
Sports: league standings, player rankings across a season, F1 race position over laps
How to set it up
Add two dimensions and one measure:
Dimension 1: the entity to rank (Product, Sales Rep, Team, Driver)
Dimension 2: the time period (Quarter, Month, Week, Lap)
Measure: the value that determines rank (Sum(Sales), Avg(Score), Max(Position))
I have attached a Text file with some sample datasets that you can inline-load in a new app to test it.
Quick tour of the object properties
The property panel has clear labels for which dimension goes on which axis. Here are the sections that matter most:
Chart Settings: Maximum Entities (2-30, sweet spot is 8-15), Rank Direction (highest or lowest value = #1), Line Style (smooth, straight, step).
Position Mode: Instead of auto-calculating ranks, use the raw measure value as the Y position. Great for race data where position is already known.
Labels: Position them on the right, left, or both sides. Rank change indicators (triangle arrows) show how many spots an entity moved. Clicking a label triggers a Qlik selection.
Highlight: Automatically highlight top N, bottom N, or biggest movers with a configurable glow color.
Colors: Six built-in palettes (Vibrant, Qlik Classic, Category 10, Extended 20, Cool, Warm) plus a custom background color.
Animation: Toggle transitions on/off, adjust duration (100-1500ms), and a "Replay Animation" button to re-run the line-drawing effect.
Selections: Toggle selections on/off
The extension folder structure
qlik-bump-chart/ qlik-bump-chart.qext Extension definitions qlik-bump-chart.js Main entry (Qlik lifecycle, paint, selections) qlik-bump-chart-properties.js Property panel definition qlik-bump-chart-renderer.js D3 rendering engine qlik-bump-chart-data.js Data processing, ranking, time sorting qlik-bump-chart-constants.js Defaults, palettes, timing values qlik-bump-chart-style.css All CSS
lib/ d3.v7.min.js D3.js v7
The main JS handles the Qlik lifecycle.
The data module processes the hypercube, sorts time periods, and calculates ranks.
The renderer draws everything with D3.
The properties file defines the right-panel UI.
The constants file holds all defaults, color palettes, and timing values in one place.
Tips
Limit entities to 8-15 for readability. More than that and lines become hard to follow.
Use Highlight Mode to draw attention to the story (top performers, biggest movers).
Position Mode is great for pre-calculated position data like F1 race results.
Pair with a table or KPI object nearby for exact values at glance.
Let me know in the comments if you have any questions or feedback!
Thanks for reading.
Ouadie
...View More
The write table was introduced to Qlik Cloud Analytics last month so in this blog post, I will review how it works and how it can be added to an app. The write table looks like the straight table but editable columns can be added to it to update or add data. The updated/added data is visible by other users of the app provided they have the correct permissions. Read more on write table permissions here. Something else to note, if using a touch screen device, is you will have to disable touch screen mode for the write table to work. Looking at the write table for the first time, I found it intuitive and easy to use. Let’s create a write table with some editable columns to see how easy it is.
The write table object can be added to a sheet like any other visualization. Once it is added, columns can be added the same way dimensions and measures are added to a straight table. Below is a small write table with course information including the course ID, course name, instructor and location.
To add an editable column from the properties panel, click on the plus sign (+) and select Editable column.
The new editable column will be added. In the properties for the column, the title for the column can be modified and from the show content drop down, manual user input or single selection can be selected. Manual user input will create a free form column that the user can type into. The single selection option will allow me to create a drop-down list of options that the user can choose from.
I will change the title to Course Level and for show content I will select single selection and add three list items by typing the list item and then clicking on the plus sign to add it to the list. The list items will be displayed in the drop-down in the order they are added but can be rearranged by hovering over the list-item and dragging it to the desired position. List-items can also be deleted by hovering over it and clicking the delete icon that appears to the left.
When you come out of edit mode, the message below will appear for the editable column prompting you to define a set of primary keys.
Once you click Define, you will see the pop-up below where you can select the column(s) that will be used for the unique primary key. This is necessary to save and map the data entered in the editable column to the data model. I will select the CourseID column as the primary key.
Once this is done, I will see the Course Level column with the drop-down of list-items I added.
Let’s add one more editable column that takes manual user unput and name it Notes.
As I add data or update the editable columns, the cells will be flagged orange to indicate that my edits have not been saved. Once I save the table, they will be flagged green and any new values entered are visible to other users. A cell will be blue if another user is currently making changes to the row, thus locking it. Changes are saved for 90 days in a change store (temporary storage location) provided by Qlik. After 90 days, the data will be deleted. It is also important to note that if an editable column is deleted, the data will be lost. This is also the case if the primary key used for the editable column is removed.
It is possible to retrieve the changes from a change store via the change-stores API or an automation. Using the REST connection and the change-store API, the changes made in a write table can be retrieved and stored in a QVD (if needed for more than 90 days) or added to the data model for use in other analytics. Qlik Automate can also be used to retrieve data from the change-store using the List Current Changes From Change Store block or the List Change Store History block. From there the data can be stored permanently in an external system for later use or used in the automation for another process. Qlik Help offers steps for retrieving data from a change-store.
The write table can make it easy for users to add updates, feedback and important information that may not be available in the data model. Not only can this be done quickly, but it can be immediately visible to other colleagues. Learn more about the write table in the Product Innovation blog along with links to videos and write table FAQs.
Thanks,
Jennell
...View More