A common ask from teams evaluating Sigma is migrating their Sisense footprint — usually to take advantage of all the amazing things Sigma offers. The conversion itself can be a blocker — and the part this QuickStart automates.

The usual Sisense-to-Sigma migration loop is rebuild-the-ElastiCube-by-hand, rewrite every JAQL expression and calculated measure as a Sigma formula, recreate each dashboard's widgets and layout, then eyeball the numbers against the source and hope nothing drifted in the translation. Done on a single dashboard it's tedious. Across a real Sisense estate — typically dozens of dashboards reading from a handful of shared ElastiCubes — it's the reason migration projects slip.

This QuickStart walks through a Claude Code skill called sisense-to-sigma that automates the loop.

Point it at a Sisense dashboard; it discovers the dashboard's widgets and the ElastiCube or Live Connect data model behind them via the Sisense REST API. It translates each widget's JAQL expression into a Sigma formula, builds a Sigma data model from the warehouse tables the ElastiCube points at, mirrors the dashboard layout on Sigma's grid, and runs a parity pass comparing Sigma's results against the live warehouse. It surfaces a punch list of anything it couldn't auto-translate — instead of silently producing a broken workbook.

What else this enables

A pure lift-and-shift is the floor, not the ceiling. The same skill family supports three follow-on moves that turn a migration into an upgrade:

Sample dashboard

For the demonstration, we'll convert a dashboard called ECommerce Overview (Live) — six widgets (Total Revenue and Total Quantity indicators, Revenue by Category column chart, Revenue by Country top-10 bar, Revenue Trend Yearly bar, and Quantity by Category pie) built on a Snowflake Live Connect data model. You'll see the discovery artifacts each phase produces, the converter's breakdown of how each JAQL expression mapped to a Sigma formula, the parity report against the live warehouse, and the resulting Sigma data model and workbook landed in your org — along with the gap list of items to hand-polish.

Target Audience

Sigma SEs, technical CSMs, and migration partners running Sisense-to-Sigma conversions — or scoping a batch migration with the companion sisense-assessment skill.

Prerequisites

Sigma Free Trial

Footer

sisense-to-sigma is one of two skills that ship together as a single repo (cloned in the next section). Most of this QuickStart focuses on the converter — but knowing where the assessment skill fits avoids dead ends later when scoping a batch migration.

Skill

Role

When to reach for it

sisense-assessment

Scoping

Auditing a Sisense instance before committing to a conversion plan. Emits a per-dashboard complexity readout (widget-type mix, JAQL expression convertibility, ElastiCube vs Live Connect flags, multi-fact relationship count, filter/bookmark complexity), usage signal from Sisense's activity API, and a value/cost-ranked migration shortlist that sisense-to-sigma can consume. Read-only — only GETs against the Sisense API.

sisense-to-sigma

Conversion

The subject of this QuickStart. Converts a single Sisense dashboard (or a batch via shortlist) to a Sigma data model and matching workbook with verified row-level parity.

Here's how the two skills connect in a full migration — sisense-assessment hands the converter a ranked shortlist, and sisense-to-sigma produces the Sigma workbooks with a verified parity report:

Which skill for your situation

Not every migration needs both skills. Use the table below to map your scenario to the smallest set that fits.

In this QuickStart we're in the first row — one Sisense dashboard whose Live Connect model reads directly from the same Snowflake warehouse Sigma will connect to.

Your situation

Skill(s) to use

1 dashboard, Live Connect model reads from your warehouse

sisense-to-sigma

1 dashboard, ElastiCube model with custom SQL tables

sisense-to-sigma (custom-SQL tables flagged for review)

10+ dashboards (any data source)

sisense-assessmentsisense-to-sigma in batch mode

Auditing Sisense sprawl without converting yet

sisense-assessment only

Footer

First we need to clone the skill's GitHub repository, configure Sisense REST credentials, and capture your Sigma credentials.

The two skills live in sigmacomputing/quickstarts-public under sisense-migration-skills/.

From a terminal, run each command below one at a time so you can confirm each step before moving on.

Step 1: Create a local folder for the clone

mkdir -p ~/quickstarts-public

Step 2: Move into the new folder

cd ~/quickstarts-public

Step 3: Clone the repo without pulling any files yet

git clone --filter=blob:none --sparse https://github.com/sigmacomputing/quickstarts-public.git .

Step 4: Fill in only the sisense-migration-skills folder

git sparse-checkout set sisense-migration-skills

Step 5: Symlink sisense-to-sigma into the Claude skills folder

ln -s ~/quickstarts-public/sisense-migration-skills/sisense-to-sigma ~/.claude/skills/sisense-to-sigma

Step 6: Symlink sisense-assessment

ln -s ~/quickstarts-public/sisense-migration-skills/sisense-assessment ~/.claude/skills/sisense-assessment

Steps 5 and 6 should return with no error.

divider

Step 7: Add your Sigma API credentials.
The Sisense skill uses bootstrap.sh.

Because bootstrap.sh is non-interactive, write your Sigma API credentials directly to the shared env file it reads:

cat >> ~/.sigma-migration/env <<'EOF'
export SIGMA_BASE_URL='https://aws-api.sigmacomputing.com'
export SIGMA_CLIENT_ID='{your-client-id}'
export SIGMA_CLIENT_SECRET='{your-client-secret}'
EOF

Get SIGMA_CLIENT_ID and SIGMA_CLIENT_SECRET from Sigma under Administration > Developer Access > Create New Client Credentials (requires Admin role).

For information, see: Generate Sigma API client credentials

SIGMA_BASE_URL should match your deployment region — https://aws-api.sigmacomputing.com covers AWS US East.

For GCP or Azure instances, see: Supported regions, data platforms, and features

divider

Step 8: Add your Sisense credentials.
The skill authenticates to Sisense using your account email and password — it POSTs to /api/v1/authentication/login at runtime to exchange them for a bearer token. Create the credential file and open it in nano:

mkdir -p ~/.sigma-migration && nano ~/.sigma-migration/sisense.env

Paste these three lines — substituting your actual values:

export SISENSE_BASE_URL="https://{your-sisense-host}"
export SISENSE_EMAIL="{your-full-login-email}"
export SISENSE_PASSWORD='{your-password}'

Save and exit: Ctrl+O, Enter, Ctrl+X. Then lock down the file:

chmod 600 ~/.sigma-migration/sisense.env

SISENSE_BASE_URL is the host with no trailing slash. For a cloud-hosted tenant it looks like https://{your-tenant}.sisense.com. SISENSE_EMAIL must be the full email address you use to log into Sisense — a bare username will be rejected.

Verify auth works by running the skill's own auth script — it logs in and returns a token:

source ~/.sigma-migration/sisense.env && eval "$(bash ~/.claude/skills/sisense-to-sigma/scripts/sisense-auth.sh)" && curl -s -H "Authorization: Bearer ${SISENSE_API_TOKEN}" "${SISENSE_BASE_URL}/api/v1/dashboards?fields=oid,title" | python3 -c 'import sys,json; [print(d["oid"], "-", d["title"]) for d in json.load(sys.stdin)]'

You should see one line per dashboard. If the command returns nothing or a 401: double-check SISENSE_BASE_URL (include the protocol, no trailing slash) and your email and password.

divider

Step 9: Run the environment bootstrap.
This single command verifies that all runtime dependencies are in place (Ruby, Python 3, Node.js), installs any that are missing without requiring admin access, confirms that credentials are readable in ~/.sigma-migration/env, and writes the sentinel file the skill gates on before starting. Run it once per machine:

bash ~/.claude/skills/sisense-to-sigma/scripts/bootstrap.sh

A successful run ends with:

bootstrap: COMPLETE — doctor green; sentinel written to ~/.sigma-migration/bootstrap.json.

If the output flags missing credentials, check your ~/.sigma-migration/env entries and run bootstrap.sh again. If a runtime dependency fails to install, follow the message's suggestion (usually a Homebrew install) and rerun.

divider

Step 10: Verify Claude Code can invoke the skill.
Type claude in your terminal to start Claude Code, then invoke the skill:

claude
/sisense-to-sigma

Claude should start reading the reference files and ask what dashboard you want to convert.

Pause at this prompt — we'll hand it everything in one shot via the kickoff prompt in the Run the Conversion section later:

Footer

The demo dashboard reads from a Snowflake e-commerce schema. We'll create that schema and load it from S3 so both Sisense (via Live Connect) and Sigma read from the same source of truth.

USE ROLE ACCOUNTADMIN;
USE WAREHOUSE COMPUTE_WH;

CREATE DATABASE IF NOT EXISTS QUICKSTARTS;
CREATE SCHEMA  IF NOT EXISTS QUICKSTARTS.SISENSE_ECOMMERCE;
USE SCHEMA QUICKSTARTS.SISENSE_ECOMMERCE;

CREATE OR REPLACE FILE FORMAT sisense_csv_format
  TYPE = CSV
  FIELD_DELIMITER = ','
  FIELD_OPTIONALLY_ENCLOSED_BY = '"'
  NULL_IF = ('', 'NULL')
  EMPTY_FIELD_AS_NULL = TRUE
  PARSE_HEADER = TRUE;

CREATE OR REPLACE STAGE sisense_ecommerce_stage
  URL = 's3://sigma-quickstarts-main/Sisense/'
  FILE_FORMAT = sisense_csv_format;

CREATE OR REPLACE TABLE BRAND (
  "Brand ID" NUMBER,
  "Brand"    VARCHAR
);

CREATE OR REPLACE TABLE CATEGORY (
  "Category ID" NUMBER,
  "Category"    VARCHAR
);

CREATE OR REPLACE TABLE COUNTRY (
  "Country ID" NUMBER,
  "Country"    VARCHAR
);

CREATE OR REPLACE TABLE COMMERCE (
  "Visit ID"    NUMBER,
  "Date"        DATE,
  "Brand ID"    NUMBER,
  "Category ID" NUMBER,
  "Country ID"  NUMBER,
  "Revenue"     FLOAT,
  "Quantity"    NUMBER,
  "Cost"        FLOAT,
  "Age Range"   VARCHAR,
  "Gender"      VARCHAR,
  "Condition"   VARCHAR
);

COPY INTO BRAND    FROM @sisense_ecommerce_stage/BRAND.csv    MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
COPY INTO CATEGORY FROM @sisense_ecommerce_stage/CATEGORY.csv MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
COPY INTO COUNTRY  FROM @sisense_ecommerce_stage/COUNTRY.csv  MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;
COPY INTO COMMERCE FROM @sisense_ecommerce_stage/COMMERCE.csv MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;

SELECT 'BRAND'    AS TBL_NAME, COUNT(*) AS ROW_COUNT FROM BRAND
UNION ALL
SELECT 'CATEGORY', COUNT(*) FROM CATEGORY
UNION ALL
SELECT 'COUNTRY',  COUNT(*) FROM COUNTRY
UNION ALL
SELECT 'COMMERCE', COUNT(*) FROM COMMERCE;

SELECT
  ROUND(SUM("Revenue"), 3) AS TOTAL_REVENUE,
  SUM("Quantity")          AS TOTAL_QUANTITY
FROM COMMERCE;

GRANT USAGE  ON DATABASE QUICKSTARTS                                    TO ROLE SIGMA_SERVICE_ROLE;
GRANT USAGE  ON SCHEMA   QUICKSTARTS.SISENSE_ECOMMERCE                  TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON ALL    TABLES IN SCHEMA QUICKSTARTS.SISENSE_ECOMMERCE   TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA QUICKSTARTS.SISENSE_ECOMMERCE   TO ROLE SIGMA_SERVICE_ROLE;

Expected results:

The revenue and quantity totals are the baseline aggregates we'll cross-check against the Sigma workbook after the conversion.

Footer

We'll build the ECommerce Overview (Live) dashboard in Sisense using a Live Connect model pointed at the Snowflake schema from the previous section. That dashboard is what we'll convert in the next phase.

Step 1: Create a Live Connect data model in Sisense.

In Sisense, navigate to Data > + Add Data. Choose Live Connect and select your Snowflake connection. Add all four tables from QUICKSTARTS.SISENSE_ECOMMERCE:

BRAND
CATEGORY
COMMERCE
COUNTRY

Define the three relationships (all many-to-one from COMMERCE):

Name the model Sample ECommerce and save.

Step 2: Create the dashboard and add widgets.

+ New Dashboard. Name it ECommerce Overview (Live) and add the following six widgets using the Sample ECommerce model. All are built in Sisense's GUI widget builder — no custom scripts.

Widget 1: Total Revenue (indicator)

Widget 2: Total Quantity (indicator)

Widget 3: Revenue by Category (column chart)

Widget 4: Revenue by Country (bar chart, top 10)

Widget 5: Revenue Trend Yearly (bar chart)

Widget 6: Quantity by Category (pie chart)

Step 3: Capture the dashboard OID.

With the dashboard open, copy the OID from the URL — it's the alphanumeric segment after /app/main#/dashboards/. Keep it for the kickoff prompt in Run the Conversion.

Footer

The converter needs a Sigma folder to land the new data model and workbook in. The skill will ask for the folder's UUID — it's easier to have it ready before you return to the Claude prompt.

Step 1: Create (or pick) a folder in Sigma.
Open your Sigma org, navigate to where you want the migrated workbook to live, and create a folder:

Sisense Migration Demo

Step 2: Grab the folder ID.
Open the folder. The ID is the last segment of the URL — a short alphanumeric string, 21 characters. Copy it from the address bar and keep it on the clipboard for the next section.

Footer

The skill can run interactively, asking for the dashboard, warehouse, and Sigma destination one at a time. For a known target — like ours — it's faster to give Claude the entire job in one message. The skill recognizes a structured kickoff prompt and walks the pipeline directly.

If Claude is still running and paused at the skill's first prompt from Install and Configure the Skill, return to that terminal. If you closed Claude after that step, restart it now:

claude
/sisense-to-sigma

Claude is asking how we want to proceed. Select option 2:

2. Yes, allow reading from sisense-migration/ from this project.

When Claude finishes asking for various checks and permissions it will stop here (or similar):

Paste the block below. Substitute your own values where the placeholders are:

Run /sisense-to-sigma on the following. Walk every phase in SKILL.md end-to-end and stop only if a hard gate fails.

Sisense
- Credentials sourced from ~/.sigma-migration/sisense.env (SISENSE_BASE_URL, SISENSE_EMAIL, SISENSE_PASSWORD)
- Dashboard OID: {your-dashboard-oid}

Warehouse — same on both sides
- Sisense reads from Snowflake via Live Connect — database QUICKSTARTS, schema SISENSE_ECOMMERCE
- Sigma reads from Snowflake — same schema QUICKSTARTS.SISENSE_ECOMMERCE

Sigma
- SIGMA_API_TOKEN = mint from ~/.sigma-migration/env
- SIGMA_CONNECTION_ID: {your-snowflake-connection-id}
- SIGMA_FOLDER_ID: {your-folder-id}

Options
- Name prefix: Sisense Demo
- Auto-approve mid-pipeline questions: yes
- Parity: data should match exactly since both sides read from the same warehouse. Report any deltas.

Don't declare GREEN until the parity gate passes and the visual-QA loop passes.

For example:

Claude reads the block, mints a fresh Sigma token from ~/.sigma-migration/env, sources the Sisense credentials, and walks the phases end-to-end. The rest of the run is hands-off until a gate or decision point.

Footer

When the migration completes, Claude prints a final summary covering the whole pipeline — every phase's result, the visual-QA outcome, the hard-gate verdict, and the URLs of the new Sigma data model and workbook:

The summary walks through six phases plus a visual-QA pass:

Each widget reports PASS within tolerance or FAIL; the gate is GREEN only when all widgets pass.

If the gate shows BLOCKED — snow connection not configured, the skill couldn't run the warehouse-side SQL comparison because the Snowflake CLI (snow) isn't configured on the machine — this is separate from the Sigma connection ID in the kickoff prompt. For a Live Connect demo where Sisense and Sigma both read the same live tables, this gate is confirmatory; the conversion is structurally correct.

To unblock it fully, install and configure the Snowflake CLI (pip install snowflake-cli-labs, then snow connection add) and re-run verify_parity.py directly.

Alternatively, if you have Homebrew installed: brew install snowflake-cli-labs.

Open the new workbook in Sigma to see the migrated dashboard:

Open the data model to see how the converter wired up the tables and relationships:

Hand-polish items the skill flags rather than silently working around:

Footer

A single dashboard is the easy case. Real Sisense migrations involve dozens to hundreds of dashboards reading from a handful of shared ElastiCubes — and migrating them one-by-one through the converter loses the leverage of doing the planning work once. That's where the companion sisense-assessment skill comes in.

Point sisense-assessment at a Sisense instance and it inventories every dashboard, widget, and data model, scoring each on:

The output is a Sigma-branded readout.md you can share with stakeholders, plus a ranked migration shortlist sorted by value / (1 + cost) — the cheapest, highest-value dashboards to convert first.

The shortlist becomes input to a batch conversion plansisense-assessment groups dashboards that share the same ElastiCube so one Sigma data model can serve a whole family of workbooks instead of producing N near-duplicate DMs. sisense-to-sigma consumes that plan in batch mode and runs the conversions concurrently.

Typical flow for a real migration engagement:

  1. Run sisense-assessment against the target instance; review the shortlist with stakeholders.
  2. Pick the top N dashboards to convert first — or drop the cold ones entirely.
  3. Hand the batch plan to sisense-to-sigma and let it work through them.
  4. Spot-check each output; file the inevitable gap items upstream.

Footer

The following is a "grab bag" of things that might come up during real conversions, with the fix for each.

Footer

What you built is less a single conversion and more a repeatable migration path. The skill took a Sisense dashboard — widgets, JAQL expressions, dashboard filters, data model relationships — and produced a Sigma data model, a workbook, and a row-level parity report against the live warehouse, all from a single structured prompt. No one rebuilt the dashboard by hand, and the parity numbers are evidence rather than hope.

The patterns worth carrying into your next migration:

A first-pass conversion produces a working starting point and a documented punch list, not a hand-polished workbook. The polish loop is short, and you know exactly what to look at. That's the migration approach you can scale across an entire Sisense instance.

Additional Resource Links

Blog
Community
Help Center
QuickStarts

Be sure to check out all the latest developments at Sigma's First Friday Feature page!

Footer