> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open-metadata.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Qlik Sense Connector | OpenMetadata Integration Guide

> Connect QlikSense dashboards to OpenMetadata with our comprehensive connector guide. Step-by-step setup, configuration, and metadata extraction instructions.

export const MetadataIngestionUi = ({connector, selectServicePath, addNewServicePath, serviceConnectionPath}) => {
  return <>
    <p>
      To ingest metadata from your sources, you need to create a service connection.
      The service connects your source system with OpenMetadata. Once you create
      a service, you can use it to configure your ingestion workflows.<br />
      <br />
      To create a service connection and ingest your metadata, follow the steps below:
    </p>
      <Steps>
      <Step title="Select the Service">
        <ol>
          <li>
            On the left navigation bar, click <strong>Settings</strong>.
          </li>
          <li>
            On the next page, click <strong>Services</strong>, and then select the service.
            <img src="/public/images/connectors/visit-services-page.png" alt="Visit Services Page" />
          </li>
        </ol>
      </Step>

      <Step title="Create a New Service">
        To add a new service connection, click <strong>Add New Service</strong>.
        <img src="/public/images/connectors/create-new-service.png" alt="Create a new Service" />
      </Step>

      <Step title="Select the Connector">
        Select <strong>{connector}</strong> as the service type and click <strong>Next</strong>.

        {selectServicePath && <img src={selectServicePath} alt="Select Service" />}
      </Step>

      <Step title="Name and Describe the Service">
        Enter a unique <strong>Service Name</strong> and <strong>Description</strong>.
        <ul>
         <li><strong>Service Name</strong>: OpenMetadata identifies services by their service name. Enter a name that distinguishes this deployment from other services, including other {connector} services you are ingesting metadata from.</li>
        </ul>

        <Note>
          The service name cannot be changed after it is set.
       </Note>

        {addNewServicePath && <img src={addNewServicePath} alt="Add New Service" />}
      </Step>

      <Step title="Configure the Service Connection">
        Set up the connection settings required for {connector} to set up the service and start ingesting metadata from your sources. The right-hand panel displays help documentation for the selected connection type in the product UI.
        {serviceConnectionPath && <img src={serviceConnectionPath} alt="Configure Service connection" />}
      </Step>
    </Steps>
  </>;
};

export const ConnectorDetailsHeader = ({name, icon, stage, availableFeatures, unavailableFeatures = [], availableFeaturesCollate = []}) => {
  const showSubHeading = availableFeatures?.length > 0 || unavailableFeatures?.length > 0 || availableFeaturesCollate?.length > 0;
  const totalAvailableFeatures = [...availableFeatures || [], ...availableFeaturesCollate || []];
  return <div className="container">
      <div className="Heading">
        <div className="flex items-center gap-3">
          {icon && <div className="IconContainer">
              <img src={icon} alt={name} noZoom className="ConnectorIcon" />
            </div>}
          <h1 className="ConnectorName">{name}</h1>
          <span className={`StageBadge ${stage === 'PROD' ? 'prod' : 'beta'}`}>
            {stage}
          </span>
        </div>
      </div>
      {showSubHeading && <div className="SubHeading">
          <div className="FeaturesHeading">Feature List</div>
          <div className="FeaturesList">
            {totalAvailableFeatures.map(feature => <div className="FeatureTag AvailableFeature" key={feature}>
                ✓ {feature}
              </div>)}
            {unavailableFeatures.map(feature => <div className="FeatureTag UnavailableFeature" key={feature}>
                ✕ {feature}
              </div>)}
          </div>
        </div>}
    </div>;
};

<ConnectorDetailsHeader icon="/public/images/connectors/qliksense.webp" name="Qlik Sense" stage="PROD" availableFeatures={["Dashboards", "Charts", "Datamodels", "Lineage", "Column Lineage"]} unavailableFeatures={["Owners", "Tags", "Projects"]} />

In this section, we provide guides and references to use the Qlik Sense connector.
Configure and schedule Metabase metadata and profiler workflows from the OpenMetadata UI:

* [Requirements](#requirements)
* [Metadata Ingestion](#metadata-ingestion)
* [Enable Security](#securing-qlik-sense-connection-with-ssl-in-openmetadata)
* [Lineage](#lineage)
* [Troubleshooting](/v1.12.x/connectors/dashboard/qliksense/troubleshooting)

## Requirements

<Card title="OpenMetadata 1.1.1 or later" href="/v1.12.x/deployment">
  To deploy OpenMetadata, check the Deployment guides.
</Card>

## Metadata Ingestion

<MetadataIngestionUi connector={"QlikSense"} selectServicePath={"/public/images/connectors/qliksense/select-service.png"} addNewServicePath={"/public/images/connectors/qliksense/add-new-service.png"} serviceConnectionPath={"/public/images/connectors/qliksense/service-connection.png"} />

# Connection Details

<Steps>
  <Step title="Connection Details">
    <Tip>
      When using a **Hybrid Ingestion Runner**, any sensitive credential fields—such as passwords, API keys, or private keys—must reference secrets using the following format:

      ```
      password: secret:/my/database/password
      ```

      This applies **only to fields marked as secrets** in the connection form (these typically mask input and show a visibility toggle icon).
      For a complete guide on managing secrets in hybrid setups, see the [Hybrid Ingestion Runner Secret Management Guide](https://docs.getcollate.io/getting-started/day-1/hybrid-saas/hybrid-ingestion-runner#3.-manage-secrets-securely).
    </Tip>

    * **Qlik Sense Base URL**: This field refers to the base url of your Qlik Sense Portal, will be used for generating the redirect links for dashboards and charts. Example: `https://server.domain.com` or `https://server.domain.com/<proxy-path>`
    * **Qlik Engine JSON API Websocket URL**: Enter the websocket url of Qlik Sense Engine JSON API. Refer to [this](https://help.qlik.com/en-US/sense-developer/May2023/Subsystems/EngineAPI/Content/Sense_EngineAPI/GettingStarted/connecting-to-engine-api.htm) document for more details about. Example: `wss://server.domain.com:4747` or `wss://server.domain.com[/virtual proxy]`.
      Since we use the Qlik Sense Engine APIs, we need to authenticate to those APIs using certificates generated on Qlik Management Console.
      **Qlik Certificate By Values**: In this approach we provide the content of the certificates to the relevant field.
    * **Client Certificate Value**: This field specifies the value of `client.pem` certificate required for authentication.
    * **Client Key Certificate Value**: This field specifies the value of `client_key.pem` certificate required for authentication.
    * **Root Certificate Value**: This field specifies the value of `root.pem` certificate required for authentication.
    * **Staging Directory Path**: This field specifies the path to temporary staging directory, where the certificates will be stored temporarily during the ingestion process, which will de deleted once the ingestion job is over.
      when you are using this approach make sure you are passing the key in a correct format. If your certificate looks like this:

    ```
    -----BEGIN CERTIFICATE-----
    MII..
    MBQ...
    CgU..
    8Lt..
    ...
    h+4=
    -----END CERTIFICATE-----
    ```

    You will have to replace new lines with `\n` and the final private key that you need to pass should look like this:

    ```
    -----BEGIN CERTIFICATE-----\nMII..\nMBQ...\nCgU..\n8Lt..\n...\nh+4=\n-----END CERTIFICATE-----\n
    ```

    **Qlik Certificate By Path**: In this approach we provide the path of the certificates to the certificate stored in the container or environment running the ingestion workflow.

    * **Client Certificate Path**: This field specifies the path of `client.pem` certificate required for authentication.
    * **Client Key Certificate Value**: This field specifies the path of `client_key.pem` certificate required for authentication.
    * **Root Certificate Value**: This field specifies the path of `root.pem` certificate required for authentication.
      **User Directory**: This field specifies the user directory of the user.
      **User ID**: This field specifies the user id of the user.
      **Validate Host Name**: Enable/Disable this field to validate the host name against the provided certificates.
  </Step>

  <Step title="Test the Connection">
    Once the credentials have been added, click on *Test Connection* and *Save* the changes.

    <img src="https://mintcdn.com/openmetadata/9G75p72jJKYgvFUQ/public/images/connectors/test-connection.png?fit=max&auto=format&n=9G75p72jJKYgvFUQ&q=85&s=4ac71a56e30fa3dd1be86f82c1f07068" alt="Test Connection" width="1494" height="310" data-path="public/images/connectors/test-connection.png" />
  </Step>

  <Step title="Configure Metadata Ingestion">
    In this step we will configure the metadata ingestion pipeline,
    Please follow the instructions below

    <img src="https://mintcdn.com/openmetadata/9SXjaLbGROaofLQU/public/images/connectors/configure-metadata-ingestion-dashboard.png?fit=max&auto=format&n=9SXjaLbGROaofLQU&q=85&s=3dc1805cdb65fa215d2de69382538b7c" alt="Configure Metadata Ingestion" width="1504" height="1756" data-path="public/images/connectors/configure-metadata-ingestion-dashboard.png" />

    #### Metadata Ingestion Options

    * **Name**: This field refers to the name of ingestion pipeline, you can customize the name or use the generated name.
    * **Dashboard Filter Pattern (Optional)**: Use it to control whether to include dashboard as part of metadata ingestion.
      * **Include**: Explicitly include dashboards by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all dashboards with names matching one or more of the supplied regular expressions. All other dashboards will be excluded.
      * **Exclude**: Explicitly exclude dashboards by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all dashboards with names matching one or more of the supplied regular expressions. All other dashboards will be included.
    * **projectFilterPattern**: Filter the dashboards, charts and data sources by projects. Note that all of them support regex as include or exclude. E.g., "My project, My proj.\*, .\*Project".

    <Tip>
      We filter the projects by concatenating the entire project hierarchy using dot notation
      (e.g., `Project1.NestedProjectA.OtherProject`).
      Make sure the regex filter pattern accounts for this fully-qualified format.
    </Tip>

    * **Chart Pattern (Optional)**: Use it to control whether to include charts as part of metadata ingestion.
      * **Include**: Explicitly include charts by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all charts with names matching one or more of the supplied regular expressions. All other charts will be excluded.
      * **Exclude**: Explicitly exclude charts by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all charts with names matching one or more of the supplied regular expressions. All other charts will be included.
    * **Data Model Pattern (Optional)**: Use it to control whether to include data modes as part of metadata ingestion.
      * **Include**: Explicitly include data models by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all data models with names matching one or more of the supplied regular expressions. All other data models will be excluded.
      * **Exclude**: Explicitly exclude data models by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all data models with names matching one or more of the supplied regular expressions. All other data models will be included.
    * **Database Service Name (Optional)**: Enter the name of Database Service which is already ingested in OpenMetadata to create lineage between dashboards and database tables.
    * **Enable Debug Log (toggle)**: Set the 'Enable Debug Log' toggle to set the default log level to debug.
    * **Include Owners (toggle)**: Set the 'Include Owners' toggle to control whether to include owners to the ingested entity if the owner email matches with a user stored in the OM server as part of metadata ingestion. If the ingested entity already exists and has an owner, the owner will not be overwritten.
    * **Include Tags (toggle)**: Set the 'Include Tags' toggle to control whether to include tags in metadata ingestion.
    * **Include Data Models (toggle)**: Set the 'Include Data Models' toggle to control whether to include tags as part of metadata ingestion.
    * **Mark Deleted Dashboards (toggle)**: Set the 'Mark Deleted Dashboards' toggle to flag dashboards as soft-deleted if they are not present anymore in the source system.
    * **Include Draft Dashboard (toogle)**: Set the 'Include Draft Dashboard' toggle to include draft dashboards. By default it will include draft dashboards.
  </Step>

  <Step title="Schedule the Ingestion and Deploy">
    Scheduling can be set up at an hourly, daily, weekly, or manual cadence. The
    timezone is in UTC. Select a Start Date to schedule for ingestion. It is
    optional to add an End Date.

    Review your configuration settings. If they match what you intended,
    click Deploy to create the service and schedule metadata ingestion.

    If something doesn't look right, click the Back button to return to the
    appropriate step and change the settings as needed.

    After configuring the workflow, you can click on Deploy to create the
    pipeline.

    <img src="https://mintcdn.com/openmetadata/j50Bw6ZBiFbbFFnF/public/images/connectors/schedule.png?fit=max&auto=format&n=j50Bw6ZBiFbbFFnF&q=85&s=24b0c2f55f803efde5fb3b3bc24ed3ae" alt="Schedule the Workflow" width="2733" height="1083" data-path="public/images/connectors/schedule.png" />
  </Step>

  <Step title="View the Ingestion Pipeline">
    Once the workflow has been successfully deployed, you can view the
    Ingestion Pipeline running from the Service Page.

    <img src="https://mintcdn.com/openmetadata/9G75p72jJKYgvFUQ/public/images/connectors/view-ingestion-pipeline.png?fit=max&auto=format&n=9G75p72jJKYgvFUQ&q=85&s=7c4e411977371617cb1312efb9f9bfee" alt="View Ingestion Pipeline" width="2733" height="1271" data-path="public/images/connectors/view-ingestion-pipeline.png" />

    <Tip>
      If AutoPilot is enabled, workflows like usage tracking, data lineage, and similar tasks will be handled automatically. Users don’t need to set up or manage them - AutoPilot takes care of everything in the system.
    </Tip>
  </Step>
</Steps>

## Securing Qlik Sense Connection with SSL in OpenMetadata

To establish secure connections between OpenMetadata and Qlik Sense, there are two ways to communicate: defining the certificate file path or using the certificates value. Navigate to the `Advanced Config` section.
When using the local certificate file path, ensure that the certificates are accessible from the Airflow Server. You can specify the path for the `client certificate`, `client key certificate`, and `root certificate`.
Alternatively, when using the certificates value, you can provide the CA certificate used for SSL validation by specifying the `CA Certificate`. If both client and server require mutual authentication, you can upload all three: `CA Certificate`, `SSL Certificate`, and `SSL Key`.
Refer to the guide on how to generate authentication certificates so that OpenMetadata can communicate with Qlik Sense [here](/v1.12.x/connectors/dashboard/qliksense/certificates).

<img src="https://mintcdn.com/openmetadata/zq8wMYJ70mT1Pi3x/public/images/connectors/ssl_qlik_1.png?fit=max&auto=format&n=zq8wMYJ70mT1Pi3x&q=85&s=234e989fc10162d7253ea51c1f6c38b2" alt="SSL Configuration by local file path" height="450px" data-path="public/images/connectors/ssl_qlik_1.png" />

<img src="https://mintcdn.com/openmetadata/zq8wMYJ70mT1Pi3x/public/images/connectors/ssl_qlik_2.png?fit=max&auto=format&n=zq8wMYJ70mT1Pi3x&q=85&s=2d78c401cb01a5f00ec447a736910df4" alt="SSL Configuration" height="450px" data-path="public/images/connectors/ssl_qlik_2.png" />

## Lineage

To establish lineage from your **database tables to dashboards**, you must add the corresponding **database service name**.

<img src="https://mintcdn.com/openmetadata/9SXjaLbGROaofLQU/public/images/connectors/dashboard-lineage.png?fit=max&auto=format&n=9SXjaLbGROaofLQU&q=85&s=e41db6665a46398ff36ff571ce7d5b06" alt="lineage in dashboard" width="2599" height="893" data-path="public/images/connectors/dashboard-lineage.png" />
