Migrating from another BI tool
Move reports, dashboards, and modeling logic out of an existing BI tool into Qyra
Use this guide when you're replacing an existing BI tool with Qyra. It works for any source tool — Looker, Tableau, Power BI, Metabase, Mode, Sigma, or an in-house solution — because the process is the same: extract what you have, translate the modeling into Qyra YAML or dbt, and rebuild the dashboards on top of your new semantic layer.
The steps below are designed to be followed in order. You'll do most of the modeling work with an AI coding agent (Claude Code, Cursor, or Codex) using Qyra skills, and finish by rebuilding the dashboards visually in Qyra.
Before you start, make sure you have:
- A Qyra project connected to your warehouse. See the Quickstart.
- Admin (or export-equivalent) access to the BI tool you're migrating from.
- A dbt project (or an empty repo where one will live) connected to the same warehouse.
1. Install the Qyra CLI and skills
The AI-assisted path is by far the fastest way to migrate. Install the CLI and skills first so your coding agent knows how to write Qyra YAML, metrics, and dashboards correctly.
Follow Install the CLI and Authenticate against your Qyra project.
Run this from your dbt or YAML project root:
qyra install-skillsThis installs skills into .claude/skills/ (also read by GitHub Copilot). For Cursor or Codex, pass --agent cursor or --agent codex. To share across projects, add --global. See Install agent skills for all options.
In Claude Code, prefix migration prompts with /developing-in-qyra so the agent uses the Qyra context. Cursor and Codex pick the skills up automatically.
2. Set up your migration workspace
Before touching your source BI tool, get a clean workspace ready to receive the migrated content.
Work on a branch (for example migration/from-looker) so you can iterate without affecting production models.
Use a preview project or a separate development project so the migrated content is isolated until you're ready to promote it. This gives you a safe place to validate metrics against the source tool.
In the repo, add a folder like migration/source/ to hold everything you export from the source tool (LookML, .twb files, .pbix unpacks, question JSON, screenshots). Your agent will read from this folder.
3. Extract your source information
Pull every piece of information out of the source BI tool that Qyra will need to rebuild the reports. What you extract depends on the tool, but the goal is the same: capture the modeling logic, the queries, and the visual layout.
Choose the option that matches your source tool. If more than one applies, do them all — the more source material your agent has, the better the translation.
Modeling logic as code
If the source tool stores modeling logic in files, export those files first. This is the highest-signal input for the migration.
- Looker — clone the LookML project (
.lkml,.view.lkml,.model.lkml,.dashboard.lookml). - dbt-based tools (Metabase Metrics Layer, Mode with dbt) — you already have the source; note which models are actually used by the reports.
- Sigma / Hex / Omni — export workbook or dataset definitions as JSON or YAML where the tool supports it.
Copy the files into migration/source/ in your repo.
Workbooks and reports as files
If the source tool stores reports as binary or archive files, unpack them so the agent can read the SQL and field definitions.
- Tableau — save workbooks as
.twbx(packaged) then unzip to expose the underlying.twbXML. The XML contains data source definitions, calculated fields, filters, and worksheet layouts. - Power BI — export
.pbixfiles and unpack them (for example with a.pbixviewer orpbi-tools) to extract the data model, DAX measures, and report layout as JSON/XML. - Mode / Metabase / Redash — export questions or reports as SQL. Group them by dashboard so you know which queries feed which report.
Put the extracted files under migration/source/<tool>/.
API extraction
For SaaS BI tools without a file export, pull the definitions through the API. This is usually the best route when there are hundreds of reports and manual export isn't practical.
- Looker — Looker API endpoints for
looks,dashboards, andqueries. - Tableau — Metadata API for workbooks, data sources, calculated fields, and lineage.
- Power BI — REST API for datasets, reports, and DAX definitions.
- Metabase —
/api/cardand/api/dashboardfor questions and dashboards. - Mode —
/api/{workspace}/reportsfor reports and their queries.
Write a small script to dump the responses to JSON in migration/source/api/. Include the raw SQL, field definitions, filters, and any joins.
Direct SQL
For everything else — bespoke reports, undocumented queries, ad-hoc dashboards — capture the executed SQL. Query your warehouse's query history (Snowflake QUERY_HISTORY, BigQuery INFORMATION_SCHEMA.JOBS, Redshift STL_QUERY) filtered to the BI tool's service user to see what actually runs in production. Save the top queries by frequency into migration/source/sql/.
4. Take screenshots of the source dashboards
Screenshots are the reference for rebuilding the visual layer. Your coding agent can't see the source tool, so it needs the images to match layout, chart types, and filter positions.
Take a full-page screenshot of every dashboard you're migrating. Include the filters, tab structure, and any drilldowns.
For complex visualizations (custom colors, conditional formatting, mixed chart types), take a zoomed-in screenshot too. Also grab the underlying query where the source tool exposes it.
Save them under migration/source/screenshots/, named by dashboard. Reference them in your prompts so the agent uses them when rebuilding layouts.
5. Translate the modeling into Qyra
With everything extracted, use your coding agent to translate the source modeling into Qyra's semantic layer. Do this in passes — models first, then metrics, then joins — rather than all at once.
Point the agent at both the source files and your warehouse schema. For example:
/developing-in-qyra
Read the LookML files under migration/source/looker/ and profile the
corresponding tables in our warehouse. For each Looker view that
underlies a dashboard in migration/source/screenshots/, propose a
Qyra model with matching dimensions and metrics. Do not create
files yet — list the models and metrics you plan to create.Review the plan before letting it write files.
Ask the agent to write the Qyra YAML (or dbt meta tags) for one source at a time. See Qyra YAML for the format. After each file, run:
qyra lintFix errors before moving on.
Map source metric types to Qyra metric types. Common mappings:
| Source | Qyra |
|---|---|
Looker measure: sum | type: sum metric |
Looker measure: count_distinct | type: count_distinct metric |
| Tableau calculated field (agg) | Qyra metric with sql |
Power BI DAX SUMX / CALCULATE | Qyra metric, or a dbt column plus a sum metric |
| Metabase custom expression | Qyra metric with sql, or a table calculation if it's row-level |
Ask the agent to add descriptions and categories so the migrated fields land in the metrics catalog cleanly.
Translate source joins to Qyra joins. Specify the relationship (one-to-many, many-to-one, one-to-one) — this is what unlocks correct fan-out handling.
qyra deployThen run qyra validate to catch broken references.
6. Rebuild the dashboards
With the semantic layer in place, rebuild the dashboards on top of it.
Open each source dashboard screenshot side by side with Qyra. For each chart, build the equivalent in Qyra using the migrated metrics and dimensions. See Configure charts and the chart types gallery.
If you'd rather do this conversationally, ask your agent to build the dashboards for you — it can generate content as code from the screenshots and the migrated models.
Recreate the source dashboard's filter set with dashboard filters and multi-tab layouts. Match the visual grouping from the screenshots.
For every migrated dashboard, run the same query in the source tool and in Qyra and compare the results. Any mismatch usually points to:
- A missing or mismapped join
- A different aggregation type
- A silent filter in the source tool (default date range, hidden user filter)
- A timezone difference — see Set the project timezone
Do this before you cut anyone over.
7. Layer in best practices and the customer's own conventions
Once the content works, take a pass to align it with Qyra conventions and any modeling standards the team already follows.
- Follow Qyra's modeling guidance. Read modeling strategies and apply it: name fields consistently, keep grain explicit, use pre-aggregates where warranted.
- Apply the customer's own style guide. If the team has a metric naming convention, category structure, or documentation standard, feed that into the agent as extra context so the migrated fields match. Skills read anything in the project — a
MODELING_GUIDE.mdat the repo root is often enough. - Write good descriptions. See Writing descriptions. Migrations are the best time to fix the descriptions that never got written in the source tool.
- Verify canonical content. Mark the migrated dashboards and charts as verified content so users know which reports are the source of truth going forward.
- Set up promotion. Once validated in preview, use content promotion to move dashboards to production.
- Plan the cutover. Announce a date, keep the source tool read-only for a defined grace period, and use scheduled deliveries to replace any recurring exports from the old tool.
Common pitfalls
- Migrating everything. Most BI tools carry hundreds of stale reports. Use warehouse query history to see what's actually used, and migrate that subset first.
- Trying to match the old tool 1:1. Qyra's metric definitions are reusable across charts. Consolidate duplicates instead of copying every one-off calculated field.
- Skipping joins. LookML
exploresand Tableau data sources bake in joins that aren't obvious from the SQL. Read the model definitions, not just the queries. - Forgetting user attributes and access. Row-level filters and user attributes from the source tool need to be re-modeled with Qyra user attributes.