Migration
Migrating from Blesta: preflight and reconciliation
Blesta models clients, services and transactions in ways that do not map one-to-one. A preflight that imports nothing is the cheapest way to find out.
10 min read · Reviewed 2026-09-21
Move customers, services and domains as live records, and bring invoices — open ones included — payments and credits across as historical evidence rather than as records your new system will act on. Plan the balances still owed separately, with exactly one system entitled to collect each. Reconcile by totals per customer per year before you switch, and keep the old system readable for as long as your record-keeping obligations require.
WHMCS migrations go wrong in a predictable place. The live data — customers, products, services — moves reasonably well, because it describes the present. The financial history does not, because it describes decisions made under rules that no longer exist: tax rates that changed, a product that was renamed, a credit applied by somebody who has left. And it is the part you cannot reconstruct if you get it wrong.
| Data | Category | Why |
|---|---|---|
| Customers and contacts | Live | You will act on these tomorrow |
| Services and domains | Live | They renew, suspend and get supported |
| Open invoices | Evidence | The document is history, like a paid one. It is not how the balance gets collected |
| Outstanding balances | Cutover plan | Collected by exactly one system, decided per balance and reconciled at the switch |
| Paid invoices | Evidence | Immutable history. Do not let a new system recalculate them |
| Payments and refunds | Evidence | Same. The totals must not move |
| Support tickets | Evidence | Read, searched, occasionally reopened |
| Product definitions | Rebuild | Copying old products imports old mistakes |
The distinction matters because a new system will happily recalculate a historical invoice against its own tax rules and produce a different number. A paid invoice from 2023 is a statement of what happened. It should be stored, displayed and never recomputed.
An open invoice is two things at once: a document, which is history, and a balance, which somebody still owes. Import the document as evidence. Plan the balance on its own:
Stopping the old system invoicing some time before the switch does not remove the risk; it moves it. Whatever falls due in between is billed by nobody, unless the plan says who.
Pick totals that are cheap to compute on both sides and compare them:
Any difference is a finding, not a rounding error. Chase each one to a cause before you go further — likely causes include deleted-but-referenced records, multi-currency totals summed as one number, and credit notes counted as invoices.
Step three is the discipline that makes the rest work. Every manual fix during a migration is a difference between staging and production that nobody will remember on the day.
The services exist on real servers, and those servers do not know you are migrating. The new system must be able to recognise an existing hosting account as belonging to a customer without creating a new one — and it must not do that by matching a username, which is a guess. Require evidence, or require a person to confirm it explicitly, one account at a time.
GENV has a migration workbench that imports customers, services, domains, financial history and support threads, with a mapping step, a preflight that checks a manifest and imports nothing, and a reconciliation view that compares what arrived with what was claimed.
GENV imports invoice history as evidence that collects nothing. Every imported invoice — paid or open — lands in its own tables and stays there. None becomes a GENV invoice, and the invoice number series counts only what the workspace has itself issued; the importer cannot write into it, which the schema enforces and a migration test checks. An imported open invoice cannot enter a customer's balance, an ageing report, a payment reminder or a renewal. So an outstanding balance needs the plan above: GENV keeps the record of what your old system said was owed, and who collects it is a decision you make and reconcile outside the import. The WHMCS documentation is at docs.whmcs.com.
Long enough to answer questions about the last closed accounting period, and for as long as the tax and record-keeping rules where you trade require those records to stay available. Read-only is enough.
Customers and services, yes — by server or by product. Financial history can be staged too, provided every period ends up with one consolidated, reconciled record: each invoice and payment counted once, in one place, with totals that agree with the source. What to avoid is a year split across two systems with nobody reconciling the halves.
Treat the invoice and the balance separately. The invoice is history: import it as a record of what the old system said, and in GENV it stays exactly that — it cannot be collected, age or trigger a reminder. The balance needs its own plan: decide which system collects each one, reconcile the outstanding total on both sides at the switch, and move billing authority at one recorded moment so that only one system is ever entitled to bill a customer for a given period. That avoids both double billing and a gap in which nobody bills.
Official documentation, each requested on 21 September 2026. Provider behaviour changes; check the source before relying on a detail.