Ask what a data migration costs and you get answers spanning two orders of magnitude, all technically true. That spread is not vendors being evasive. It is the honest shape of the work: two migrations that sound identical on a call can be a day apart or a month apart once someone opens the files.
This post explains where the number comes from, so you can predict your own before anyone quotes it. It names the six drivers that move the price, the costs that never appear on any quote, and the questions worth asking any vendor before you sign. We sell a migration service ourselves, so our own answers to those questions are at the end, where you can weigh them knowing who wrote this.
The cost is labour, not transfer
Moving bytes is cheap. Export files are small, imports are automated, and none of that is what you are paying for.
What costs money is judgement. Someone has to decide what three years of custom-field values become in a system that does not have that field. Someone has to rule on five source statuses landing in three destination states, map every assignee name to a real account, decide what happens to records owned by people who left, and then verify that all of it arrived. Those are decisions, not transfers, and decisions are made by people at people prices.
That is why migration is priced like a project rather than like a download. The mechanical part is a rounding error inside it.
The six drivers
When a migration quote is high or low, the reason is nearly always one of these.
1. The number of source systems. Each source is its own export format, its own mapping table, and its own verification pass. Two sources is not twice one source, because nothing learned about the first transfers to the second. A board tool plus a ticket system plus a folder of spreadsheets is three projects wearing one name.
2. The depth of history. This is the biggest single driver, and it is under your control. Live work is a bounded, current, well-understood set. Years of accumulated history multiply the volume, and old records are where the surprises live: retired fields, departed owners, conventions from two process changes ago. Choosing to archive history instead of migrating it is the single largest cut you can make to a quote.
3. Data quality. Clean, consistently-filled data maps by rule. Real data has duplicates, half-filled fields, free-text where a date should be, and three spellings of the same client's name. Every inconsistency is a human decision, and thousands of small decisions are what break estimates.
4. Mapping complexity. The distance between the source's model and the destination's. Same-shaped systems map nearly one to one. A heavily customised source, or a move between tools with genuinely different models, means somebody designs the translation before anybody runs it.
5. Attachments and comments. Records are rows; attachments are volume, and comment threads are context that often is not in the export at all. If they must survive, say so early, because they change both the method and the effort.
6. Verification. The part that makes it a migration instead of a gamble: reconciling counts against the source, spot-checking records field by field, confirming every assignee resolves to a real person. Skipping it does not remove the cost. It moves the cost three months later, to whoever discovers the gap.
Why serious quotes come after the data
Notice that all six drivers share a property: none is visible from the outside. Record counts, field sprawl, data quality, attachment volume: none of it can be known from a call, and all of it is obvious within hours of opening the actual files.
There are only two ways to price data nobody has examined: assume the worst case, or guess. Priced for the worst case, most buyers overpay. Guessed, someone absorbs the difference later, and the argument about who happens mid-project.
So the sequence that produces a trustworthy number is study first, then quote. A vendor who asks for your exports before naming a figure is doing the work in the right order. The practical consequence for you: the pre-migration inventory you should be doing anyway (counting objects, listing fields, deciding history depth) is the same material that gets you an accurate quote instead of a padded one.
The costs that never appear on a quote
Whatever a vendor charges, your organisation pays these too. Budget them, because they are real even when nobody invoices them.
- Your own team's hours. Nobody else can inventory what your data means, rule on which fields matter, or sign the acceptance checks. Even a fully vendor-run migration keeps these with you.
- The freeze window. From export to cutover, the source is frozen and the destination is not live yet. The cost is coordination and patience, and it is paid by everyone at once.
- Rewiring. Everything that read from the old system (automations, integrations, scheduled reports, saved links) breaks at cutover and is rebuilt against the new one.
- The cleanup after. However careful the mapping, the first weeks in a new system surface things to adjust. Someone's time belongs to that, on purpose, rather than by interruption.
Questions to ask any vendor before you sign
Migration terms vary widely, and the expensive surprises are the terms nobody asked about. Get answers to these in writing, before money moves:
- Is there a migration charge, and what is its published floor? If the answer is a fixed price before anyone has seen your data, re-read the section above.
- When is the number quoted? Before or after they study the actual exports?
- What does the import not carry? Every import path has exclusions. Ask for the list unprompted, in writing. A vendor who cannot produce one has not looked.
- Can we see what will be created before it is written? Previews and approval before the import runs, or discovery after it has.
- Do we pay for the subscription while the migration is in progress? When exactly does billing start?
- Is the migration charge refundable? Whatever the answer, it should be stated before purchase, not discovered after.
- Is there a free self-serve path, and what file formats does it accept?
None of these questions is hostile. A vendor with good answers will be glad you asked, because the same questions filter out buyers who would otherwise be surprised later.
Our answers
We are ROIkeep, and we sell the service this post describes, so here is that list answered for our own done-for-you migration:
- The work is quoted per job and always shown as "starts at $500". There is no cap.
- The number is quoted after we study your data. A small dataset is quoted near the floor. Years of accumulated history are quoted like the larger project they are.
- Exclusions are stated unprompted before you buy, and previews come before anything is written: you review what will be created and approve it.
- The subscription billing cycle starts when the migration is complete, not when it begins.
- The migration charge pays for work already performed and is never refunded. We say that before purchase, which is why it is in this post.
- The free path exists on every plan: self-serve importers, which accept files in our own JSON format. A raw export from another system needs reshaping first, and that reshaping is exactly what the paid service is for. Both routes are legitimate.
Whether you talk to us or to anyone else, the shape of a fair migration price is the same: a floor you can see up front, a number set by studying your actual data, terms stated before purchase, and a free path for the jobs small enough to do yourself. Get the inventory done, ask the seven questions, and the quote that comes back will be a number you understand rather than one you absorb.