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.
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:
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.

Sigma SEs, technical CSMs, and migration partners running Sisense-to-Sigma conversions — or scoping a batch migration with the companion sisense-assessment skill.
Claude Code installed (CLI or desktop).Python 3.10 or newer. macOS's stock system Python is typically 3.9 — older than the skill needs. If python3 --version reports anything below 3.10, install a newer interpreter via Homebrew (brew install python@3.12) or python.org.Node.js (any recent LTS) for the converter MCP. The conversion uses a separate MCP server, sigma-data-model-mcp, cloned + built (npm install && npm run build) into ~/Desktop/sigma-data-model-mcp. The skill prompts you to install it mid-conversion — no upfront work needed — but pre-build it if you'd rather skip the gate.
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 |
| 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 |
| 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:

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 |
|
1 dashboard, ElastiCube model with custom SQL tables |
|
10+ dashboards (any data source) |
|
Auditing Sisense sprawl without converting yet |
|

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.

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

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.

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.

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:


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:
COMMERCE row count: 613,002TOTAL_REVENUE: 39,759,625.515TOTAL_QUANTITY: 91,206The revenue and quantity totals are the baseline aggregates we'll cross-check against the Sigma workbook after the conversion.

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):
COMMERCE."Brand ID" → BRAND."Brand ID"COMMERCE."Category ID" → CATEGORY."Category ID"COMMERCE."Country ID" → COUNTRY."Country ID"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)
Sum of COMMERCE."Revenue"Indicator (the 123 icon, top-left of the chart type picker)Total RevenueWidget 2: Total Quantity (indicator)
Sum of COMMERCE."Quantity"Indicator (the 123 icon, top-left of the chart type picker)Total QuantityWidget 3: Revenue by Category (column chart)
Sum of COMMERCE."Revenue"CATEGORY."Category"Column ChartRevenue by CategoryWidget 4: Revenue by Country (bar chart, top 10)
Sum of COMMERCE."Revenue"COUNTRY."Country"Bar ChartRevenue by CountryRegular filters > + > select Country > set Top to 10 > by: Total RevenueWidget 5: Revenue Trend Yearly (bar chart)
Sum of COMMERCE."Revenue"COMMERCE."Date" (grouped by Years)Bar ChartRevenue Trend YearlyWidget 6: Quantity by Category (pie chart)
Sum of COMMERCE."Quantity"CATEGORY."Category"Pie ChartQuantity by CategoryStep 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.

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.


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:
Dashboard OID — the Sisense dashboard OID from the URL (the alphanumeric segment after /app/main#/dashboards/)SIGMA_CONNECTION_ID — your Snowflake connection ID from Sigma's Administration > ConnectionsSIGMA_FOLDER_ID — the folder ID you copied at the end of the previous sectionRun /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.

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:
type=error columns). Multi-fact relationships with cardinality settings from the ElastiCube are honored.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:
Sum(If(...)) that have no single-step Sigma equivalent. The skill decomposes them into base columns + a Sigma formula and flags the result for review.
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:
sisense-to-sigma actually applies, so the readout reflects what the tool will really do — not a generic guessmigrate-first, easy-win, moderate, needs-gap-scout, retire based on combined complexity + coverage + usage scoresThe 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 plan — sisense-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:
sisense-assessment against the target instance; review the shortlist with stakeholders.sisense-to-sigma and let it work through them.
The following is a "grab bag" of things that might come up during real conversions, with the fix for each.
python3 --version reports 3.9.x and the skill refuses to run:brew install python@3.12) or python.org, then use python3.12 -m pip install explicitly for any helpers.401 Unauthorized:~/.sigma-migration/sisense.env are wrong or the account has been deactivated. Double-check SISENSE_BASE_URL, SISENSE_EMAIL, and SISENSE_PASSWORD, re-run the smoke test from the Install section, then retry the skill.SISENSE_EMAIL doesn't have permission to view that dashboard. Confirm the account has at least viewer access to the dashboard's folder.sigma-data-model-mcp). If it isn't installed locally, the skill stops at the gate. Pick option 6. Chat about this and tell Claude:Clone twells89/sigma-data-model-mcp into ~/Desktop/sigma-data-model-mcp for me, then run
npm install && npm run build in that directory. Once the build is done, come back to the gate and pick option 1.type=error columns in the data model after Phase 3:Prepare the Demo Data includes the GRANT USAGE and GRANT SELECT statements — if you skipped or modified them, run them now with the role name your Sigma connection actually uses (find it under Administration > Connections).CERTIFICATE_VERIFY_FAILED from a corporate proxy:curl works. Pull the proxy's root certificate out of Keychain and combine it with the macOS roots into a PEM Python can read, then point Python at it via SSL_CERT_FILE in ~/.sigma-migration/env. (Same recipe as the other migration QuickStarts in this family.)BLOCKED — snow connection not configured:verify_parity.py) requires the Snowflake CLI (snow) — a separate tool from the Sigma connection ID you provided in the kickoff prompt. To unblock it: install the Snowflake CLI (pip install snowflake-cli-labs), run snow connection add to configure your Snowflake account credentials, then run python3 scripts/verify_parity.py checks.json from your skill workdir. For a Live Connect migration where Sisense and Sigma both read the same live warehouse tables, this gate is confirmatory — the conversion output is correct without it.Bash command — Contains shell syntax that cannot be statically analyzed — Do you want to proceed? prompts during the run:eval "$(...)" patterns to inject tokens dynamically. Click 1. Yes on each — it's expected behavior, not a misconfiguration. After the run, you can use the /fewer-permission-prompts skill to scan the transcript and add those patterns to your .claude/settings.local.json so subsequent runs are silent.
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:
sisense-assessment scopes and prioritizes the instance; sisense-to-sigma converts and verifies. The same shape applies whether you're migrating one dashboard or every dashboard reading from a shared ElastiCube.~/.sigma-migration/env, the entire migration is one paste. The kickoff prompt reads the dashboard OID + warehouse coordinates + options in one shot, and the skill walks through every phase end-to-end without further interaction unless a gate genuinely needs your call.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!
