Data Migration
Move history you must keep — without a Monday surprise.
Data Migration
Yesterday’s orders findable on day one.
Not a weekend hope
Data migration is the work of making yesterday findable on day one in the new system. It is not a clever import button. It is not “we will take care of the Excel.” It is mapping, cleaning, rehearsal, and a parallel check until a clerk can answer a customer with last year’s bill number and not blush. LavisTech treats that as its own job. We are a Chengannur shop. We have watched Monday mornings die because someone pasted opening stock on Sunday night and went home.
If your vendor hid migration inside a build quote as a single line, you do not have a migration plan. You have a hope. Hope is not a cutover. The new screens can be beautiful and still useless if item codes collide, customers exist three times, and GST history is a folder of PDFs nobody indexed.
This page is about moving history you must keep: Excel, Tally, Access, an old ERP, a desktop billing tool that only one person can export. It sits next to a custom ERP or any other system that will become the new place of work. It is not a colour theme. It is not a training video. It is the reason go-live slips, and the reason it should.
Its own job, not a line hidden in a build quote
A build quote prices screens, roles, and integrations. A migration quote prices sources, mappings, cleaning rules, rehearsals, and the days when two systems are both true. Mixing them into one fixed number is how the number moves when the first spreadsheet has three header rows and a tab named “final_final2.” We price migration as a phase you can see. If the build is ready and the data is not, we do not flip the switch to look busy.
That split also keeps the build honest. Developers stop treating “import the Excel” as a Friday task. You stop believing a demo with twenty clean rows is a rehearsal. Twenty clean rows are a screenshot. Ten years of Kerala trade data is a project.
Read how much custom software costs for the shape of a serious estimate. Then add a second column for migration. If that column is empty, the estimate is not for going live. It is for a demo.
What we migrate from
Excel and CSV are the common case: items, customers, opening balances, a sales register someone kept because the old software could not. Tally exports for ledgers, stock, and vouchers you still have to explain to an auditor. Access and old desktop databases that only run on one Windows 7 machine in the stores office. An old ERP that can dump tables but not meaning. Sometimes a folder of GST returns and e-way PDFs that have to become numbers again.
We do not need the brand of the old system to start. We need a sample that includes the ugly rows, not the pretty ones. Send the sheet the purchase clerk actually uses. Send the Tally export that still has cancelled vouchers. Send the Access table with the blank item codes. If you only send the tidy report for the board, we will migrate a fiction.
WhatsApp is not a source we can import, but it is often the missing key: the informal item name, the customer who has two GSTINs, the order that never entered the old software. We write those exceptions down. We do not pretend a chat history is a database.
Mapping before anyone writes an importer
A mapping is a table: old field, new field, rule, who decides when the rule fails. “Name” to “Customer name” is easy. “City” that sometimes holds a mobile number is not. “Item code” that is unique except when it is not — that is the job. We write the mapping in a sheet you can argue with. Developers do not invent synonyms in the importer.
Units of measure belong in the mapping. So do tax categories, godowns, and the difference between a bill-to and a ship-to that the old system stored as a note. If the new system has a field the old world never had, we say whether we default it, leave it blank, or stop the row. Silent defaults on GST or stock are how you fail a parallel check and not know why.
You will spend hours on this even if you hire well. Someone who knows the items has to sit with the mapping. That is not us being difficult. That is how we avoid encoding a guess about a product that is sold by kilo in one branch and by packet in another.
Cleaning, including half-unique item codes
Half-unique item codes are the classic Kerala trading mess: the same physical thing under three codes, or three things under one code, or a code that was reused after a product died. Customers have the same disease — phone as name, GSTIN missing, “cash” as a party, the owner’s relative entered twice. Cleaning is deciding which row wins, which row merges, and which row is retired with a forwarding pointer so old bills still open.
We do not “dedupe with AI” and call it a day. A model can suggest likely pairs. A person who knows the counter confirms them. The confirmation is logged. If you skip the person, you will invoice the wrong GSTIN on the week you are busiest. That is not a clever algorithm. That is a Monday you cannot undo.
Cleaning also means dates that are text, quantities that are “10+2”, rates that include tax except when they do not, and opening balances that were typed to make last year’s trial balance look right. We will flag those. We will not silently “fix” a trial balance we did not own.
Opening stock is a decision, not a paste
Opening stock is where migrations go to die. Quantity on a sheet, quantity in Tally, quantity on the shelf, and quantity in the supervisor’s head are four numbers. The new system can hold one. Someone has to pick the rule: freeze a count, accept Tally, accept the sheet, or delay go-live until a physical count exists. We will not paste a sheet over a live warehouse and hope the variance is small.
Serial-tracked items, batches, and expiry dates make this worse. If the old world never stored batch, the new world cannot invent it. You either live without batch history for old stock, or you count. There is no importer clever enough to create batches that were never recorded.
We rehearse opening stock on a copy. We print the exceptions. Warehouse and accounts both sign the rule. If they will not sign, we do not cut over. A fight after go-live is more expensive than a fight in a spreadsheet with a date on it.
GST history you still have to explain
You may not need every invoice since GST began inside the new operational system. You do need a way to answer “what did we file for that GSTIN in that month” without walking to a cupboard. That can be a read-only archive, a document store, or a careful import of registers. It is rarely “load five years of vouchers into the live sales table and let staff edit them.”
Live tables and archive tables are different jobs. Mixing them is how a clerk “corrects” a filed invoice and creates a second reality. We will say which history is operational (open orders, unpaid bills, current stock) and which history is reference. If an auditor needs the reference, we make it searchable. We do not make it casually editable.
E-invoicing IRNs, e-way bills, and credit notes that never quite matched the invoice are mapping work. They are not a weekend of copy-paste. If your new system will raise e-invoices, we migrate the identifiers you must not reuse. If we cannot find them, we stop and ask — we do not mint new history.
Rehearsal, then another rehearsal
A rehearsal is a full run against a copy: extract, clean, load, then the checks you will run on the real night. The first rehearsal finds the mapping holes. The second finds the ones you invented while fixing the first. We budget more than one. Teams that budget one rehearsal discover the real problems on the cutover night, with the counter waiting.
Rehearsal includes time. How long does the extract take? How long does the load take? What do we do if Tally is still posting at 7 p.m.? A migration that only works when nobody is working is a migration you cannot run. We write a clock, not just a script.
You will see reject files. Rows that fail a rule should fail loudly, with a reason a clerk can read. A load that “succeeds” by skipping the ugly rows is a failed rehearsal, even if the dashboard is green.
Parallel check until yesterday matches
After a load, we do not ask whether the row counts are “close.” We pick a list of bills, items, and customers the business cares about and we walk them. Yesterday’s last ten invoices. The top fifty items by value. The customer who always argues. Opening stock in the two godowns that fight. GST totals for a closed month, if that month was in scope.
Parallel run means both systems stay true for an agreed window. New work may go into both, or into the old one with a nightly sync, depending on risk. Money and stock want a longer parallel than a mailing list. We will not cut a trading company over on a Saturday because the screenshots looked fine on Friday.
The definition of done is a signed check, not a feeling. If the parallel fails, we fix the mapping or the clean rules and rehearse again. We do not “go live anyway and clean as we go” on opening stock. That phrase means the warehouse will run two truths until someone quits.
Cost and calendar
A small, clean source — one Excel book with honest unique keys and a person who will answer questions — can be weeks, not months. A Tally-plus-Excel-plus-Access move with half-unique codes, two godowns, and GST archive is a phase of its own: often a month to several months beside the build. A full old-ERP extraction with undocumented columns is longer, because the first weeks are archaeology.
We will not invent a rupee total before we have seen the ugly extract. Discovery for migration is cheap compared with a fixed price on a file we have not opened. If you want a band, bring the real files. If you want a number on a first call, you will get a marketing number. We will not give you one.
Your hours are part of the calendar. Mapping workshops, clean decisions, and parallel checks are not something we can do from the dump alone. Plan for a knowledgeable person several times a week on a messy source. If that person does not exist, pause. Hiring us does not create memory of your items.
What we need from you
- The real extracts, including cancelled and duplicate rows.
- A person who can say which item code is the survivor.
- A rule for opening stock, written down, with names.
- A list of “must find on day one” bills and parties for the parallel check.
- Clarity on what stays in Tally, and what the new system must hold.
Access to the old machine matters. If the only Access database lives on a PC that cannot leave the stores, we come to the stores or we get a sanitized copy. We do not design an importer from a description of the screens.
What done looks like
Staff can find last year’s bill by the number they already know. Opening stock matches the signed rule, not a hope. Rejected rows have an owner and a date. Archive GST is searchable if it was in scope. The new system is the place they look first. The old system is read-only or off, on purpose, not because someone pulled a plug.
You also get the mapping, the clean rules, and the scripts. The next branch or the next year should not be folklore. If a vendor migrates you and leaves only a live database, they left you a second hostage.
Failures we have watched happen
Go-live on a festival week because someone promised a date. Importing “cash” as a hundred customers. Unique constraints that were not unique. Stock in cases while sales are in pieces, with no conversion. A Tally export that omitted cancelled vouchers, so the new books look better than the old ones and nobody trusts either. A clever fuzzy match that merged two different GSTINs because the names were similar.
Another failure: treating migration as proof that you needed a full custom ERP when a tighter system plus a clean archive would have done. Migration does not decide the product. It decides whether the product you chose can tell the truth on Monday. If you are still choosing build versus a package, read custom versus off-the-shelf first — then price the move either way. Packages do not make mapping free. They often make it slower, because the target fields are someone else’s idea of a customer.
How to start
Send one ugly extract and the sentence “we must find X on day one.” X is a bill, an item, a party, or a stock figure. That sentence is the first test. We will tell you whether we are looking at weeks or at a phase, and what we still need to see. Do not wait until the screens are finished. Screens without yesterday are a showroom.
If you already have a build in flight and no mapping, stop adding modules and open the files. The cheapest day to discover half-unique codes is the first day, not the Saturday before training.
To walk through a source and a cutover clock, contact us with the systems you are leaving and the one you are entering. We will say whether this is an import story or a programme. We will not call it a weekend.
Have a project in mind?
Let's talk about how we can help your business grow.
Get in Touch