A common ask from teams evaluating Sigma is migrating their Amazon QuickSight 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 QuickSight-to-Sigma migration loop is recreate each dataset and its data-prep, re-author every calculated field as a Sigma formula, rebuild each sheet's visuals and layout, then eyeball the numbers and hope nothing drifted in the translation. Done on a single analysis it's tedious. Across an account with dozens of analyses reading from shared datasets, it's the reason migration projects slip.
This QuickStart walks through a Claude Code skill called quicksight-to-sigma that automates the loop.
Point it at a QuickSight analysis (or dashboard); it extracts the analysis definition, the datasets it depends on, and the data sources behind them over the AWS CLI, translates each calculated field's QuickSight expression into a Sigma formula, builds a Sigma data model from the warehouse tables the datasets point at, mirrors each sheet's visuals as a Sigma workbook page, and runs a row-level parity pass that compares Sigma's output to the QuickSight aggregation. 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 QuickSight analysis called Sales Pipeline — a sales-ops dashboard tracking opportunities across stages, segments, and regions. The analysis shows forecasted and weighted revenue by salesperson, opportunity counts by stage (Prospecting → Closed Won/Lost), and pipeline distribution across customer segments (Enterprise / Mid-Market / SMB / Startup) and US regions. The underlying dataset is a single 800-row pipeline table at one-row-per-opportunity grain, covering sales activity from January 2025 through May 2026:

Sigma SEs, technical CSMs, and migration partners running QuickSight-to-Sigma conversions — or scoping a batch migration with the companion quicksight-assessment skill.
Claude Code installed (CLI or desktop).describe-analysis-definition, describe-dashboard-definition, and describe-data-set APIs the skill relies on are Enterprise-only — Standard editions reject them and there is no extraction path. Confirm your edition before starting.boto3 client when importable and falls back to shelling out to aws quicksight ... otherwise.aws sts get-caller-identity) and the analysis ID (or dashboard ID) you want to migrate.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.Ruby (any recent system Ruby is fine) — the build pipeline and finalize/gate stack (migrate-quicksight.rb, assert-phase6-ran.rb, put-layout.rb, etc.) is Ruby-based.Node.js (any recent LTS) for building 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.
quicksight-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 saves dead ends later when scoping a batch migration.
Skill | Role | When to reach for it |
| Scoping | Auditing a QuickSight account before committing to a conversion plan. Emits a per-analysis complexity readout (visual-type mix, calculated-field count, window-function detection, dataset source types, RLS flags), and a value/cost-ranked migration shortlist that |
| Conversion | The subject of this QuickStart. Converts a single QuickSight analysis or 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 — quicksight-assessment hands the converter a ranked shortlist, and quicksight-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 QuickSight analysis whose dataset reads from warehouse tables that we'll land in Snowflake — then run quicksight-to-sigma.
Your situation | Skill(s) to use |
1 analysis, dataset reads from your warehouse |
|
1 analysis, dataset reads from a warehouse Sigma can't connect to | Land the data in your warehouse first (covered in |
10+ analyses (any data source) |
|
Auditing QuickSight sprawl without converting yet |
|

First we need to clone the skill's GitHub repository, configure AWS CLI access to QuickSight, and capture your Sigma credentials.
The two skills live in sigmacomputing/quickstarts-public under quicksight-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 quicksight-migration-skills folder
git sparse-checkout set quicksight-migration-skills
Step 5: Symlink quicksight-to-sigma into the Claude skills folder
ln -s ~/quickstarts-public/quicksight-migration-skills/quicksight-to-sigma ~/.claude/skills/quicksight-to-sigma
Step 6: Symlink quicksight-assessment
ln -s ~/quickstarts-public/quicksight-migration-skills/quicksight-assessment ~/.claude/skills/quicksight-assessment
Steps 5 and 6 should return with no error.

Step 7: Install the Python dependency the skill uses.
The skill calls QuickSight via boto3 when it's importable and falls back to the AWS CLI otherwise. Installing boto3 keeps everything in-process and avoids one subprocess per call.
python3 -m pip install boto3

Step 8: Capture your Sigma API credentials.
This script prompts for SIGMA_BASE_URL, SIGMA_CLIENT_ID, and SIGMA_CLIENT_SECRET and writes them into Claude's settings + the neutral ~/.sigma-migration/env file that the skill family uses to mint Sigma API tokens at runtime.
Run once per machine.
ruby ~/.claude/skills/quicksight-to-sigma/scripts/setup.rb
The final prompt asks for a Connection ID (full warehouse-connection UUID, optional — Enter to skip). You can press Enter to skip — the kickoff prompt later in this QuickStart supplies the Snowflake connection ID inline. Capturing it here is useful only if you plan to run multiple migrations and want it persisted in ~/.sigma-migration/env.

Step 9: Install AWS CLI v2.
The skill calls QuickSight's REST APIs through AWS CLI / boto3. If you've never installed AWS CLI before, the simplest path on macOS is Homebrew:
brew install awscli
For non-Homebrew installs or other platforms, follow AWS's official installer instructions at Install or update to the latest version of the AWS CLI
Verify it landed:
aws --version
You should see aws-cli/2.x.x or higher.

Step 10: Configure AWS CLI authentication.
The skill needs an AWS CLI profile that can call QuickSight's describe-* APIs against the account that owns the analysis you'll migrate. How you create that profile depends on what credentials your AWS admin gave you. Pick the option that matches.
Substitute {your-profile} with whatever profile name you want (e.g., sigma-qs) — you'll reuse it in the kickoff prompt later.
Option A — IAM user access key + secret (most common for one-off testing):
aws configure --profile {your-profile}
aws configure prompts for four values. Paste what your admin sent you for the first two, set the region to us-east-1 (see the note below about identity region), and use json as the output:
AWS Access Key ID [None]: {your-access-key-id}
AWS Secret Access Key [None]: {your-secret-access-key}
Default region name [None]: us-east-1
Default output format [None]: json
Option B — AWS IAM Identity Center (SSO):
aws configure sso --profile {your-profile}
That walks you through the SSO start URL, account, and role. After the initial setup, you'll run aws sso login --profile {your-profile} to refresh the session when it expires.
Option C — Okta-fronted AWS (install gimme-aws-creds first with pip install gimme-aws-creds):
gimme-aws-creds --profile {your-profile}

Step 11: Verify access.
aws sts get-caller-identity --profile {your-profile}
You should see the AWS account ID and the IAM identity the skill will use. If you get Unable to locate credentials or ExpiredToken, re-run the appropriate Option above first.
Make a note of your AWS account ID for the kickoff prompt:
aws sts get-caller-identity --profile {your-profile} --query Account --output text

Step 12: Verify Claude Code can invoke the skill.
Type claude in your terminal to start Claude Code, then invoke the skill:
claude
/quicksight-to-sigma
Claude should start reading the reference files and ask what analysis you want to convert.
Pause at that prompt — we'll hand it everything in one shot via the kickoff prompt in Run the Conversion:


The QuickSight Sales Pipeline analysis reads from a single denormalized pipeline table — 10 columns covering opportunity, salesperson, segment, region, stage, and revenue. For the migration to land in Sigma cleanly, the same table needs to exist in a connection your Sigma org can reach.
Data prep has two halves:
COPY INTO statement below reads from S3 directly — no local download needed.USE ROLE ACCOUNTADMIN;
USE WAREHOUSE COMPUTE_WH;
CREATE DATABASE IF NOT EXISTS QUICKSTARTS;
CREATE SCHEMA IF NOT EXISTS QUICKSTARTS.QS_SALES_PIPELINE;
USE SCHEMA QUICKSTARTS.QS_SALES_PIPELINE;
CREATE OR REPLACE FILE FORMAT csv_format
TYPE = CSV
FIELD_DELIMITER = ','
SKIP_HEADER = 1
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ('', 'NULL')
EMPTY_FIELD_AS_NULL = TRUE;
CREATE OR REPLACE STAGE qs_pipeline_stage
URL = 's3://sigma-quickstarts-main/QuickSight/'
FILE_FORMAT = csv_format;
CREATE OR REPLACE TABLE SALES_PIPELINE (
SALE_DATE DATE,
SALESPERSON VARCHAR,
LEAD_NAME VARCHAR,
SEGMENT VARCHAR,
REGION VARCHAR,
TARGET_CLOSE DATE,
FORECASTED_MONTHLY_REVENUE NUMBER(38,2),
OPPORTUNITY_STAGE VARCHAR,
WEIGHTED_REVENUE NUMBER(38,2),
ACTIVE BOOLEAN
);
COPY INTO SALES_PIPELINE FROM @qs_pipeline_stage/sales_pipeline.csv ON_ERROR = ABORT_STATEMENT;
GRANT USAGE ON DATABASE QUICKSTARTS TO ROLE SIGMA_SERVICE_ROLE;
GRANT USAGE ON SCHEMA QUICKSTARTS.QS_SALES_PIPELINE TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA QUICKSTARTS.QS_SALES_PIPELINE TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA QUICKSTARTS.QS_SALES_PIPELINE TO ROLE SIGMA_SERVICE_ROLE;
-- Sanity-check row count. Expected: 800.
SELECT COUNT(*) AS ROW_COUNT FROM SALES_PIPELINE;
-- Forecasted revenue baseline (~$35,632,675.44 for the warehouse snapshot).
SELECT TO_CHAR(SUM(FORECASTED_MONTHLY_REVENUE), '$999,999,999.99') AS FORECASTED_BASELINE
FROM SALES_PIPELINE;
If the load completes cleanly, the forecasted-revenue check returns $35,632,675.44. Any mismatch means either a COPY partial-load error (check Snowflake's load history) or a different S3 file than expected.


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 will be easier to have it ready before you return to the Claude prompt that's still paused after the skill loaded.
To keep this simple, we will use a plain folder and not a workspace.
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 for it. Something like:
QuickSight 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 analysis, AWS account, 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 assembles the migrate-quicksight.rb command directly, going straight from "go" through discover → convert → data model → workbook build → layout → parity.
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
/quicksight-to-sigma
When Claude finishes loading the skill and asks what to migrate, choose Chat about this:

Paste the block below. Substitute your own values where the placeholders are:
Analysis ID — the last segment of the analysis URL when you have it open in QuickSight. The URL looks like https://{region}.quicksight.aws.amazon.com/sn/account/{your-account-alias}/analyses/{analysis-id}. The {analysis-id} portion can be a friendly slug (e.g., sales-pipeline) or a UUID — either form is accepted because AWS lets you set the ID at creation. For our sample, the value is sales-pipeline.AWS account ID — from aws sts get-caller-identity in Install Step 11AWS profile — your AWS CLI profile name (the one you configured in Install Step 10, e.g. sigma-qs)SIGMA_CONNECTION_ID — your Snowflake connection ID (the one where you landed the sample data) from Sigma's Administration > ConnectionsSIGMA_FOLDER_ID — the folder ID you copied at the end of the previous sectionRun /quicksight-to-sigma on the following. Use migrate-quicksight.rb end-to-end and stop only if a hard gate fails.
QuickSight
- AWS account ID: {your-aws-account-id}
- AWS profile: {your-aws-cli-profile-name}
- Region: us-east-1
- Analysis ID: {your-analysis-id}
Warehouse (Snowflake)
- Database: QUICKSTARTS
- Schema: QS_SALES_PIPELINE
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: QuickSight Sales Pipeline
- Auto-approve mid-pipeline questions: yes
- Parity: tolerate row-count drift between QuickSight (live) and the warehouse snapshot — this QuickStart uses a frozen CSV copy of the source. Report the delta with a row-level diff, but treat warehouse-snapshot staleness as a soft fail (not a gate-red).
Don't declare GREEN until the parity gate passes (or the tolerance above applies) and the visual-QA loop passes.
Claude reads the block, mints a fresh Sigma token from ~/.sigma-migration/env, assembles the migrate-quicksight.rb command with the right flags, and runs it 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.
Despite making a few mistakes in the values provided, Claude was still able to complete the conversion:

The summary walks through six phases plus a visual-QA pass:
describe-analysis-definition (or -dashboard-definition) plus describe-data-set for every dataset the analysis references and describe-data-source for each underlying source, writing them to a workdir (default ~/quicksight-migration// ) along with a signals.json summary of datasets, calculated fields, parameters, and visual kinds.convert_quicksight_to_sigma MCP, which translates calculated fields, data-prep transforms, and dataset joins into a Sigma data-model spec. The skill prints the exact MCP call so you can re-run it if needed.schemaVersion: 1), validates the spec, then POSTs it to /v2/dataModels/spec. Verifies every column resolves to a concrete type — no error columns.sigma-mcp-v2 and compares against the QuickSight aggregation. Each chart reports PASS within tolerance or FAIL; the gate is GREEN only when all charts pass.Open the new workbook in Sigma to see the migrated dashboard:

Open the data model to see how the converter wired up the dataset and calc fields:

Hand-polish items the skill flags rather than silently working around:
FilterGroups degrade to placeholders with a warning manifest — partial, not failed. Hand-author the Sigma equivalent on the affected element.CustomSql / DIRECT_QUERY datasets come back from the converter nameless with raw sql refs; the fixup step names them and rewrites refs to [Custom SQL/] . Don't post the raw converter output.apply_sigma_rls.py after reviewing the security.json the skill emits.
A single analysis is the easy case. Real migrations involve QuickSight accounts with dozens or hundreds of analyses reading from a handful of shared datasets — and migrating them one-by-one through the converter loses the leverage of doing the planning work once. That's where the companion quicksight-assessment skill comes in.
Point quicksight-assessment at a QuickSight account and it inventories every analysis, dashboard, and dataset, scoring each on:
quicksight-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 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 analyses to convert first.
The shortlist becomes input to a batch conversion plan — quicksight-assessment groups analyses that share the same dataset so one Sigma data model can serve a whole family of workbooks instead of producing N near-duplicate DMs. quicksight-to-sigma consumes that plan in batch mode and runs the conversions concurrently.
Typical flow for a real migration engagement:
quicksight-assessment against the target account; review the shortlist with stakeholders.quicksight-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. Avoid pip3 as a shorthand — it can quietly resolve back to the old interpreter.describe-analysis-definition returns UnsupportedUserEditionException:describe-analysis-definition returns ResourceNotFoundException despite the analysis existing:us-east-1 regardless of where the underlying data resides. Re-run with --region us-east-1, or check your AWS console: the analysis URL shows the identity region.aws sts get-caller-identity works but the skill can't find QuickSight resources:quicksight:DescribeAnalysisDefinition, quicksight:DescribeDataSet, and quicksight:DescribeDataSource at minimum. If your profile is read-only for S3/Athena but missing QuickSight, the calls fail with AccessDeniedException. Add the QuickSight read permissions to the role.mstr.py-style SSL 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.)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.(Recommended) option.COPY INTO: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 in Sigma under Administration > Connections).convert-model.rb --fixup step names them and rewrites refs to [Custom SQL/] — never POST the raw converter output. If you're running the pipeline by hand instead of via migrate-quicksight.rb, make sure the fixup runs.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. Claude Code's safety analyzer can't pattern-match these for blanket approval even in accept-edits mode. 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 QuickSight analysis — datasets, calculated fields, visual layout, RLS rules — 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:
quicksight-assessment scopes and prioritizes the account; quicksight-to-sigma converts and verifies. The same shape applies whether you're migrating one analysis or every analysis reading from a shared dataset.describe-* APIs expose the full analysis definition (visuals, layouts, parameters), every dataset's data-prep and calc fields, and the data-source connections behind them. The converter reads the same surface a QuickSight admin would, and the output is reproducible against the same discovery dump.setup.rb has captured your Sigma credentials, the entire migration is one paste. The kickoff prompt reads the analysis ID + AWS account + 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.Prepare the Demo Data transfers to any warehouse Sigma can reach. For datasets backed by SPICE or QuickSight-internal data, materialize those upstream and the same pattern applies.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 QuickSight account.
Additional Resource Links
Blog
Community
Help Center
QuickStarts
Be sure to check out all the latest developments at Sigma's First Friday Feature page!
