Migrate to Apache Fineract with Excel bulk import: what the move involves
A team leaving a legacy core banking system or a spreadsheet estate for Apache Fineract usually starts with the same question: how much of the move can the platform's own Excel bulk import carry? The short answer is that the import handles setup and static data well, meaning offices, staff, clients, groups, products and opening accounts, while running loans with repayment history and large volumes need a deliberate choice between the import, API scripts and a combination of both. Decide that split early, because it determines which data you can load through spreadsheets and which needs a controlled, replayable process.
Effort in this kind of move is driven far more by data quality and product mapping than by the import itself. Every legacy product has to be translated into a Fineract loan or savings product with explicit interest, fee, charge and accounting settings, and every spreadsheet column has to match a template field exactly. Confirm, before loading anything, which fields each template in your Fineract version accepts, how your legacy identifiers will map to Fineract IDs, and who signs off on product definitions. Most rework comes from discovering these gaps after the first test load.
The Fineract project states that production deployments can be complex, costly and time-consuming, that it does not publish a comprehensive production deployment guide, and that organizations may pay a vendor for deployment and maintenance. Treat the migration as one part of that wider work, covering hosting, database, security and operations. Ask any implementation partner, including DeployOpen, for a written scope that separates the one-time migration work from the recurring support and upgrade work, and confirm the template and API behavior against the release you will run.
Which source data maps cleanly to Fineract and which does not
This table compares common source capabilities with their Fineract equivalent and gives a migration note for each. Read the Fineract column as the place where a template field or product setting exists, and treat rows marked as redesign items as decisions to make before any spreadsheet is filled in.
| Source capability | Fineract equivalent | Migration note |
|---|---|---|
| Branch hierarchy | Offices with parent-child structure | Maps cleanly. Load the parent office before children and confirm the office import template covers your hierarchy depth. |
| Staff and roles | Staff records linked to offices, plus user roles and permissions | Staff maps well, but permissions are not carried over from the source. Rebuild roles in Fineract and confirm which staff fields the template accepts. |
| Clients and KYC | Client records with identifiers and documents | Core identity fields usually map. Scanned KYC documents are not spreadsheet data, so plan a separate document upload step. |
| Loan products | Loan product definitions with interest, fee and schedule settings | Maps only where your rules match Fineract product settings. Products with custom rule combinations need redesign before import. |
| Savings products | Savings product definitions with interest posting settings | Usually maps, but confirm interest calculation and posting options against your current rules. |
| Running loans with history | Loan accounts with disbursements and repayment transactions | Partial fit. Templates can load balances and schedules, but replaying full history depends on the template coverage for your version. See the sibling migration pages. |
| Fees and charges | Charge definitions attached to products or loans | Flat and percentage charges usually map. Penalty logic or charges triggered by custom events typically need redesign. |
| Interest rules and day-count conventions | Interest calculation settings on products and loans | Standard methods map. Custom accrual logic or unusual day-count rules have no direct setting and must be redesigned and tested. |
| General ledger balances | Opening journal entries and the chart of accounts | Opening balances load through journal entries, but the mapping from your ledger codes to Fineract GL accounts is a design task. Confirm journal entry template fields for your version. |
| Custom fields | Custom data tables attached to entities | Fields with no matching template column need a data table or a scripted load. Confirm which entities accept custom data in your version. |
Documented import paths Fineract provides
Fineract gives you more than one way in, and each path fits a different kind of data. The Excel bulk import covers the reference data and first-load records most migrations start with, the REST API handles what templates cannot express, and the batch endpoint groups those calls so related changes succeed or fail together. Confirm each path against the 1.x documentation for your exact release before you commit the plan.
Excel bulk import templates
Fineract's bulk import uses downloadable spreadsheet templates for offices, staff, clients, groups, products, accounts, repayments and opening journal entries. It suits reference data and a first load that operations staff can review line by line. Confirm for your release which entity templates exist, which columns are mandatory, and whether repayments and journal entries are supported for the type of balance you need to load. Template layouts can change between versions, so re-download them for every rehearsal.
Load order and dependencies
Templates depend on each other. Offices must exist before staff, staff before clients who are assigned to them, and clients and products before accounts. A spreadsheet row that references a missing office or product fails even when its own columns are valid. Write the load order into the plan and confirm it against the entity relationships in the current documentation.
REST API for scripted loads
The REST API exposes the same business operations the templates use, along with entities the templates may not cover. Scripts give you repeatable reruns, parameterized data and programmatic checks against the results. Each call needs authentication and the Fineract-Platform-TenantId header, so confirm how your tenant and credentials will be provided to the loading team before writing code.
Batch endpoint for grouped requests
The batch endpoint sends several API requests in one HTTP call and can group them so that dependent changes, such as a client and its first account, are applied together. This reduces partial loads when a step fails midway. Confirm in the 1.x documentation how batch responses report individual failures and whether every endpoint you need can be batched.
Coverage and version checks
Before you rely on any path, list every entity your data set needs and check it against the documentation for the exact 1.x release you will deploy. Note which entities are template-driven, which need the API, and which have no import path at all. Record the version you tested so that the plan stays valid after a quarterly release, since the README states that releases are created quarterly.
Load order, pilot, parallel run and cutover
This sequence turns a set of Excel templates into a controlled migration by loading Fineract in dependency order, proving each stage against the source system, and only then retiring the old platform. The output is a signed-off cutover with a reconciliation record for every load.
Inventory and map source data
Start by listing every data set the source systems hold: branches, staff, clients, groups, product terms, open accounts, balances and ledger positions. For each one, record the source owner, the Fineract template it will populate, the field mapping and the transformation rules, such as date formats, currency codes and identifier conventions. Agree the mapping with finance, operations and risk before any file is built. The output is a signed mapping document and an extract for each data set with a row count recorded at source, which becomes the baseline for every later reconciliation.
Configure offices and products first
Fineract resolves most references by identifier, so offices and their hierarchy must exist before staff can be assigned to them, and loan and savings products must exist before any account can reference them. Load offices from the template, then build the products in the Fineract interface or through the API, including interest, fee, charge and accounting settings. Confirm with the product owner that each product behaves as the written terms describe. The check that closes this step is a printed product configuration per product, reviewed against the terms sheet and signed off before anything depends on it.
Load staff, clients and groups
Import staff next, because clients and loan officers reference them, then clients, then groups and centers that reference clients and offices. Load in small test batches first and review every validation error the import returns, correcting the source file rather than editing records by hand so the next run stays repeatable. Confirm KYC identifiers and mandatory custom data are present. Close the step by comparing counts of offices, staff, clients and groups in Fineract against the baseline from the mapping, and resolving every difference before moving on.
Load accounts and opening balances
Create loan and savings accounts only after their clients, groups and products are confirmed. The approach for balances depends on the decision made during mapping, whether you load outstanding balances directly or replay history, so confirm that choice is applied consistently. Check that disbursement and opening dates sit correctly against the business date, and that interest and schedule outputs match the source for a sample of accounts. The gate is a per-account comparison of principal, interest, fees and savings balances against the source extract, with any exceptions documented.
Post opening journal entries
Load the opening general ledger positions last, after accounts exist, so that every balance has a traceable owner. Post the entries as a single opening position per accounting date, with debits and credits balancing to zero. Compare the resulting trial balance with the source ledger and with the sum of the account-level balances loaded in the previous step. The output is a trial balance that agrees with the source to the currency unit, and a record that the subledger totals match the general ledger control accounts.
Run a pilot office
Choose one branch that is representative but manageable, and run the full sequence for that office only. Operate it in Fineract for a defined period while the source system remains the book of record for everyone else. Staff perform live transactions, including disbursements, repayments, savings movements and closures, and each transaction is checked against the expected outcome. Record every defect and feed it back into the mapping and templates. The pilot closes when the pilot office reconciles cleanly and the defect log has no open items affecting balances or schedules.
Reconcile and run in parallel
Before cutover, run both systems side by side for the scope agreed in the plan. Each business day, compare client and account counts, principal and interest per loan, savings balances and trial balance totals between the source and Fineract, and investigate any difference the same day. Keep a dated reconciliation log that finance and operations both sign. Parallel running is the most expensive stage in staff time, so define its exit criteria in advance: a set number of consecutive clean reconciliations agreed with the business, not a date chosen for convenience.
Cut over and plan decommissioning
Freeze the source system, take a final extract, reload the delta since the last full load, and repeat the full reconciliation before opening Fineract for live business. Confirm the Fineract backups and the rollback position are tested before go-live, and document who can authorize a return to the source system. Plan decommissioning separately: keep the source system read-only for the retention period set by your records policy, archive its data, and retire reports, interfaces and access once the reconciliation evidence has been filed. Ask your compliance team to confirm the retention requirements in writing.
Reading validation errors and rerunning safely
The first rule for a bulk import is that a rejected row is not a rejected file. Depending on how the Excel template and the import endpoint behave in your Fineract version, some rows may be committed while others fail, so you need to establish that behaviour before the first real load. Run a small test file in a test tenant that deliberately includes one row with a missing mandatory field, one with an unknown office or product name, and one valid row. Record which rows appear in the Fineract database afterwards. Confirm with your Fineract version's documentation and your own test results whether the import is all-or-nothing per sheet or per row, and whether the error report identifies rows by sheet position or by a value you supplied.
Errors cascade because the template is relational. A client row that fails leaves its loan, savings account or group membership rows pointing at a client that does not exist, so those rows fail too, and the error log can grow to dozens of lines that all trace back to one source mistake. Work through the log from the earliest load step forward, fix the first failing dependency, and rerun only the affected sheet. Keep a row-level error log in your own working file with the source row number, the sheet, the error text, the corrected value and the date of the rerun. This record is what lets a second person verify the fix without reconstructing it from memory.
Reruns are where duplicate clients and accounts appear. Before any rerun, query the tenant for what already exists, using the external identifier or unique key you populated in every row, and set a written rule: rows with a committed identifier are skipped or updated, never re-created, and only rows that never reached the database are resubmitted. Use a stable external ID per source record so that the rule can be checked mechanically. Treat any partially committed sheet as a reconciliation item rather than a retry, and confirm with a test tenant how your version handles an identifier that already exists before you rely on it in production.
When to switch from Excel templates to API scripts
A single office with a modest client list, a small set of products and an opening ledger that the team can check by hand is the situation where the template route usually fits. One operator can prepare the sheets, run the load in the defined order and review the validation output in one sitting. The workbook stays readable to the business owners who must sign off on the data, and nobody needs to maintain code after cutover.
- Volume the team can review: if the operations team can read every row of the client and account sheets before upload, the template route keeps review simple.
- One office, one load window: a single branch means one set of staff, one set of products and fewer interdependencies between files.
- Low rerun risk: if a failed run can be cleaned up by hand in the database or by deleting records in the UI, a repeat is manageable.
- Limited custom mapping: standard fields and standard product configuration cover the data without transformation logic.
- No ongoing pipeline: the load is one-time, so there is no scheduled feed to keep in step with the template format.
Confirm with your implementation partner and your own test environment that the template columns you need exist in your Fineract version before you commit to this route.
When the network spans several offices, the number of clients, groups, staff and accounts grows, and each office may need its own accounting closure and reporting view. Templates still work for these loads, but the workbook becomes large, validation errors multiply across sheets, and the sequence of files has to respect the office hierarchy. Scripts can load one office at a time, check each batch before moving on, and keep the order and identifiers in code.
- Hierarchy-driven order: scripts can read the office tree and load each branch in its own pass, which is harder to keep consistent across a large workbook.
- Identifier mapping: legacy client and staff IDs must map to Fineract IDs. A script can store that mapping in a table and reuse it, while a template relies on the operator to carry values between sheets.
- Per-branch checks: counts and balances can be compared after each office, so a fault in one branch does not hide in the total.
- Throughput: very large client files can run into the limits of spreadsheet handling. Confirm your expected row counts and the import behavior in your version before you rely on the workbook.
- Phased cutover: if branches go live in waves, scripts can be rerun for one office without touching the others.
Check how many rows your largest sheet holds and whether your team can review a failed batch without rebuilding the whole workbook.
Templates can load outstanding balances for loans, but they do not replay disbursements and repayments in sequence. When a loan has a long repayment history, the schedule, the interest recalculation and the business date all matter. Replaying transactions through the API gives the team control over each event, the date it is applied to and the response returned by the platform. The sibling page on migrating active loans with repayment history covers that approach in detail.
- Balance-only loads: a template can set opening outstanding principal and interest, which is enough only if the business accepts a new schedule starting from the cutover date.
- Replay requirements: replaying history needs each disbursement and repayment with its own date, amount and allocation, which is awkward to express in a flat sheet.
- Interest side effects: recalculation after a load can change schedules, so the team must test the effect before going live.
- Business date control: scripts can set and verify the business date for each step, while a template load depends on the state at the time of upload.
- Per-loan reconciliation: each loan should be compared against the source system after loading, and scripts make it easier to record which loans passed.
If the portfolio includes loans whose schedules must continue unchanged, confirm this route with your team before drafting any template sheets for loans.
A migration often runs several times: a dress rehearsal in a test environment, a corrected load after a source data fix, and a final load at cutover. Templates are hard to rerun safely because a partial upload leaves some records created and others failed, and the operator must work out what to remove. Scripts can use stable external identifiers, check whether a record exists before creating it, and wrap related calls in batch requests so that a failed step does not leave half a group behind.
- Stable source keys: each record carries the identifier from the legacy system, which lets a script skip records that already exist.
- Batch requests: grouping related calls into a single batch request can limit partial results, but confirm how your version reports failures inside a batch.
- Logged results: a script can write each request and response to a log, giving auditors and reviewers a record of what was loaded and when.
- Controlled corrections: a rerun can update or skip specific records, while a template rerun usually means cleaning up and starting over.
- Repeatable test runs: the same script runs against each environment, so the rehearsal, the corrected load and the cutover all follow identical steps.
Before you choose the template route for a migration with planned reruns, ask your partner how the team will detect and clean up a partially loaded batch.
Integration and data work around the import
The Excel import only loads data into one tenant, so the first job is to confirm which tenant the load targets. Fineract is multi-tenant: every API request carries a Fineract-Platform-TenantId header, and tenant connections are configured from a tenants database. Before any template is loaded, check that the tenant identifier used by the import, the reporting tools and every integration matches the one that will go live. A mismatch here is easy to miss because the import can succeed against the wrong tenant. Confirm the tenant setup with your platform engineers and record it in the migration runbook.
Lock down access before real client data arrives. The Fineract documentation sets a development login of mifos with a default password, and this must be replaced for any real deployment. Decide which authentication method your organization will use, OAuth2 or HTTP basic, and who holds the accounts that can run bulk imports, since those accounts can create offices, staff and journal entries in bulk. Serve all traffic over HTTPS, using the SSL settings exposed through environment variables such as FINERACT_SERVER_SSL_ENABLED, so credentials and personal data are not sent in clear text during the load. Ask your security team to review these settings against your own standards rather than assuming defaults are adequate.
Plan the downstream side deliberately. Event publishing is disabled by default, so systems that expect ClientCreated or similar events will receive nothing from an import unless someone enables publishing to ActiveMQ, another JMS broker or Apache Kafka. Enable it only after you have decided which consumers should see migration-generated events, because those events can trigger onboarding or notification flows in other systems. Source-system feeds, general ledger exports and reporting connections also need to be re-pointed to Fineract's data. PostgreSQL is the recommended database, and MariaDB and MySQL are deprecated under FSIP-9, so the target database choice should be settled before the import rehearsal starts. Confirm the database platform, sizing and backup approach with your infrastructure team.
What drives the effort and cost of a Fineract import
How is the cost of a Fineract Excel bulk import structured?
The cost is mostly labor, split between the work of preparing the source data, configuring Fineract so it accepts the import, running the load, and checking the results. Each part is paid for by the hour or as a fixed-scope deliverable. Fineract itself is open source under the Apache License 2.0, so there is no license fee to budget, but hosting, the database, backups and any front end still carry infrastructure costs that you pay to your own cloud or data center provider. Ask any partner to show these components separately so you can see which part you would keep in-house.
What makes a Fineract data migration take longer?
Duration is driven less by row count than by how many distinct product types, fee rules and office structures the source data has to be mapped into. Every product configuration must exist in Fineract before accounts can load, so a large number of products, unusual interest methods or multi-currency setups adds design and test cycles. Validation loops also take time: each template error found on a test load means fixing the source file and rerunning the import in a non-production tenant. Ask for the expected number of test cycles in the written scope and what counts as an accepted load.
Does poor data quality or product mapping cost more than the import itself?
In most migrations, yes. Loading files is fast once the data is correct, but cleaning client records, resolving duplicates, agreeing which legacy products map to which Fineract products, and deciding how to treat accrued interest or fees usually takes more effort than the upload. Product mapping is a business decision that needs sign-off from finance and credit teams, so it tends to create delays rather than technical cost. Ask a partner to separate data cleansing and mapping workshops from the load execution in the quote.
Which parts of a Fineract migration are one-time and which recur?
The migration itself is one-time: mapping, template preparation, test loads, the production load and reconciliation. Recurring costs begin after go-live and include hosting, database operations, backups, security patching, Fineract version upgrades on the quarterly release cadence described in the project's README, and support for staff and integrations. Ongoing support and upgrades can be contracted as a retainer, separate from the fixed-scope migration. Ask the vendor which items in the proposal continue after cutover and what they cost per period.
What should a fixed-scope quote for a Fineract import include?
A fixed-scope quote should name the entities in scope (offices, staff, clients, groups, products, accounts, repayments and opening journal entries), the number of source systems and data extracts, the Fineract environments used for testing, and the number of test load cycles. It should also state what the reconciliation evidence will be, who approves product mapping, who fixes source data, and what happens to changes requested after sign-off. Ask for acceptance criteria written as checks you can run yourself, not only as a delivery date.
When does a fixed-scope import quote stop covering the work?
A fixed quote usually stops covering the work when the source data needs substantial rework, when loans with repayment history must be replayed instead of loaded as balances, or when the team asks for entities outside the agreed list. Each of these changes the effort, so they should trigger a written change request. Ask how change requests are priced and approved before work starts, and whether the partner will flag a scope risk early rather than absorb it silently.
Can our own team run the Excel import without an implementation partner?
A capable internal team can run the import if it has Fineract administration skills, PostgreSQL experience, someone who owns product configuration, and time for repeated test cycles. The cost of doing it yourself is staff time and the risk of learning on the production load. A partner is most valuable for the design decisions, mapping review and reconciliation evidence that regulators or auditors will ask about. Assess your team against those skills honestly before deciding, and ask a partner to review your plan even if you run the load yourself.
What makes the migration longer or more expensive
This table lists the factors that change how long an Excel bulk import migration takes and what it costs, with the direction of each effect and what to confirm during scoping. Read each row as a question to answer before you agree a fixed scope, since most of these drivers multiply rather than add up. The main takeaway is that data quality and running loan history usually matter more than the raw record count.
| Driver | Why it changes effort | What to confirm during scoping |
|---|---|---|
| Number of products and fee rules | Each product needs its own configuration, charges, accounting mappings and test cases, and every distinct fee rule adds validation work. Effort rises with each product variant. | Full list of loan and savings products, fee and penalty rules, and which products will carry over unchanged |
| Source data quality | Duplicate clients, inconsistent dates, missing identifiers and free-text fields that the templates reject all add cleaning and rework cycles. Poor quality is often the largest effort driver. | Who owns cleaning in the source systems, how many records fail validation in a sample load, and how exceptions are logged |
| Volume of running loans with history | Loans with repayment history need more than a balance load because schedules, interest and business dates must be reproduced. Effort rises sharply compared with loading closed or balance-only accounts. | Count of active loans, how many have past repayments, and whether the business decision is to replay history or load outstanding balances |
| Number of offices and staff | Each office needs its own hierarchy entry, staff assignment and load sequence. Larger networks add more rows, more user setup and more branch-level checks. | Office hierarchy depth, staff count per office, and whether branches will load in one wave or several |
| Custom fields and client data | Custom data tables and KYC fields must be defined in Fineract before the matching columns can load. Each added field adds template design and mapping work. | Which source attributes must be kept, which custom fields exist in Fineract, and who approves field definitions |
| Integration count | Systems that receive events or read balances from Fineract must be repointed and tested after the import. Each integration adds a test cycle and a dependency on load timing. | List of systems that read from or write to the current core, and which ones need data at cutover |
| Reconciliation scope | Proving the load requires comparing counts, balances, schedules and ledger totals. Broader scope means more reports, more investigation of differences and more sign-off time. | Which reconciliations the business requires, the tolerance for differences, and who signs off each one |
| Number of cutover rehearsals | Every rehearsal repeats the full load, validation and reconciliation. Teams that rehearse more often find errors earlier but spend more time on each cycle. | How many full rehearsals the risk owner expects, and whether rehearsal results are kept as evidence |
| Opening journal entries and ledger mapping | Opening balances must balance against the chart of accounts, so each mapping decision and each unbalanced batch adds investigation time. | Chart of accounts design status, mapping owner, and whether the opening trial balance is agreed before loading |
What usually goes wrong in Fineract data loads
Excel bulk import is fast to start and easy to repeat, which is exactly why small mistakes spread quickly. The risks below cluster around configuration, identity, dates, money and rehearsal, and each one has a check that should happen before the first production file is loaded.
Product mismatch breaks schedules
A loan product in the target instance that differs from the source contract (interest method, compounding, grace periods, repayment frequency or currency) produces schedules that look valid but do not match what customers agreed to. Confirm every product attribute against the signed terms before loading loan accounts, and generate a sample schedule for one account per product and compare it with the source system.
Duplicate clients on reruns
A failed or partial load that is run again can create a second copy of every client already written. Clients then hold split savings and loans, and reconciliation becomes harder. Before each run, record the external identifiers you loaded and filter the file against them, and agree with the team who owns reruns that a failed file is never resubmitted as-is.
Business date set incorrectly
Interest accrual, repayment due dates and the close of business day all depend on the business date in the target instance. If it is left at the wrong date, accounts accrue for the wrong period or appear overdue on the day they are loaded. Set the business date to the agreed cutover date and confirm it in the target before loading transactions, and do not assume the date from the source file.
Opening balances that do not tie
Loan and savings balances loaded from the spreadsheet can disagree with the opening journal entries posted to the general ledger, leaving the trial balance out of line with the portfolio. Use the same extract for both loads and compare total principal, deposits and ledger control accounts before go-live. Any difference should be explained, not forced into a balancing entry.
Default credentials left in place
The Fineract README documents a default development login that must be changed for any real deployment. Bulk import runs under an account with broad write access, so a known default password on that account exposes the whole tenant. Replace the default credentials, enforce HTTPS and restrict API access before the import user is created or used.
Cutover without a rehearsal
A first full load into production leaves no room to find template, ordering or validation problems. Teams that have not loaded a complete copy of the data, timed it and reconciled the results discover these issues during the cutover window. Run at least one full rehearsal on a non-production instance, record the load duration and error counts, and treat the rehearsal output as the baseline for the go-live plan.
Can your team run the import without outside help?
The templates can be run by a team that already knows Fineract, but the import itself rests on four skill areas. The first is Fineract domain knowledge: someone must understand how offices, staff, clients, groups, products and accounts depend on each other, because the load order and the validation rules follow from those dependencies. The second is PostgreSQL and Kubernetes operations, since the target environment, backups taken before a load, and the write and batch instance layout all need someone who can run them safely. The third is reconciliation accounting, which decides whether the opening journal entries balance and whether the imported loan and savings balances agree with the legacy ledger. The fourth is API scripting, which becomes necessary when volumes, error handling or repeatable reruns exceed what a spreadsheet upload can manage.
A team with only the templates can usually prepare and load the master data, such as offices, staff and products, and can work through the validation error reports in a controlled test environment. It is much harder to close the gaps alone: confirming that a balance sheet position was loaded as a journal entry and not as a product balance, proving that a repayment schedule still matches the source system, and rebuilding a failed batch without duplicating records. Before deciding, ask who on your staff has run a Fineract instance outside a vendor demo, who owns the general ledger mapping sign-off, and who can cover the cutover weekend. Confirm the expected number of records per entity, the test environments available, and whether the people named are free for the full period, since a team that is short on any one of these skills is likely to need outside help.
How DeployOpen scopes and delivers a Fineract migration
DeployOpen plans and delivers Excel-based loading into a self-hosted Apache Fineract instance inside infrastructure you control. We start from the import templates and load order your Fineract version actually supports, then build, validate, document and hand over the load process so your team can rerun it.
How we scope
- Inventory the source data for offices, staff, clients, groups, products, accounts, repayments and opening journal entries
- Confirm the Fineract version and template set the target instance supports before any load work begins
- Agree in writing which entity types use bulk import and which move to API scripts, with the reasons for each
- Engagements are fixed-scope, with deliverables and timelines agreed in writing before work starts
How we build
- Map each source field to its template column and record every transformation applied before loading
- Prepare the load sequence so parent records such as offices and products exist before dependent records load
- Run test loads against a non-production tenant and capture every validation error with its cause and fix
- Document rerun steps so a failed batch can be corrected and reloaded without duplicating records
How we hand over
- Deliver the mapping workbook, load order runbook and validation error log for your migration team to keep
- Provide reconciliation checks that compare loaded counts and opening balances against the source extracts
- Walk your operators through each template, the expected errors and the escalation path for unresolved rows
- Record the configuration and data decisions so auditors and future loads can trace how the data arrived
How we support
- Ongoing support, upgrades and continuous testing are available as retainers after the initial load
- Support can cover repeat loads for later branches or products when your rollout runs in stages
- Confirm with us in the written scope which post-load fixes are included and which fall under a retainer
- Review the switch point to API scripts as volumes or relationship data outgrow what the templates handle well

