Skip to content

Dynamics GP to Acumatica Migration: A Practical Guide

Technical guide to migrating financial data from Dynamics GP to Acumatica. Covers subaccount mapping, migration mode, API limits, and trial balance validation.

Raaj Raaj · · 19 min read
Dynamics GP to Acumatica Migration: A Practical Guide
TALK TO AN ENGINEER

Planning a migration?

Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.

Schedule a free call
  • 1,500+ migrations completed
  • Zero downtime guaranteed
  • Transparent, fixed pricing
  • Project success responsibility
  • Post-migration support included

Migrating from Dynamics GP to Acumatica is not a lift-and-shift. You are moving from an on-premise SQL Server database with segmented account strings into a cloud-native ERP built on dimensional accounting with subaccounts, branches, and versioned API entities. If you treat this as a CSV export-and-import, your general ledger will not balance, your segment-based reports will break, and your finance team will spend weeks reconciling in spreadsheets.

The real design question is: what moves as master data, what moves as open subledger detail, what becomes summarized history, and how do GP account segments turn into Acumatica subaccounts without breaking the trial balance. This guide covers the architectural differences, migration approaches with honest trade-offs, object-by-object data mapping, API constraints, and the step-by-step process for extracting, transforming, and loading financial data safely. For the broader context of how ERP data migrations go wrong, see Why ERP Migrations Fail at the Data Layer: 9 Core Patterns.

Why Teams Are Moving from Dynamics GP Now

Microsoft will end Dynamics GP product enhancements, regulatory (tax) updates, and technical support on December 31, 2029. Security patches will continue until April 30, 2031, but only at Microsoft's discretion and only for critical vulnerabilities. After that, GP becomes a frozen codebase running at your own risk.

Here are the dates that matter:

Date What Happens
April 1, 2025 End of new perpetual license sales
April 1, 2026 End of new subscription license sales
December 31, 2029 End of product enhancements, regulatory updates, service packs, and technical support
April 30, 2031 End of security patches and subscription billing

Fewer consultants specialize in GP each year. On average, it takes 9 to 18 months from the decision to move off GP to go-live. Waiting until 2028 means competing with every other GP shop for limited migration resources.

For the full GP sunset timeline and planning guidance, see Dynamics GP End of Life: 2025 to 2031 Timeline and Migration Plan. (learn.microsoft.com)

GP vs Acumatica: Core Data Model Differences

The architectural gap between these two systems drives every complexity in the migration.

Dynamics GP stores all financial data in a SQL Server database, typically split into master, work, open, and history tables. GL transactions live in GL20000 (open year) and GL30000 (historical year). The chart of accounts uses a segmented account structure where segments like Department, Division, and Natural Account are concatenated into a single account string (e.g., 1200-100-00). (learn.microsoft.com)

Acumatica separates the natural account from all other dimensions. It uses a SUBACCOUNT segmented key (up to 30 characters, configurable on the Segmented Keys screen CS202000) to carry what GP encoded inside the account number. A single GP account string like 1200-100-00 must be decomposed into a natural account (1200) and a subaccount (100-00) mapped to the correct segments. Acumatica exposes business entities through versioned web service endpoints, and the Contract-Based REST API is organized around endpoint name and version such as Default/24.200.001. (help.acumatica.com)

This account decomposition is the single most important transformation in the migration. Get it wrong and every financial report in Acumatica will return incorrect results.

Warning

Do not map a GP branch or company segment into an Acumatica subaccount segment by default. Acumatica's multibranch documentation explicitly says not to create a subaccount segment for branches. Keep branch as Branch, and use subaccount segments for reporting dimensions like department, product line, or region. (help.acumatica.com)

Migration Approaches and Comparison

Engineering teams typically evaluate five methods for moving ERP data. Each carries specific trade-offs around scalability, control, and engineering effort.

Native Import Scenarios (CSV or Excel)

How it works: Acumatica has built-in Import Scenarios (screen SM206800) that map columns from a CSV or Excel file to fields on a data entry screen. You configure a data provider, define field mapping, and run the import.

When to use it: Master data loads (customers, vendors, items) and low-volume GL summary entries. Acumatica also includes predefined migration scenarios for financial document migration.

Limitations: Import Scenarios run through the UI layer, which means they trigger all business logic, validation rules, and events on the target screen. This is good for data integrity but terrible for throughput. Community experts report that large imports are possible, but timeouts and mismatches between processed flags and actually imported records are common enough to require careful validation. There is no official Acumatica hard cap on row counts for Import Scenarios. (help.acumatica.com)

Complexity: Low to Medium.

API-Based Migration (Contract-Based REST API)

How it works: Extract data from GP's SQL Server database, transform it in a middleware layer, and push it to Acumatica using the Contract-Based REST API. Endpoints are versioned by release (e.g., Default/24.200.001).

When to use it: High-volume migrations, complex transformations, and any scenario requiring programmatic control over sequencing, retry logic, and error handling.

Limitations: API rate limits are license-tier-dependent and cannot be self-configured. The 2026 Acumatica licensing guide lists Web API connections from 5 to 60, requests per minute from 50 to 300, API concurrency from 5 to 40, and import records per day from 2,500 to 100,000, with higher ceilings in reserved resource tiers. Once 50% of the per-minute limit is reached, subsequent requests are delayed in an internal queue. If the queue exceeds 20 requests, additional requests are declined outright. Acumatica uses PUT for both create and update operations, which is non-standard REST behavior. (acumatica.com)

Complexity: High.

iPaaS Platforms (Celigo, Boomi)

How it works: Middleware platforms with pre-built Acumatica connectors handle data mapping and orchestration through a visual interface.

When to use it: Organizations that already have iPaaS infrastructure and want to reuse connectors for ongoing integration after migration.

Limitations: iPaaS tools are designed for continuous synchronization, not one-time bulk loads. They still hit the same Acumatica API rate limits. Deep accounting transforms usually end up in custom code, mapping tables, or manual reconciliation regardless. Cost can be significant for a migration-only use case. (boomi.com)

Complexity: Medium.

Custom ETL Pipelines (Azure Data Factory or Scripts)

How it works: Build a pipeline that reads GP SQL tables, transforms data in a staging layer, and loads into Acumatica via the REST API or Import Scenarios.

When to use it: Enterprise migrations with complex transformation logic, multi-entity consolidation, multiple rehearsal runs, or when you need full auditability of every record transformation.

Limitations: Requires dedicated engineering resources. You own the maintenance burden for the pipeline, API version upgrades, and error recovery.

Complexity: High.

Managed Migration Service

How it works: A specialized engineering team handles the extraction, transformation, and load process, including mapping logic and trial balance validation.

When to use it: Complex financial histories, open subledgers, multi-currency, tight cutover windows, or when your engineering team is at capacity.

Trade-offs: Delivers high accuracy and zero internal engineering strain but requires upfront budget and vendor trust.

Complexity: Low for your internal team.

Comparison Table

Approach Best For Throughput Main Risk Complexity
Native Import Scenarios Master data, small GL loads Low Timeouts, silent failures Low-Medium
Contract-Based REST API Full migrations, complex transforms Medium-High Rate limits, endpoint work High
iPaaS (Celigo, Boomi) Teams with existing iPaaS investment Medium Connector gaps, hidden custom logic Medium
Custom ETL (ADF, scripts) Enterprise, multi-entity, audit-heavy High Build and support ownership High
Managed Migration Service Complex financials, tight timelines High Vendor selection Low (for your team)

Recommended by scenario:

  • Summary history only, limited engineering bandwidth: Use Import Scenarios for master data and a small set of open documents.
  • Open AR/AP detail, custom fields, repeatable cutover: Use the REST API or custom ETL.
  • Detailed GL history, inventory complexity, multi-branch redesign: Use custom ETL or a managed migration service.
  • Need ongoing coexistence after go-live: Use iPaaS after the migration, not as the primary historical loader.

Pre-Migration Planning and Data Cleansing

Before writing a single migration script, lock down scope. You need to answer What Data Should You Actually Migrate to Your New ERP?.

Financial data audit checklist:

  • Chart of Accounts: Export from GL00100 and GL00105. Identify inactive accounts, duplicate descriptions, and segments that no longer map to active business units.
  • Vendor Master: Query PM00200. Flag vendors with no activity in the last 24 months.
  • Customer Master: Query RM00101. Identify duplicates by tax ID or address.
  • Open AP: Query PM20000 for unpaid invoices. Reconcile to the AP aging report.
  • Open AR: Query RM20101 for outstanding invoices. Reconcile to the AR aging report.
  • Historical GL: Decide how many years of detail to migrate. Most teams migrate 2 to 3 years of summary and archive detail in a read-only GP instance.
  • Active Inventory Items: Query IV00101. Review item classes, UOM, and valuation methods.

Define migration scope. The biggest decision is what level of GL history to bring over. Migrating 10 years of detail-level GL transactions means millions of rows pushed through rate-limited APIs. Most mid-market organizations bring opening balances plus 2 to 3 years of monthly summary journals, then maintain a read-only GP database for audit access to full detail.

Design the branch and subaccount strategy early. Acumatica recommends configuring subaccounts early in implementation. Define how GP segments map to Branch, Account, and SUBACCOUNT before building any loaders. This is a finance architecture decision, not a loader detail. (help.acumatica.com)

Purge obsolete records before mapping. Define your compliance plan, backup plan, and rollback point before the first mock run. For a comprehensive financial checklist, see Accounting Data Migration Checklist: The 10-Point Plan.

Data Model and Object Mapping Strategy

GP Segmented Accounts to Acumatica Subaccounts

In GP, a typical account string looks like 1200-100-00 where segment 1 is the natural account, segment 2 is the department, and segment 3 is the location. Acumatica decouples these: the natural account is stored in the Account field, and everything else maps to the SUBACCOUNT segmented key.

A common target pattern:

  • GP company or location segmentBranch
  • GP natural account segmentAccount
  • GP department, product, or region segmentsSUBACCOUNT segments

You must define segment rules in Acumatica before migrating any transactional data. This involves configuring the Segmented Keys screen (CS202000), defining allowed values per segment on the Segment Values screen (CS203000), and validating the resulting subaccount combinations on the Subaccounts screen (GL203000). Branch access and visibility are handled through branch roles and restriction groups, not by hiding branch inside the subaccount.

Warning

Once a subaccount has transactions posted against it, you cannot delete or restructure its segments. Get the subaccount structure right in sandbox before loading any financial data.

Field-Level Mapping Examples

  • Customers: Map CUSTNMBR → CustomerID, CUSTNAME → Customer Name. GP address and contact fields map to the default location and contact. Map GP customer currency behavior to Acumatica currency settings.
  • Vendors: Map VENDORID → VendorID, VENDNAME → Vendor Name. Review 1099 handling, payment method defaults, remit-to settings, and currency overrides before load — those settings affect downstream AP behavior more than the vendor name does. (learn.microsoft.com)
  • Stock Items: Map ITEMNMBR → InventoryID, ITEMDESC → Description, item class to Acumatica item class, and valuation method to the Stock Item setup. Warehouse-specific overrides belong on Item Warehouse Details, not on the top-level item only.

Handling Open AR and AP

Do not attempt to recreate the full transaction lifecycle for every invoice. Acumatica provides migration mode for the AR and AP subledgers specifically for this purpose. When migration mode is active, each loaded document carries the original amount, document date, currency, exchange rate, and open balance as of the migration date. Acumatica updates customer or vendor balances but does not post to the general ledger when migrated documents are released. (help.acumatica.com)

Tip

Migration mode is the cleanest way to move open AR and AP into Acumatica without restating the new ledger. It is not a shortcut for history. Auto-application of payments to outstanding documents is not supported while migration mode is active. (help.acumatica.com)

Historical GL: Summary vs Detail

Decide early between summary and detail. Summary history means balances by fiscal period, branch, account, and subaccount. Detail history means loading journal batches through JournalTransaction. Summary is safer, faster, and sufficient for most mid-market teams.

If you load detail, remember that Acumatica can summarize postings depending on Post Option at the account level and Post Summary on Updating GL settings. If the business expects one source journal line to equal one target line, validate those posting settings before the first mock run. (help.acumatica.com)

Migration Architecture and API Governance

The data flow is: Extract from GP SQL Server → Transform in staging → Load via Acumatica Contract-Based REST API → Validate through Generic Inquiries and OData.

API Governance Rules

  • Authentication: Use OAuth 2.0 with the api scope. Use a dedicated integration user and close sessions explicitly. Stale sessions can block new API access until timeout. (help.acumatica.com)
  • Rate Limits: License-tier-dependent and not self-configurable. Check your limits on the License Monitoring Console (SM604000). Multiple integrations sharing the same tenant share the same rate limit pool.
  • Endpoint Versioning: The endpoint version (e.g., Default/24.200.001) must exactly match the instance version. A mismatch returns a 404. When Acumatica upgrades, you must update your endpoint references. Extend the endpoint only when the system endpoint does not expose the fields you need. (help.acumatica.com)
  • Batching: There is no native batch API. Each record is an individual PUT. Implement client-side batching with a leaky bucket algorithm to stay under the rate limit.
  • Pagination: Paginate reads with $top and $skip. Do not rely on unlimited list retrieval. Keep $select and $expand narrow — multi-record retrieval can fail optimization when you over-expand heavy entities. (help.acumatica.com)
  • Long-Running Operations: Isolate per session. When a long-running operation is executing in the current session, other REST requests in that same session fail until it completes. (help.acumatica.com)
  • Error Handling: Log every API response. A 200 response does not always mean the record was committed — check for business logic warnings in the response body. If a loader cannot prove what happened to one document, treat that document as failed.
Info

Acumatica requires all field values to be wrapped in {"value": "..."} objects. Sending flat key-value pairs returns 400 errors.

Step-by-Step Migration Process

1. Back Up GP and Freeze Scope

Take a full SQL Server database backup and store it off-site. Define the cutover date and lock scope before writing extraction queries.

2. Extract Data from GP

Query GP's SQL Server database directly. Use SmartLists only when business users need to validate sample outputs.

Example extraction for open AR invoices:

SELECT
  r.CUSTNMBR AS CustomerID,
  r.DOCNUMBR AS DocumentNumber,
  r.DOCDATE AS DocumentDate,
  r.DUEDATE AS DueDate,
  r.CURTRXAM AS RemainingAmount,
  r.SLSAMNT AS OriginalAmount,
  r.DOCTYPE AS DocumentType
FROM RM20101 r
WHERE r.VOIDSTTS = 0
  AND r.CURTRXAM <> 0
ORDER BY r.CUSTNMBR, r.DOCDATE

Example extraction for GL history:

SELECT
    a.ACTINDX,
    a.ACTNUMST,
    t.TRXDATE,
    t.DEBITAMT,
    t.CRDTAMNT
FROM GL20000 t
JOIN GL00100 a
  ON a.ACTINDX = t.ACTINDX
WHERE t.TRXDATE >= '2024-01-01'

The point of extraction is not just to pull rows. Preserve source keys, source batch identity, and per-batch debit and credit totals so you can validate every transformed load before it hits Acumatica. (learn.microsoft.com)

3. Transform Data

Map GP segments to Acumatica Account, Subaccount, and Branch fields. Format dates to YYYY-MM-DD. Convert currency codes to Acumatica's currency ID format. Strip leading zeros from vendor and customer IDs if your Acumatica configuration does not use them. Resolve inactive flags and segment splits in the staging layer.

4. Load Master Data First

Import customers, vendors, items, branches, accounts, segment values, and subaccounts before loading any transactional data. Order matters — reference data must exist before documents that point to it.

5. Activate Migration Mode and Load Open AR/AP

Activate migration mode for the AR and AP subledgers. Load open documents with the original amount, open balance, document date, currency, and exchange rate. This initializes customer and vendor balances without posting to the new general ledger.

Example API payload for creating an AR invoice:

{
  "CustomerID": {"value": "CUST001"},
  "Type": {"value": "Invoice"},
  "Date": {"value": "2026-01-15"},
  "DueDate": {"value": "2026-02-14"},
  "Details": [
    {
      "InventoryID": {"value": "NONINVENTORY"},
      "TransactionDescription": {"value": "Migrated from GP - INV-001234"},
      "ExtendedPrice": {"value": 1500.00},
      "Account": {"value": "4000"},
      "Subaccount": {"value": "100-00"}
    }
  ]
}

6. Load Historical GL at the Chosen Grain

Summary by period is the normal mid-market default. Load detailed JournalTransaction batches only when reporting or audit needs require it. If you load detail, validate Acumatica posting settings first to ensure lines do not get collapsed unexpectedly.

7. Validate and Rehearse

Run the trial balance in both systems for the same period and compare the results. Re-run the full cycle in sandbox until the trial balance and aging reports match GP. Plan for 3 to 5 mock cycles before the final cutover. (help.acumatica.com)

Edge Cases and Challenges

Unbalanced Journal Entries During Transit

If a journal entry in GP is out of balance by even one penny due to a rounding error, the Acumatica API will reject the entire payload. Most of the time this is a transformation error, not an Acumatica error. Check batch balance before load and after load. Also check whether target posting settings are collapsing lines that finance expected to stay separate. (help.acumatica.com)

Multi-Currency Conversions

GP stores originating and functional currency amounts separately. Load currency rate types and historical exchange rates into Acumatica's Currency Rates screen (CM301000) before importing any foreign-currency documents. Acumatica specifies exchange rates should use eight significant figures, and payment application logic uses rates effective on the application date. (help.acumatica.com)

Partially Received Purchase Orders

GP tracks received quantities at the PO line level in POP10500. You cannot simply import the original PO into Acumatica. Calculate the remaining open quantity per line and create POs in Acumatica reflecting only the unreceived portion. Acumatica's REST examples show bills created against particular PO lines through the POLine reference. (help.acumatica.com)

Inventory Costing Layers

GP supports FIFO, LIFO, and Average costing at the item level. Acumatica supports FIFO, Average, Standard, and Specific. If you are on LIFO in GP, you must choose an alternative costing method in Acumatica and accept that historical cost layers will not transfer exactly. For many mid-market teams, the better design is on-hand quantity plus value at cutover, not every legacy receipt layer. (learn.microsoft.com)

API Failures and Retries

Acumatica queues requests when concurrent API capacity is full and delays requests once activity reaches 50% of the per-minute limit. Build idempotent retries with exponential backoff around 429 responses and session errors. (help-2024r2.acumatica.com)

Limitations and Constraints

Acumatica license limits are real. Current official limits vary by product edition. The 2026 licensing guide lists Web API connections from 5 to 60, requests per minute from 50 to 300, API concurrency from 5 to 40, and import records per day from 2,500 to 100,000, with higher ceilings available in some reserved resource tiers. Check your tenant before promising a load window. (acumatica.com)

Exact GP audit trails do not recreate one-to-one inside Acumatica. Journal entry numbers, batch numbers, posting sequences, and user IDs will all be different. Migration mode initializes balances without posting to GL, which is useful but not the same as replaying every original GP posting event. The best approach is to include the original GP document number in a reference field on every migrated transaction, creating a cross-reference chain for auditors. Keep a read-only GP instance if detailed audit lookup matters.

Changing accounting paradigms forces trade-offs. Some GP segments will become branch, some become subaccount values, some become custom fields, and some may be dropped if they no longer belong in the target model. That is normal. It just needs to be explicit and approved before cutover. (help.acumatica.com)

Validation and Testing

Validation is where finance decides whether the migration is real.

Trial Balance tie-out: This is the top test. Compare GP closing balances to Acumatica opening balances by branch, account, and subaccount. Any variance — even one cent — must be traced and resolved before go-live.

Record counts and hash validation: Count customers, vendors, items, open documents, and GL lines or period summaries. Hash the transformed source totals, not just raw row counts.

UAT with finance: Use Acumatica Generic Inquiries (screen SM208000) to build custom validation views that sum debits and credits by account and subaccount. Expose these through OData if controllers need self-serve comparisons without asking engineering for exports. (help.acumatica.com)

Rollback and environment isolation: Run multiple mock migrations in an Acumatica sandbox tenant. Never use production as the first full-fidelity test. Always maintain a rollback plan in case the production cutover encounters fatal errors.

Post-Migration Tasks

  • Lock historical periods in Acumatica to prevent any user from posting into migrated periods.
  • Turn off migration mode when open document loading is complete. Acumatica's own migration walkthroughs show migration mode being cleared after imported AP review. (help.acumatica.com)
  • Rebuild reporting with Generic Inquiries, dashboards, and any external BI models that depended on GP account strings.
  • Train the finance team on Acumatica's subaccount structure, Generic Inquiries, and financial reporting. The shift from segmented accounts to dimensional reporting requires a mindset change, not just button clicks.
  • Maintain a read-only GP instance for historical audit purposes if detail data was left behind.

Best Practices

  • Secure a full GP database backup before the first extract.
  • Run 3 to 5 mock migrations in an Acumatica sandbox tenant before the final cutover.
  • Validate data incrementally — load and verify master data first, then open transactions, then GL history.
  • Keep mapping tables under version control.
  • Treat subaccount and branch design as a finance architecture decision, not a loader detail.

Sample Data Mapping Table

GP SQL Table Purpose in GP Acumatica Target Migration Note
GL00100 Account Master Account + Subaccount design Split segments during transform
GL00105 Account Index Subaccount Index to segment crosswalk
GL20000 Current year GL transactions JournalTransaction or summarized opening balances Use detail only if required
GL30000 Historical GL transactions JournalTransaction or summarized balances by period Often summarized for mid-market
RM00101 Customer Master Customer (AR303000) Map default location, terms, customer class
PM00200 Vendor Master Vendor (AP303000) Review payment method and 1099 behavior
IV00101 Item Master StockItem (IN202500) Carry valuation method and item class
IV00102 Item quantity/site settings ItemWarehouse Warehouse-specific overrides
PM20000 Open AP Transactions AP Bill (AP301000) Open invoices only, use migration mode
RM20101 Open AR Transactions AR Invoice (AR301000) Open invoices only, use migration mode
SOP10100 / POP10100 Open Sales/Purchase Orders Sales Order / Purchase Order Partially received POs need special handling

This is a representative standard mapping table, not a guarantee that your tenant has no customizations. Confirm your exact source set against modules, custom tables, and posting history before writing extraction SQL. (learn.microsoft.com)

Automation Script Outline

Below is a Python script structure that demonstrates the key design points: balanced batch checks, deterministic mapping, payload hashing, and source-to-target logging.

import hashlib
import json
import time
from decimal import Decimal
 
import pyodbc
import requests
 
 
def extract_gp_rows(conn_string, query):
    conn = pyodbc.connect(conn_string)
    cursor = conn.cursor()
    cursor.execute(query)
    return cursor.fetchall()
 
 
def map_account(gp_account_string, account_map):
    """Decompose GP segment string into Branch, Account, Subaccount."""
    return account_map[gp_account_string]
 
 
def build_gl_batch(rows, account_map):
    entries = []
    debit_total = Decimal("0")
    credit_total = Decimal("0")
 
    for row in rows:
        mapped = map_account(row.ACTNUMST, account_map)
        debit = Decimal(str(row.DEBITAMT or 0))
        credit = Decimal(str(row.CRDTAMNT or 0))
 
        entries.append({
            "BranchID": {"value": mapped["branch"]},
            "Account": {"value": mapped["account"]},
            "Subaccount": {"value": mapped["subaccount"]},
            "DebitAmount": {"value": float(debit)},
            "CreditAmount": {"value": float(credit)},
            "ReferenceNbr": {"value": f"GP-{row.ACTINDX}-{row.TRXDATE}"}
        })
 
        debit_total += debit
        credit_total += credit
 
    if debit_total != credit_total:
        raise ValueError(
            f"Batch is not balanced before load: "
            f"debits={debit_total}, credits={credit_total}"
        )
 
    return {"Details": entries}
 
 
def payload_hash(payload):
    raw = json.dumps(payload, sort_keys=True).encode("utf-8")
    return hashlib.sha256(raw).hexdigest()
 
 
def push_to_acumatica(session, base_url, entity, payload):
    url = f"{base_url}/entity/Default/24.200.001/{entity}"
    response = session.put(url, json=payload)
 
    if response.status_code == 429:
        time.sleep(5)
        return push_to_acumatica(session, base_url, entity, payload)
 
    return response
 
 
def run_migration(conn_string, session, base_url, query, account_map):
    rows = extract_gp_rows(conn_string, query)
    batch_payload = build_gl_batch(rows, account_map)
    checksum = payload_hash(batch_payload)
 
    response = push_to_acumatica(
        session, base_url, "JournalTransaction", batch_payload
    )
    print(f"Batch checksum={checksum} status={response.status_code}")

Use this as a control outline, not a drop-in script. For production error handling, log at least the source key, target key, payload checksum, HTTP status, retry count, and finance validation state.

Warning

Always test API scripts in a sandbox environment first. Acumatica will delay requests if you hit 50% of your per-minute limit and will decline requests outright once the internal queue exceeds 20. Exponential backoff logic is required for production loads.

When to Use a Managed Migration Service

Build in-house when your team has dedicated SQL and API engineers, your data model is straightforward (single entity, domestic currency, clean chart of accounts), and you have 3+ months of runway.

Do not build in-house when:

  • Your GL has 10+ years of detail history across multiple company databases
  • You are running multi-currency with complex exchange rate tables
  • Your GP instance has heavy customizations (Dextender, VBA, modified reports)
  • Your engineering team is already at capacity on product work
  • The cutover window is tight and there is zero tolerance for an unbalanced ledger

The hidden cost of DIY ERP migration is not the script writing. It is the weeks of reconciliation when the trial balance does not tie, the compliance risk when audit trails break, and the engineering time pulled away from revenue-generating work. The common failure pattern is not a total crash — it is a migration that mostly works, plus a few hundred records in the wrong branch, wrong subaccount, wrong status, or wrong open balance. That is how ledgers drift and how finance ends up back in spreadsheets. For context on these failure modes, read Why ERP Migrations Fail at the Data Layer: 9 Core Patterns.

How ClonePartner Handles GP to Acumatica Migrations

ClonePartner focuses on point-in-time delta migrations for financial data. We do not build continuous sync bridges. Our approach is purpose-built for one-time cutover accuracy.

What this means in practice:

  • We programmatically decompose GP segmented accounts into Acumatica natural accounts, subaccounts, and branches, preserving dimensional reporting integrity.
  • Our migration engine manages Acumatica API rate limits, concurrent session constraints, and endpoint versioning automatically, so migrations do not stall mid-flight.
  • We handle the relational complexity of AP, AR, GL subledgers, and open transaction balances with field-level validation at every step.
  • We guarantee a balanced trial balance tie-out. If the numbers do not match, we trace and fix every variance before cutover.

The goal is a short cutover window with a balanced result and a finance team that can trust the numbers on day one.

Frequently Asked Questions

How do you map Dynamics GP segmented accounts to Acumatica subaccounts?
GP encodes department, division, and location as segments within a single account string. In Acumatica, the natural account is stored separately, company or location segments map to Branch, and reporting segments become part of the SUBACCOUNT segmented key (up to 30 characters). You must configure segment rules using the Segmented Keys screen (CS202000) and define allowed values on the Segment Values screen (CS203000) before migrating any transactional data. Do not create a subaccount segment for branches — Acumatica's multibranch documentation explicitly advises against it.
What are the Acumatica API rate limits for data migration?
Rate limits depend on your license tier. The 2026 Acumatica licensing guide lists Web API connections from 5 to 60, requests per minute from 50 to 300, API concurrency from 5 to 40, and import records per day from 2,500 to 100,000. Once 50% of the per-minute limit is reached, requests are delayed. If the internal queue exceeds 20 requests, additional requests are declined. These limits cannot be self-configured — check your limits on the License Monitoring Console (SM604000).
How much GL history should I migrate from GP to Acumatica?
Most mid-market organizations migrate opening balances plus 2 to 3 years of monthly summary journal entries. Full detail-level GL history for 10+ years means millions of rows pushed through rate-limited APIs, which is rarely practical. Maintain a read-only GP instance for audit access to historical detail that is not migrated.
When does Dynamics GP end of life support end?
Microsoft will end product enhancements, regulatory updates, and technical support for Dynamics GP on December 31, 2029. Security patches will be available until April 30, 2031, but only for critical vulnerabilities at Microsoft's discretion. New perpetual license sales ended April 1, 2025, and new subscription sales end April 1, 2026.
What is the safest way to migrate open AR and AP from Dynamics GP to Acumatica?
Use Acumatica migration mode for the AR and AP subledgers. Load each open document with its original amount, document date, currency, exchange rate, and remaining open balance. Migration mode updates customer and vendor balances without posting to the new general ledger. Auto-application of payments is not supported while migration mode is active.

More from our Blog