Inventory and classify first
Every .rpt file is listed with its owner, run frequency, data source, and a recommendation: rebuild interactive, keep fixed-layout, merge, or retire. You approve the list before anything is built.
Retiring Crystal Reports
We inventory the .rpt estate, classify what people still read, then rebuild it on a governed model: parameters become slicers, embedded SQL becomes a documented query, and the print-perfect output finance signs off on keeps its layout.
Representative dashboard — sample data
Why teams move
A Crystal estate is rarely retired because someone dislikes the tool. It is retired because the reports have outlived the people who wrote them. The formulas are undocumented, the designer runs on one aging desktop, the reports connect straight to the production database over ODBC, and every change request turns into an archaeology project. Meanwhile the business already pays for Microsoft 365 and wants the same numbers somewhere people can filter them.
The work divides into three honest parts: finding out what is actually read, rebuilding those reports on a proper semantic model, and proving the outputs still agree with the originals. Skip the first and you pay to rebuild reports nobody opens. Skip the third and adoption collapses the first time two figures disagree at month-end.
What the migration covers
Start with a block of prepaid Flex hours and, if you're unhappy within the first 4 hours, we refund you in full — no questions asked. The report inventory makes a good first task: it tells you the true size of the job before you commit a budget to it.
How we approach it
The hard part of leaving Crystal is not drawing charts. It is finding where the logic hid, deciding what still deserves to exist, and keeping the print output that a regulator or a customer expects.
Every .rpt file is listed with its owner, run frequency, data source, and a recommendation: rebuild interactive, keep fixed-layout, merge, or retire. You approve the list before anything is built.
Record selection formulas, formula fields, running totals, and the joins in the database expert get read and written down before a single visual is drawn. That document usually outlives the migration.
Most subreports exist because Crystal needed a second query. On one shared model that need usually disappears, and the subreport becomes a matrix, a second visual, or a drillthrough page.
Parameters that forced a rerun every time somebody wanted a different branch become slicers users drive themselves — and stay as report parameters where a scheduled PDF still needs them.
Invoices, remittance advice, and statutory packs are not dashboards. Those stay fixed-layout so the page breaks, headers, and totals land exactly where the recipient expects them.
Direct ODBC connections that ran heavy queries against live tables are replaced with a governed Import or DirectQuery model through a gateway, on a refresh schedule your DBA agrees to.
Crystal is a banded report writer: you design against sections, and each report carries its own connection, query, and calculations. Power BI splits that into two layers — a semantic model holding the data and the measures, and reports that visualise it. A migration is therefore a rebuild with a known map, not a file conversion, and the map is what keeps it predictable.
The consequence worth understanding up front is that logic stops living inside individual reports. In Crystal, two reports can filter the same table differently and both look authoritative. In Power BI that definition is settled once in the model. Expect that conversation early; it is the most valuable and most political part of the project, and the reason we classify before we build.
This is the working map we build the plan from. It is deliberately dull, because the point of a migration is that nothing surprising turns up in week three.
| Crystal Reports | Power BI equivalent | What changes in practice |
|---|---|---|
| Report file (.rpt) | Report (.pbix) plus a shared semantic model | Data and calculations move out of the file into a model many reports reuse |
| Subreport | Additional visual, matrix, or drillthrough page on the same model | Usually merged into one report; only genuinely separate content stays separate |
| Parameter prompt | Slicer or filter (report parameter in a paginated report) | Users change the view themselves instead of re-running the report |
| Record selection formula | Power Query filter, DAX filter, or row-level security | Filtering becomes explicit and testable rather than hidden in the report |
| Formula field | DAX measure, or a column in Power Query | Most become measures; columns only where a row-level value is truly needed |
| Running total field | DAX measure using time intelligence or a running-total pattern | Rebuilt against a proper date table so period comparisons work everywhere |
| Group headers and footers | Matrix row groups, or RDL groups in a paginated report | Banded sections become grouping and totals defined in the visual |
| SQL command / stored procedure source | Power Query source query, database view, or the procedure retained | Query logic is documented, then split between the database and the model |
| Direct ODBC or OLE DB connection | Import or DirectQuery through an on-premises data gateway | Scheduled refresh replaces ad-hoc queries hitting production tables |
| Pixel-perfect print layout | Paginated report built in Power BI Report Builder | Page layout, breaks, and repeating headers are preserved for printed output |
| Scheduled export or emailed PDF | Subscription from the Power BI service | Delivery moves onto the same platform as the reports themselves |
Because record selection formulas and stored procedures often carry the real business rules, that unpacking is a task in its own right. Transformation logic that belongs upstream goes into Power Query (opens in new tab); aggregation logic becomes measures on a star-schema model, which is the data modeling and DAX half of the job. Microsoft's own Power BI migration guidance (opens in new tab) follows the same sequence: assess and prioritise the estate before you rebuild any of it.
This is the objection that stops most Crystal migrations, and it is a fair one. A standard Power BI report is built for interaction on a screen: a table you scroll prints only the rows that were visible. An invoice, a statement, or an audit pack has to print every row, break pages in the right places, and repeat headers and footers exactly.
That work belongs in a paginated report (opens in new tab), authored in Power BI Report Builder, which gives exact page-layout control and prints all the data in a table across as many pages as it takes. Microsoft documents export to PDF, Excel, Word, CSV, and other formats, plus email subscriptions that attach the rendered output — the closest equivalent to the scheduled Crystal export most teams are replacing. Confirm your workspace and capacity plan against Microsoft's current licensing documentation before committing to a design.
In practice an estate splits cleanly: anything a person explores becomes an interactive report on the shared model, and anything a person prints, files, or sends to a customer stays fixed-layout. We make that call during classification and record the reason, so it is auditable later.
Work runs on prepaid Flex hours that never expire: Starter 20 hours ($2,500), Growth 40 hours ($4,600), or Power 80 hours ($8,000), with hourly work from $100/hour. Inventory and classification of a typical mid-market estate fits inside a Starter block, and it is the task we recommend buying first, because it converts an unknown number of report files into a scoped list with hours against each line.
After that, cost tracks how many reports survive classification and how much logic they carry. A parameter-driven listing with two totals is a very different job from a six-subreport statement pack with nested selection formulas. You get an estimate in hours per report, approve only what you want built, and unused hours stay banked. See Flex pricing.
Individual reports typically ship within 3–5 business days of approval, and a phased migration is a sequence of those tasks rather than one project ending in a big-bang cutover. Larger estates get a clear timeline and order once the inventory is done: highest-value and highest-risk first, the long tail last.
Running Crystal alongside Power BI for one full reporting cycle is worth the overlap. Users compare both outputs on live data, and the old designer is switched off only once the replacements have been through a real month-end.
Finance, operations, and IT teams carrying a Crystal estate they can no longer maintain comfortably: an ERP that ships .rpt files, a designer nobody has upgraded, reports hitting production directly, or a knowledge gap left by whoever wrote the formulas. It is a poor fit for anyone wanting a like-for-like copy with no decisions made — that buys a more expensive version of the problem you already have.
business days per report
not big-bang
own everything
Buy the inventory task first and decide the rest once the real scope is visible. Still weighing a rebuild against a repair? When to rebuild a Power BI report frames the call.
How it works
We catalogue every report with owner, run frequency, source, and complexity, then classify each as rebuild, keep fixed-layout, merge, or retire. You approve the list and the hours behind it before work starts.
Surviving reports are rebuilt highest-value first on one governed model: formula fields become tested DAX measures, embedded SQL is unpacked, parameters become slicers, and print packs are built fixed-layout.
Each report is run beside its Crystal original, differences are explained, then we publish, set refresh and permissions, walk your users through it, and stay available on the hours you have left.
Representative perspective
We thought we had to move everything. Classification showed most of the folder was seasonal reports and one-off exports, and what genuinely mattered fitted on a single page.Controller, mid-market distributor
Representative perspective
The question that decided it for us was the customer statements. Once we saw those still printing exactly as before, the rest of the migration stopped being an argument.IT manager, manufacturing group
Tell us roughly how many report files you have and which ones month-end depends on. We'll scope the inventory and classification task in hours, so you can see the real project before committing to it.
FAQ
No. A .rpt file stores its logic in record selection formulas, formula fields, and subreports that have no direct Power BI equivalent, so reports are rebuilt rather than converted. What is systematic is the inventory, the classification, and a reusable pattern library that turns familiar Crystal constructs into DAX.
Most subreports exist because Crystal needed a second query against a different grouping or a different table. On a shared semantic model that second query is usually unnecessary, so the subreport becomes another visual, a matrix, or a drillthrough page. Where it genuinely stands alone, it becomes its own report.
Yes, through paginated reports built in Power BI Report Builder, which give exact page-layout control and print every row across as many pages as needed. Invoices, statements, and statutory packs stay fixed-layout; the interactive analysis moves to standard reports. We decide report by report which format fits.
They are read, documented, and usually moved. Filtering and joins go into Power Query or a database view, while aggregation logic becomes DAX measures so it can be reused. Stored procedures that encode genuine business rules often stay in the database, with the model consuming their output.
Each rebuilt report is run beside its Crystal original on the same parameters and date range, and every difference is explained before sign-off. Some differences are corrections: a rebuild frequently exposes a selection formula or join that quietly excluded rows nobody had questioned in years.
This page covers the Crystal path specifically. If your legacy reporting is a mix of tools, our broader migration to Power BI service covers the Excel and Qlik routes, an RDL estate on a report server is handled on the SSRS to Power BI migration page, teams retiring an IBM stack should read the Cognos to Power BI migration page, where Framework Manager packages and stitch queries are rebuilt as a star schema, and moving off Tableau has its own Tableau to Power BI migration page. Crystal usually arrives as one half of a wider SAP estate: if Universes and Web Intelligence documents sit alongside these .rpt files, the semantic-layer rebuild is scoped separately on our SAP BusinessObjects to Power BI migration page, and the two workstreams are planned together so the banded output and the ad-hoc reporting land on the same model. If you are running Domo, our Domo to Power BI migration page maps cards, Beast Modes, Magic ETL, PDP and Workflows into Power BI one by one. Once the numbers are rebuilt, Power BI report design makes the replacements clearer than the originals rather than merely equivalent, and Power BI consulting covers the workspace, licensing, and governance decisions a first rollout brings. Every task is scoped before work begins from your prepaid block of senior-led hours, and hours are deducted only for work you approve.
Book a free demo
Tell us the task. We scope it, you approve, and a senior consultant delivers — typically in 3–5 business days. Prepaid hours that never expire.
The fastest way to reach us is the form — tell us the task and we'll reply within one business day.