Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Blogs

Announcements
Qlik and ServiceNow Partner to Bring Trusted Enterprise Context into AI-Powered Workflows. Learn More!
cancel
Showing results for 
Search instead for 
Did you mean: 

Design

The Design blog is all about product and Qlik solutions, such as scripting, data modeling, visual design, extensions, best practices, and more!

Product Innovation

By reading the Product Innovation blog, you will learn about what's new across all of the products in our growing Qlik product portfolio.

Support Updates

The Support Updates blog delivers important and useful Qlik Support information about end-of-product support, new service releases, and general support topics.

Qlik Academic Program

This blog was created for professors and students using Qlik within academia.

Community News

Hear it from your Community Managers! The Community News blog provides updates about the Qlik Community Platform and other news and important announcements.

Qlik Digest

The Qlik Digest is your essential monthly low-down of the need-to-know product updates, events, and resources from Qlik.

Qlik Learning

The Qlik Learning blog offers information about the latest updates to our courses and programs, as well as insights from the Qlik Learning team.

Subprocessors List

Qlik Subprocessors General Data Protection Regulation (GDPR).

Japan

Qlik Community blogs for our customers and partners in Japan.

Recent Blog Posts

  • Image Not found

    Design

    DIY your Qlik Answers Experience with the new KB and Assistants APIs

    Qlik Answers transforms unstructured data into clear, AI-powered insights. Today, I'll show you how to integrate Qlik Answers directly into your web app using the newly released Knowledgebases API and Assistants API. In this blog, we'll build a custom Football chat assistant from scratch powered by Qlik Answers. We’ll leverage the Assistants API to power real-time Q&A while the knowledge base is already set up in Qlik Sense. For those of you wh... Show More

    Qlik Answers transforms unstructured data into clear, AI-powered insights. Today, I'll show you how to integrate Qlik Answers directly into your web app using the newly released Knowledgebases API and Assistants API.

    In this blog, we'll build a custom Football chat assistant from scratch powered by Qlik Answers.

    We’ll leverage the Assistants API to power real-time Q&A while the knowledge base is already set up in Qlik Sense.

    For those of you who prefer a ready-made solution, you can quickly embed the native Qlik Answers UI using qlik-embed:

     

    <qlik-embed
      ui="ai/assistant"
      assistant-id="<assistant-id>"
    ></qlik-embed>

     

    You can explore the ai/assistant parameters (and other UIs available in qlik-embed) on qlik.dev, or take a look at some of my previous blog posts here and here.

    For full documentation on the Knowledgebases API and Assistants API, visit qlik.dev/apis/rest/assistants/ and qlik.dev/apis/rest/knowledgebases/.

    Let’s dive in and see how you can take control of your Qlik Answers UI experience!

    What Are Qlik Answers Assistants and Knowledgebases?

    Before we start building our DIY solution, here’s a quick refresher:

    • Knowledgebases: Collections of individual data sources (like HTML, DOCX, TXT, PDFs) that power your Qlik Answers. (In our case, we built the KB in Qlik Sense!)

    • Assistants: The chat interface that interacts with users using retrieval-augmented generation (RAG). With generative AI in the mix, Qlik Answers delivers reliable, linked answers that help drive decision-making.

    DIY the Qlik Answers Experience

    Step 1: Get your data ready

    Since we already created our knowledge base directly in Qlik Sense, we skip the Knowledgebases API. If you’d like to build one from scratch, check out the knowledgebases API documentation.

    Screenshot 2025-02-14 172125.png

    Step 2: Configure your assistant

    With your knowledge base set, you create your assistant using the Assistants API. This is where the magic happens: you can manage conversation starters, customize follow-ups, and more. Visit the assistants API docs on qlik.dev. to learn more

    Step 3: Build Your Custom UI

    Now, let’s look at our custom chat UI code. We'll built a simple football-themed chat interface that lets users ask questions related to the NFL. The assistant’s answers stream in seamlessly to the interface.

    Screenshot 2025-02-14 171644.png

    HTML:

     

    <!doctype html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Football Assistant</title>
        <link rel="stylesheet" href="styles.css" />
      </head>
      <body>
        <div class="chat-container">
          <div class="chat-header">
            <h4>Let's talk Football</h4>
            <span class="header-span">You ask, Qlik answers.</span>
          </div>
    
          <div class="chat-body" id="chat-body">
            <div class="message assistant">
              <div class="bubble">
                <p>Hey there, champ! Ask me anything.</p>
              </div>
            </div>
          </div>
          <div class="chat-footer">
            <input
              type="text"
              id="chat-input"
              placeholder="Type your Football related question..."
            />
            <button id="send-btn">Send</button>
          </div>
        </div>
        <script src="scripts.js"></script>
      </body>
    </html>

     

    Frontend JS:

     

    document.addEventListener("DOMContentLoaded", () => {
      const chatBody = document.getElementById("chat-body");
      const chatInput = document.getElementById("chat-input");
      const sendButton = document.getElementById("send-btn");
    
      // Append a user message immediately
      function appendUserMessage(message) {
        const messageDiv = document.createElement("div");
        messageDiv.classList.add("message", "user");
        const bubbleDiv = document.createElement("div");
        bubbleDiv.classList.add("bubble");
        bubbleDiv.innerHTML = `<p>${message}</p>`;
        messageDiv.appendChild(bubbleDiv);
        chatBody.appendChild(messageDiv);
        chatBody.scrollTop = chatBody.scrollHeight;
      }
    
      // Create an assistant bubble that we update with streaming text
      function createAssistantBubble() {
        const messageDiv = document.createElement("div");
        messageDiv.classList.add("message", "assistant");
        const bubbleDiv = document.createElement("div");
        bubbleDiv.classList.add("bubble");
        bubbleDiv.innerHTML = "<p></p>";
        messageDiv.appendChild(bubbleDiv);
        chatBody.appendChild(messageDiv);
        chatBody.scrollTop = chatBody.scrollHeight;
        return bubbleDiv.querySelector("p");
      }
    
      // Send the question to the backend and stream the answer
      function sendQuestion() {
        const question = chatInput.value.trim();
        if (!question) return;
    
        // Append the user's message
        appendUserMessage(question);
        chatInput.value = "";
    
        // Create an assistant bubble for the answer
        const assistantTextElement = createAssistantBubble();
    
        // Open a connection to stream the answer
        const eventSource = new EventSource(
          `/stream-answers?question=${encodeURIComponent(question)}`
        );
    
        eventSource.onmessage = function (event) {
          if (event.data === "[DONE]") {
            eventSource.close();
          } else {
            assistantTextElement.innerHTML += event.data;
            chatBody.scrollTop = chatBody.scrollHeight;
          }
        };
    
        eventSource.onerror = function (event) {
          console.error("EventSource error:", event);
          eventSource.close();
          assistantTextElement.innerHTML += " [Error receiving stream]";
        };
      }
    
      sendButton.addEventListener("click", sendQuestion);
      chatInput.addEventListener("keydown", (event) => {
        if (event.key === "Enter") {
          event.preventDefault();
          sendQuestion();
        }
      });
    });

     

    Backend node.js script:

     

    import express from "express";
    import fetch from "node-fetch";
    import path from "path";
    import { fileURLToPath } from "url";
    
    // Setup __dirname for ES modules
    const __filename = fileURLToPath(import.meta.url);
    const __dirname = path.dirname(__filename);
    
    // Define port and initialize Express app
    const PORT = process.env.PORT || 3000;
    const app = express();
    app.use(express.static("public"));
    app.use(express.json());
    
    // Serve the frontend
    app.get("/", (req, res) => {
      res.sendFile(path.join(__dirname, "public", "index.html"));
    });
    
    // Endpoint to stream Qlik Answers output
    app.get("/stream-answers", async (req, res) => {
      const question = req.query.question;
      if (!question) {
        res.status(400).send("No question provided");
        return;
      }
    
      // Set headers for streaming response
      res.writeHead(200, {
        "Content-Type": "text/event-stream",
        "Cache-Control": "no-cache",
        Connection: "keep-alive",
      });
    
      const assistantId = "b82ae7a9-9911-4830-a4f3-f433e88496d2";
      const baseUrl = "https://sense-demo.us.qlikcloud.com/api/v1/assistants/";
      const bearerToken = process.env["apiKey"];
    
      try {
        // Create a new conversation thread
        const createThreadUrl = `${baseUrl}${assistantId}/threads`;
        const threadResponse = await fetch(createThreadUrl, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${bearerToken}`,
          },
          body: JSON.stringify({
            name: `Conversation for question: ${question}`,
          }),
        });
    
        if (!threadResponse.ok) {
          const errorData = await threadResponse.text();
          res.write(`data: ${JSON.stringify({ error: errorData })}\n\n`);
          res.end();
          return;
        }
    
        const threadData = await threadResponse.json();
        const threadId = threadData.id;
    
        // Invoke the Qlik Answers streaming endpoint
        const streamUrl = `${baseUrl}${assistantId}/threads/${threadId}/actions/stream`;
        const invokeResponse = await fetch(streamUrl, {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${bearerToken}`,
          },
          body: JSON.stringify({
            input: {
              prompt: question,
              promptType: "thread",
              includeText: true,
            },
          }),
        });
    
        if (!invokeResponse.ok) {
          const errorData = await invokeResponse.text();
          res.write(`data: ${JSON.stringify({ error: errorData })}\n\n`);
          res.end();
          return;
        }
    
        // Process and stream the response text
        const decoder = new TextDecoder();
        for await (const chunk of invokeResponse.body) {
          let textChunk = decoder.decode(chunk);
          let parts = textChunk.split(/(?<=\})(?=\{)/);
          for (const part of parts) {
            let trimmedPart = part.trim();
            if (!trimmedPart) continue;
            try {
              const parsed = JSON.parse(trimmedPart);
              if (parsed.output && parsed.output.trim() !== "") {
                res.write(`data: ${parsed.output}\n\n`);
              }
            } catch (e) {
              if (trimmedPart && !trimmedPart.startsWith('{"sources"')) {
                res.write(`data: ${trimmedPart}\n\n`);
              }
            }
          }
        }
        res.write("data: [DONE]\n\n");
        res.end();
      } catch (error) {
        res.write(`data: ${JSON.stringify({ error: error.message })}\n\n`);
        res.end();
      }
    });
    
    // Start the backend server
    app.listen(PORT, () => {
      console.log(`Backend running on port ${PORT}`);
    });

     

    Breaking It Down

    Okay, that was a lot of code! Let’s break it down into bite-sized pieces so you can see exactly how our custom Qlik Answers chat interface works.

    1. The HTML

    Our index.html creates a custom chat UI. It sets up:

    • A chat body where messages appear (initially with a friendly greeting from the assistant).
    • A chat footer with an input field and a send button for users to type their questions.

    2. The Frontend JavaScript (scripts.js)

    This script handles the user interaction:

    • Appending messages: When you type a question and hit send (or press Enter), your message is added to the chat window.

    • Creating chat bubbles: It creates separate message bubbles for you (the user) and the assistant.

    • Streaming the answer: It opens a connection to our backend so that as soon as the assistant’s response is ready, it streams into the assistant’s bubble. This gives you a live, real-time feel without any manual “typing” effect.

    3. The Node.js Backend (index.js)

    Our backend does the heavy lifting:

    • Creating a conversation thread: It uses the Assistants API to start a new thread for each question.

    • Invoking the streaming endpoint: It then sends your question to Qlik Answers and streams the response back.

    • Processing the stream: As chunks of text come in, the backend cleans them up—splitting any concatenated JSON and only sending the useful text to the frontend.

    • Closing the stream: Once the complete answer is sent, it signals the end so your chat bubble doesn’t wait indefinitely.

    4. How It All Connects

    When you send a question:

    • Your message is displayed immediately in your custom chat bubble.

    • The backend creates a thread and requests an answer from Qlik Answers.

    • The response is streamed back to your UI in real time, making it look like the assistant is typing out the answer as it arrives.

    P.S: this is just a simple example to introduce you to the new Answers APIs and show you how to get started using them, you'll need to double check limitations and adhere to best practices when using the APIs in a production environment. 

    Screenshot 2025-02-14 173049.png

    You can find the full code here:
    https://replit.com/@ouadielimouni/QA-Test-APIs#public/index.html

     

    Happy coding - and, Go Birds 🦅!

    Show Less
  • Image Not found

    Support Updates

    Qlik Sense Enterprise for Windows - New Security Patches Available Now

    Edited December 5th: identified upgrades leading to complications with extensionsEdited December 6th: added workaround for extension complicationEdited December 10th: added CVEs (CVE-2024-55579 and CVE-2024-55580)Edited December 12th, noon CET: added new patch versions and visualization and extension fix details; previous patches were removed from the download site Hello Qlik Users, New patches have been made available and have replaced the orig... Show More

    Edited December 5th: identified upgrades leading to complications with extensions
    Edited December 6th: added workaround for extension complication
    Edited December 10th: added CVEs (CVE-2024-55579 and CVE-2024-55580)
    Edited December 12th, noon CET: added new patch versions and visualization and extension fix details; previous patches were removed from the download site

    Hello Qlik Users,

    New patches have been made available and have replaced the original six releases. They include the original security fixes (CVE-2024-55579 and CVE-2024-55580) as well as QB-30633 to resolve the extension and visualization defect.

    If you continue to experience issues with extensions or visualizations, see QB-30633: Visualizations and Extensions not loading after applying patch.

    Security issues in Qlik Sense Enterprise for Windows have been identified, and patches have been made available. Details can be found in Security Bulletin High Severity Security fixes for Qlik Sense Enterprise for Windows (CVE-2024-55579 and CVE-2024-55580).

    Today, we have released six service releases across the latest versions of Qlik Sense to patch the reported issue. All versions of Qlik Sense Enterprise for Windows prior to and including these releases are impacted:

    • May 2024 Patch 9
    • February 2024 Patch 13
    • November 2023 Patch 15
    • August 2023 Patch 15
    • May 2023 Patch 17
    • February 2023 Patch 14

     

    No workarounds can be provided. Customers should upgrade Qlik Sense Enterprise for Windows to a version containing fixes for these issues. November 2024 IR, released on the 26th of November, contains the fix as well

    • November 2024 Initial Release
    • May 2024 Patch 10 or 11 (both valid)
    • February 2024 Patch 14 or 15 (both valid)
    • November 2023 Patch 16 or 17 (both valid)
    • August 2023 Patch 16 or 17 (both valid)
    • May 2023 Patch 18 or 19 (both valid)
    • February 2023 Patch 15 or 16 (both valid)
    This issue only impacts Qlik Sense Enterprise for Windows. Other Qlik products including Qlik Cloud and QlikView are NOT impacted.

    All Qlik software can be downloaded from our official Qlik Download page (customer login required). Follow best practices when upgrading Qlik Sense.

    The information in this post and Security Bulletin High Severity Security fixes for Qlik Sense Enterprise for Windows (CVE-2024-55579 and CVE-2024-55580) are disclosed in accordance with our published Security and Vulnerability Policy.

     

    The Security Notice label is used to notify customers about security patches and upgrades that require a customer’s action. Please subscribe to the ‘Security Notice’ label to be notified of future updates. 

    Thank you for choosing Qlik,
    Qlik Global Support

    Show Less
  • qlik-community-blogs.jpg

    Design

    Recipe for a Pareto Analysis – Revisited

    “Which products contribute to the first 80% of our turnover?”
  • Image Not found

    Qlik Learning

    Get Ready. A New Qlik Learning Experience is Coming!

      It’s convenient, extensive, and unlimited. The new Qlik Learning a single, integrated learning platform designed to enhance your learning experience and help you get the most out of Qlik.
  • Image Not found

    Qlik Learning

    The New Qlik Learning Is Here!

    It’s convenient, extensive, and unlimited  Get Started with the new Qlik Learning today!
  • Image Not found

    Support Updates

    Qlik Application Automation and Slack: Breaking changes November 12, 2025

    Slack has updated the deprecation date to November 12th, 2025 (originally March 11th). Starting November 12th, 2025, Slack will enforce changes in their APIs affecting file uploads. To accommodate these breaking changes, we have introduced new blocks in the Slack connector for Qlik Application Automation. What blocks are affected? Upload File To Channel (new version) Send Text Based file (new version) Send Binary File (deprecated) What exactly ... Show More
    Slack has updated the deprecation date to November 12th, 2025 (originally March 11th).

    Starting November 12th, 2025, Slack will enforce changes in their APIs affecting file uploads. To accommodate these breaking changes, we have introduced new blocks in the Slack connector for Qlik Application Automation.

    What blocks are affected?

    • Upload File To Channel (new version)
    • Send Text Based file (new version)
    • Send Binary File (deprecated)

    What exactly is changing for Qlik Application Automation?

    The Send Binary File block will be deprecated. Instead, use the Upload File to Channel block to upload binary files. If you still want to send a base64 encoded string, use the Send Text Based File block and configure the encoding parameter to base64.

    The Upload File To Channel block and Send Text Based File block need to be updated to a new version. To perform this update, replace existing blocks with new blocks by dragging the blocks from the block library.

    What will I need to do to mitigate this?

    Any automation using affected blocks needs to be updated. 

    See Breaking changes for file support in the Slack connector: new blocks introduced for steps and details.

     

    Thank you for choosing Qlik,
    Qlik Support

     

    Show Less
  • Image Not found

    Qlik Academic Program

    India update: Data and AI related roles will dominate in 2025

    Indian IT hiring landscape is at a pivotal juncture as it transitions from a year of decline towards a more hopeful future. The focus on specialised skills, particularly in AI and data science, combined with geographical shifts towards Tier 2 cities, indicates a transformation within the sector. While the IT hiring landscape in India in 2024 was marked by delayed onboarding and a decline in overall hiring activity, the outlook for 2025 appears pr... Show More

    Indian IT hiring landscape is at a pivotal juncture as it transitions from a year of decline towards a more hopeful future. The focus on specialised skills, particularly in AI and data science, combined with geographical shifts towards Tier 2 cities, indicates a transformation within the sector. While the IT hiring landscape in India in 2024 was marked by delayed onboarding and a decline in overall hiring activity, the outlook for 2025 appears promising with expectations of recovery and growth fuelled by improvements in economic conditions and technological advancements.

     
    If you are a student or an educator, looking to get skilled in data analytics, leverage resources of the 
    Qlik Academic Program and get training, software, qualifications and certifications completely free!
    Show Less
  • Image Not found

    Support Updates

    Techspert Talks - Advanced Qlik Sense System Monitoring

        Opens in new window PDF Download Word Download Excel Download PowerPoint Download Document Download       Opens in new window PDF Download Word Download Excel Download PowerPoint Download Document Download  
  • Image Not found

    Design

    Another ValueList Use Case

    Several years ago, I blogged about how creating a synthetic dimension using ValueList allowed us to color dimensions in a chart. ValueList is commonly used where there is not a dimension in the data model to use, thus creating a synthetic one with ValueList. You can read more about ValueList in myprevious blog post. In this blog post, I am going to share how I used ValueList to handle omitted dimension values in a chart. I recently ran into a sce... Show More

    Several years ago, I blogged about how creating a synthetic dimension using ValueList allowed us to color dimensions in a chart. ValueList is commonly used where there is not a dimension in the data model to use, thus creating a synthetic one with ValueList. You can read more about ValueList in myprevious blog post. In this blog post, I am going to share how I used ValueList to handle omitted dimension values in a chart.

    I recently ran into a scenario when creating visualizations based on survey data. In the survey, the participant was asked for their age as well as their age group. The ages were grouped into the following buckets:

    • Under 18
    • 18-24
    • 25-34
    • 35-44
    • 45-54
    • 55-69
    • 70+

     

    Once I loaded the data, I realized that there were not participants for all the age groups, so my chart looked like the bar chart below. There was a bar and value for only the age groups that the participants fit in.

    before.png

    While I could leave the chart like this, I wanted to show all the age group buckets in the chart so that it was evident that there were no participants (0%) in the other age group buckets. In this example, the four age groups were consecutive, so it did not look odd to leave the chart as is but imagine if there were no participants in the 45-54 age bucket. The chart may look odd with the gap between 44 and 55.

    gap.png

    I explored various ways to handle this. One way was to add rows to the respective table for the missing age group. This worked fine but I was not a fan of adding rows to the survey table that were not related to a specific participant. The option that I settled on was using ValueList to add the omitted age groups. While this option works well, it can lead to lengthy expressions for the measures. In this example, there were only seven age group buckets so it was manageable but if you had many dimensions values then it may not be the best option.

    To update the bar chart using ValueList, I changed the dimension from

    dimension before.png

    To

    dimension after.png

     

    Then I changed the measure from

    measure before.png

     

    To

    measure after.png

     

    Using ValueList in the dimension created a synthetic dimension with each age group option that was included in the survey. Now I will see all the age buckets in the chart even if there were no participants that fell in the age group bucket. Since I am using ValueList for the dimension, I need to update the measure to use it as well. This is where a single line measure can become a lengthier measure because I need to create a measure for every value in the synthetic dimension, thus the nested if statement above. The result looks like this:

    final.png

    There are no gaps in the age buckets, and we can see all the age bucket options that were presented in the survey. I prefer this chart over the first bar chart I shared because I have a better understanding of the survey responses presented to the participants as well as the response they provided. I would be interested in hearing how others have handled similar scenarios.

    Thanks,

    Jennell

     

     

     

    Show Less
  • qlik-community-blogs.jpg

    Product Innovation

    Qlik Talend Cloud Packaging and Pricing - A primer

    Technology leaders, practitioners and business leaders alike, all intrinsically recognize the value of data to inform decisions and actions to drive growth and operational efficiency within their organizations. However, many have historically struggled to align the scale and timing of their investments in technology with the expected business outcomes. With the general availability of Qlik Talend Cloud in July 2024, we delivered a solution that e... Show More

    Technology leaders, practitioners and business leaders alike, all intrinsically recognize the value of data to inform decisions and actions to drive growth and operational efficiency within their organizations. However, many have historically struggled to align the scale and timing of their investments in technology with the expected business outcomes.

    With the general availability of Qlik Talend Cloud in July 2024, we delivered a solution that effectively addresses this need and allows organizations to plan and execute data-driven business transformations with confidence.

    Here is a quick overview of Qlik Talend Cloud's Packaging and Pricing.

    Show Less
  • Image Not found

    Product Innovation

    Introducing Qlik Trust Score: Elevating Data Trustworthiness in Qlik Talend Clou...

    To evaluate trust in data, organizations need a metric-driven, objective measure that can be tuned to meet their specific definitions of data quality. A flexible and transparent approach ensures organizations can adapt trust assessments to their unique operational data quality needs. Read this blog to learn how Qlik Trust Score in Qlik Talend Cloud can help.
  • Image Not found

    Qlik Academic Program

    DHBW Mannheim & Qlik: Empowering Future Leaders with Data Literacy

    🚀 DHBW Mannheim is transforming education with hands-on data literacy! Through the Qlik Academic Program, students master real-world data analysis and visualization—boosting their career prospects in today’s data-driven world. See how this program is shaping future leaders!
  • qlik-community-blogs.jpg

    Product Innovation

    Dynamic Engine: The New Standard for Distributed Data Processing in Qlik Talend

    Qlik's Dynamic Engine, natively integrated with Kubernetes (K8s), revolutionizes data processing with unmatched scalability, automation, and unified workflows. Supporting on-premise, hybrid, and SaaS environments, it offers flexibility for modern enterprises. Key features include Kubernetes-driven scalability, seamless migration from Remote Engines, and automated updates via a built-in versioning system. By optimizing resource allocation and unif... Show More

    Qlik's Dynamic Engine, natively integrated with Kubernetes (K8s), revolutionizes data processing with unmatched scalability, automation, and unified workflows.

    Supporting on-premise, hybrid, and SaaS environments, it offers flexibility for modern enterprises. Key features include Kubernetes-driven scalability, seamless migration from Remote Engines, and automated updates via a built-in versioning system.

    By optimizing resource allocation and unifying workflows across the Qlik Talend Cloud, Dynamic Engine delivers a future-ready solution for large-scale data integration and processing needs.

    Show Less
  • qlik-community-blogs.jpg

    Explore Qlik Gallery

    Financiamento Apartamento e Despesas

    Financiamento Apartamento e DespesasPersonalApplication for financial organizationDiscoveriesSet AnalysisImpactOrganizationAudienceAdministratorData and advanced analyticsFinanças
  • Image Not found

    Design

    Exploring the new Navigation Menu object

    The new Navigation Menu object in Qlik allows for a flexible and easy way to add a menu to your Qlik Sense apps. Whether you're designing an app in Qlik Sense or embedding Qlik capabilities into a web platform, you should make this new object your go-to solution for organized and stylish navigation. In this blog post, we'll explore into the new Navigation Menu object, its features, customization options, embedding capabilities, and key considerat... Show More

    The new Navigation Menu object in Qlik allows for a flexible and easy way to add a menu to your Qlik Sense apps. Whether you're designing an app in Qlik Sense or embedding Qlik capabilities into a web platform, you should make this new object your go-to solution for organized and stylish navigation.

    In this blog post, we'll explore into the new Navigation Menu object, its features, customization options, embedding capabilities, and key considerations for getting the most out of it. For a quick overview, check out the SaaS in 60 video below:

     

    Navigation Menu in Qlik Sense Apps

    Up until now, navigation in your apps has been limited to the following options:

    1. Navigating through the built in Sheets tab in the assets panel
      nav-1.png
    2. Custom built extensions
    3. Or, in-app, using existing objects:
      • Using buttons:

        nav-2.png
      • Using the layout container in addition to buttons to create custom sidebars:

        nav-3.png                       nav-4.png

    The new Navigation Menu object enhances your Qlik Sense app usability and makes it easier to achieve similar results faster tailored to your needs


    nav-5.png


    Key Features:

    • Sheet Organization: Automatically arranges sheets and groups into a hierarchy for intuitive navigation.
    • Flexible Layouts: Choose from vertical, horizontal, or drawer-style menus, adapting to your app’s design needs.
    • Custom Styling: Personalize fonts (family, size, weight, and color), background images, align items, and hover and highlight effects. You can also toggle icons or resize the buttons.
    • Mobile-Optimized: Enable a list view for seamless navigation on mobile devices.
    • Integration-Friendly: Pair with "sheet title off" and selection bar for a minimalistic yet functional design.

      nav-6.png                           nav-7.png

    You can toggle the "App Navigation bar > Navigation" or "Sheet Header" option to OFF in the UI settings and have the Navigation Menu object replace your traditional Sheets for a more minimalistic look.

    nav-8.png


    👀 You can see the Navigation Menu object in action on the What’s New App:
    https://explore.qlik.com/app/4911b1af-2f3c-4d8a-9fd5-1de5b04d195c

     

    Navigation Menu embedded in your Web Apps

    For developers looking to incorporate Qlik analytics into their web applications, the Navigation Menu object can save time when developing a custom sheet navigation. You can easily embed the navigation menu object and customize it to meet your needs. (Learn more here)

    How to Embed the Navigation Menu

    Here’s a simple example of embedding a horizontal navigation menu in your web app using Nebula.js.

    You can read more about Embedding and access the full documentation on qlik.dev:

     

    const nuked = window.stardust.embed(app, {
      context: { theme: "light" },
      types: [
        {
          name: "sn-nav-menu",
          load: () => Promise.resolve(window["sn-nav-menu"]),
        },
      ],
    });
    
    nuked.render({
      type: "sn-nav-menu",
      element: document.querySelector(".menu"),
      properties: {
        layoutOptions: {
          orientation: "horizontal",
          alignment: "top-center",
        },
      },
    });
    
    

     

     

    Advanced Customization

    Using JSON properties, you can customize the navigation menu extensively:

    • Adjust the orientation, alignment, and layout.
    • Add drawer functionality for compact navigation.
    • Style hover and highlight effects, font colors, and background images.
    • Align menu items to the left, center, or right for a consistent look.

    These capabilities make the Navigation Menu a versatile tool for developers working on embedded analytics projects.

     

    nuked.render({
      type: "sn-nav-menu",
      element: document.querySelector(".menu"),
      properties: {
        "layoutOptions": {
          "drawerMode": false,
          "hideDrawerIcon": false,
          "orientation": "horizontal",
          "layout": "fill",
          "alignment": "top-center",
          "separateItems": false,
          "dividerColor": {
            "color": "rgba(0,0,0,0.12)",
            "index": -1
          },
          "largeItems": false,
          "showItemIcons": false
        },
        "components": [
          {
            "key": "general"
          },
          {
            "key": "theme",
            "content": {
              "fontSize": "18px",
              "fontStyle": {
                "bold": true,
                "italic": false,
                "underline": false,
                "normal": true
              },
              "defaultColor": {
                "index": 15,
                "color": "#000000",
                "alpha": 1
              },
              "defaultFontColor": {
                "color": "#ffffff",
                "alpha": 1
              },
              "highlightColor": {
                "index": -1,
                "color": "#3ba63b",
                "alpha": 1
              },
              "highlightFontColor": {
                "color": "#ffffff",
                "alpha": 1
              },
              "hoverColor": {
                "index": -1,
                "color": "#ffa82e",
                "alpha": 1
              },
              "borderRadius": "20px"
            }
          }
        ]
      },
      navigation: sheetObject.navigation,
    });

     

     

    Things to watch out for

    While the Navigation Menu object is a fantastic addition, there are some key points to consider:

    1. Content Security Policy (CSP): If you use background images from external URLs, ensure their origins are added to your tenant’s CSP allowlist. This step is essential for compliance and functionality.
    2. Hierarchy Management: Group sheets effectively in your Qlik app to create a logical navigation structure.
    3. Mobile Responsiveness: Test the menu thoroughly on various devices to ensure an optimal user experience, especially when using the list view.
    4. Design Consistency: Align the menu’s styling with the rest of your app for a unified look and feel.

     

    Show Less
  • qlik-community-blogs.jpg

    Explore Qlik Gallery

    Anonymized Benchmarking

    Anonymized BenchmarkingSiemensThe goal of this app is to be able to track your country's financial KPIs against other country's without breaching data privacy rules. As such, you can see all KPI values but only the country to which you have access is revealed, while others are represented by a randomized tag.DiscoveriesYou can leverage section access to anonymize field values.ImpactAllows users to get a view of the whole environment without breac... Show More
    Show Less
  • Image Not found

    Support Updates

    Watch Q&A with Qlik: App Development!

          Opens in new window PDF Download Word Download Excel Download PowerPoint Download Document Download  
  • Image Not found

    Qlik Academic Program

    Meet the Qlik Academic Program Educator Ambassadors for 2025

    The Qlik Academic Program is proud to announce our 2025 class of Educator Ambassadors. Academic Program Ambassadors are educators who champion the Qlik Academic Program at their universities and beyond, with a passion for preparing students for the data driven workplace.   These individuals are some of our most active participants of the Qlik Academic Program who fully utilize the free software, training resources and qualifications that we provi... Show More
    The Qlik Academic Program is proud to announce our 2025 class of Educator Ambassadors. Academic Program Ambassadors are educators who champion the Qlik Academic Program at their universities and beyond, with a passion for preparing students for the data driven workplace.
     
    These individuals are some of our most active participants of the Qlik Academic Program who fully utilize the free software, training resources and qualifications that we provide to university students and educators. The members of our 2025 class are:
     
    Marcin Stawarz
     
    Blerim Emruli
     
    Javier Leon
     
    Angelika Klidas
     
    Dr K Kalaiselvi
     
    Angel R Monjarás
     
    Daniel E. O'Leary
     
    Alexander Flaig
     
    Chee-wai Ho
     
    Dr. Manikandan Sundaram
     
    Katherine Taylor Pearson
     
    Terrence Perera
     
    Darshan Sagar
     
    Juana Ines Zuntini
     
    Marisa Sánchez
     
     
    We are thrilled to be recognizing the efforts of these individuals to help the Qlik Academic Program to achieve its mission - to create a data literate world, one student at a time. Each ambassador has been selected through a self-nominated application process, where they were required to answer various questions covering their motivations for becoming an ambassador, and to evidence their passion for upskilling their students in analytics over the past 12 months. This year, we are excited to select 15 ambassadors, 7 new ones and 8 returning ambassadors whose efforts continued to impress us. To thank them for their efforts, our ambassadors will receive exclusive benefits such as webinars and discussion groups with Qlik leaders, opportunities to showcase their experience with the Qlik Academic Program and the chance to grow their network with other educators across various fields and geographies.
     
    Throughout 2025 our ambassadors will continue their advocacy for the Qlik Academic Program and help us to reach even more students and educators with our free resources. Stay tuned over the coming months for more in-depth profiles on each of our ambassadors, and get to know who they are, what they teach and why they are so passionate about bridging the data literacy skills gap! Learn more about the Ambassador Program and how to apply for future classes.
    Show Less
  • Image Not found

    Product Innovation

    Introducing no-code data preparation in Qlik Cloud Analytics

    It's time to ditch the data drama and make data prep easy for everyone. It's time to let it flow with Data Flow. 
  • qlik-community-blogs.jpg

    Community News

    Analytic Forums Navigation Updates and Improvements

    Enhancing your Qlik Community experience - Analytic Forums navigation updates and improvements!