SYSPRO to QuickBooks Migration: The CTO's Technical Guide
A CTO-level guide to migrating data from SYSPRO to QuickBooks Online: extraction routes, object mapping, Intuit's API limits, and the manufacturing data QuickBooks cannot hold.
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
SYSPRO to QuickBooks Migration: The CTO's Technical Guide
Migrating from SYSPRO to QuickBooks is not a like-for-like move. It takes data from a manufacturing ERP into accounting software built around buying, holding and selling items. SYSPRO stores each company's data in its own SQL Server database, with tables such as ArCustomer, InvMaster, SorMaster and WipMaster. SYSPRO's guide says "Each SYSPRO 8 company database contains approximately 1000 tables" (help.syspro.com). QuickBooks Online holds accounting entities (Customer, Vendor, Item, Invoice, Bill, JournalEntry) behind a REST API with published rate limits.
The hard part is not moving records. It is deciding which SYSPRO data maps to QuickBooks, which you archive, and which you drop. Get that wrong and you either load data QuickBooks cannot represent, or you lose manufacturing history you still need for audit. For the migration service page, see SYSPRO to QuickBooks.
SYSPRO licensing deadline: SYSPRO is ending its Initial and Annual Licence Fee model. Existing licences expire on 31 October 2026 for customers outside the US and on 31 December 2026 for customers in the US. After that, "you will no longer be able to access Syspro" without a new subscription agreement. The notice also says: "On cessation of your current licence, you have the right to export your data" (syspro.com). Raise the export with SYSPRO now, whichever date applies to you. Raise the export with your account manager before your expiry date.
This guide covers the data model gap, extraction routes, Intuit's API limits, tax setup, open AR and AP, multi-company setups, and the step-by-step process.
Why Do Companies Move from SYSPRO to QuickBooks?
Companies move from SYSPRO to QuickBooks when the business no longer needs a manufacturing ERP. Typical triggers:
- Business model shift: a company that moved from manufacturing to pure distribution or services no longer needs WIP tracking or production scheduling.
- The 2026 licence change: SYSPRO's move to named-user subscriptions forces a fresh cost-benefit review. SYSPRO publishes no subscription price, so get a quote before you decide. See SYSPRO Licence Expires 2026: Subscribe, Stay or Move.
- Subsidiary clean-up: a parent group that already runs QuickBooks may fold an acquired SYSPRO entity into it.
- Less infrastructure: SYSPRO on-premise needs SQL Server and someone to run it. QuickBooks Online is hosted by Intuit.
This path makes sense only if the business has really left manufacturing workflows behind. If you still run multi-level BOMs, WIP jobs or lot-traceable stock, compare a manufacturing ERP first in Top SYSPRO Alternatives 2026.
What SYSPRO Data Can QuickBooks Actually Hold?
Intuit's developer guide lists four item types in QuickBooks Online: inventory, non-inventory, services and bundles. For inventory it lists "FIFO inventory accounting" as supported. It lists "LIFO or Average Cost inventory accounting", "tracking individual items, for example, by serial number" and "tracking by different stock locations" as not supported (developer.intuit.com). There is no item type for a bill of materials or a production job.
What QuickBooks Online can hold:
| SYSPRO Data | QuickBooks Entity | Notes |
|---|---|---|
ArCustomer (customers) |
Customer | Custom form fields need a field-by-field decision |
ApSupplier (suppliers) |
Vendor | |
InvMaster (stock codes) |
Item (Inventory, Non-inventory or Service) | FIFO only; no serial or stock location tracking |
GenMaster (GL accounts) |
Account | Simple Start, Essentials and Plus: "Maximum of 250 accounts". Advanced: "Unlimited accounts" (quickbooks.intuit.com) |
GenTransaction (GL transactions) |
JournalEntry | Usually summarised, not line by line |
ArInvoice (customer invoices) |
Invoice | Lines reference Items |
ApInvoice (supplier invoices) |
Bill | Vendor must exist first |
SorMaster / SorDetail (sales orders) |
Sales order (Plus and Advanced) or Estimate | Intuit's help says you can create sales orders on Plus and Advanced (quickbooks.intuit.com). Check API support before you map |
PorMasterHdr / PorMasterDetail (purchase orders) |
PurchaseOrder | |
TblCurrency / TblCurrDatedRates |
Multicurrency settings | QuickBooks downloads exchange rates, but you can "manually enter in your own exchange rates for foreign currency transactions" (quickbooks.intuit.com) |
| SYSPRO attachments | Attachable | Files go through the Upload resource and link through Attachable metadata (developer.intuit.com) |
What QuickBooks Online cannot hold:
- BOM structures and routings (
BomOperations,BomWorkCentre): no matching entity - WIP jobs (
WipMaster,WipJobAllMat,WipJobAllLab): no production tracking - Lot detail (
LotDetail) and serial numbers (InvSerialHead): serial tracking is listed as not supported - Inventory movement history (
InvMovements): no matching history entity - Per-warehouse stock (
InvWarehouse): tracking by stock location is listed as not supported - Custom form fields that do not fit QuickBooks' custom field limits (see below)
Archive this data separately. See How to Archive SYSPRO History Before Switching ERP and Read-Only Access to SYSPRO History After Migration.
How Do You Extract Data from SYSPRO?
We recommend these routes, in this order:
- A one-off, read-only SQL extract of the company database, against a restored copy and not the live instance. SYSPRO's best-practice guide says "connecting to the SYSPRO databases directly using SQL drivers is not advised" (help.syspro.com). That warning is about live integrations. For a migration, restore the database to a separate SQL Server instance and read it with a read-only login.
- The Syspro OData Service where SQL is not possible. It is read-only. SYSPRO's 2021 R2 help says it limits responses "to 5000 rows" and pages with
$topand$skip(help.syspro.com). SYSPRO says it "is the only mechanism available when applications need access to SYSPRO data in the Syspro Cloud ERP environment" (help.syspro.com). - e.net business objects such as
ARSQRY(Customer Query) andINVQRY(Inventory Query). They return XML for one record or a filtered set. They suit integration, not bulk extraction.
Two other tools help with checks. Business Activity Queries are SQL views that "any SQL user with db_datareader permissions can retrieve data using" (help.syspro.com). Report Writer can send a report to an ASCII file, and data "can also be exported to third party software such as spreadsheets" (help.syspro.com, SYSPRO 7 Update 1 help).
For more detail, see How to Export Data from SYSPRO: Methods, API Limits & Portability and the SYSPRO SQL Table Map for Migration.
QuickBooks Online API: Constraints That Shape the Migration
The QuickBooks Online Accounting API is a REST API. Every request targets one company, identified by a realmId. Authentication uses OAuth 2.0. Intuit says access tokens "are valid for 3,600 seconds (or one hour)". Refresh tokens expire if unused for 100 days and have "a maximum validity period of five years" (developer.intuit.com).
The limits that set migration throughput, from Intuit's limits page (developer.intuit.com):
| Constraint | Limit |
|---|---|
| Requests | 500 per minute per realm ID |
| Request rate | 10 requests per second, per realm ID and app |
| Batch requests | Throttled at 40 per minute, per realm ID and app |
| Payloads per batch | Recommended maximum of 30 |
| Query results | Maximum of 1,000 entities per response |
| Request timeout | Requests over 120 seconds time out |
| Throttling response | HTTP 429; "wait 60 seconds before retrying" |
Intuit's batch overview page gives a lower figure, "up to 10 payloads" per batch (developer.intuit.com). Test your batch size in a sandbox before the full run.
Custom fields. The legacy REST API "provides up to three custom fields" for sales transactions and purchase orders. On Advanced, "only the first three String custom fields" are available through those functions (developer.intuit.com). The newer Custom Fields GraphQL API allows up to 12 fields on Advanced, four on Plus and three on Essentials, by transaction type (developer.intuit.com).
SyncToken. Updates carry the entity's current SyncToken. A stale one returns error 5010, "Stale Object", and "Client needs to refresh the object" (developer.intuit.com). Your scripts need read-before-write logic and a retry for this error.
Migration Approaches
There is no push-button path from SYSPRO to QuickBooks. You extract from SQL Server (or the OData service) and load into the QuickBooks API.
Direct SQL Extract to QuickBooks API Load
Read SYSPRO's restored database, transform the data in a staging layer (Python, Node.js or a SQL staging database), and load it through the QuickBooks Online REST API.
Best for: any migration beyond a few hundred records, or where you need field-level control. Complexity: high. You own extraction, transformation, OAuth, throttling, SyncToken handling and error handling. Throughput: at most 500 requests per minute per realm ID. Batching raises the records moved per request.
CSV Export to QuickBooks Import
Export SYSPRO lists to spreadsheets, then use QuickBooks Online's built-in import for list entities such as customers, vendors and items.
Best for: small list datasets. Complexity: low, and so is the ceiling. For invoices, Intuit says "you can import a maximum of 100 invoices at a time" and "each imported spreadsheet can contain up to 1,000 rows". It also says "If you have set up sales tax in your account, you can't import invoices this way" (quickbooks.intuit.com).
Middleware Platforms (Zapier, Make)
Connect SYSPRO's OData endpoint to QuickBooks Online through a visual builder.
Best for: keeping QuickBooks updated while SYSPRO stays live. Not suited to bulk historical migration. Complexity: medium. QuickBooks' rate limits and SYSPRO's OData row limit still apply.
Managed Migration Service
A migration engineer handles extraction, transformation, loading, validation and the final delta. You provide access, and you get migrated data with record-count parity and field-level validation.
Best for: tight deadlines, complex related data, or teams whose engineers are busy elsewhere.
| Approach | Complexity | Best For | Bulk Load | Ongoing Sync |
|---|---|---|---|---|
| SQL to QuickBooks API | High | Engineering teams with API experience | Yes | With custom delta logic |
| CSV export and import | Low | Small lists | Partial | No |
| Middleware (Zapier, Make) | Medium | Sync during transition | No | Yes |
| Managed service | Low (for you) | Tight deadlines or complex data | Yes | Yes |
Pre-Migration Planning
Audit the source data before you make any API calls. Much of SYSPRO's history may not belong in QuickBooks.
Data audit checklist:
- Pull record counts from key tables:
ArCustomer,ApSupplier,InvMaster,GenMaster,ArInvoice,ApInvoice,SorMaster,PorMasterHdr. - Find data to archive, not migrate: closed jobs (
WipMaster), lot history (LotDetail) and obsolete stock codes (InvMaster). - Define scope: all historical invoices, or only open AR and AP plus opening balances?
- Check the chart of accounts: if
GenMasterholds more than 250 accounts, consolidate or choose QuickBooks Online Advanced. - Locate custom fields: custom form data sits in plus tables such as
[ArCustomer+](help.syspro.com). Decide which fields map to QuickBooks custom fields and which go to notes or the archive. See SYSPRO Custom Form Fields: Migrating Plus Tables. - Check archived data: SYSPRO's archiving copies purged sales orders, jobs and bills of materials to XML files, and "no 'additional' attached information (such as custom forms, multimedia, notes, etc) is archived" (help.syspro.com, SYSPRO 7 Update 1 help). Archived orders are not in the live tables.
- Assess multi-company scope: each SYSPRO company is its own database. Each QuickBooks Online company is its own
realmId. Decide whether SYSPRO companies merge into one QuickBooks company or map one to one. - Find attachments: check where your SYSPRO attachments are stored, and plan to upload the ones you need through the QuickBooks Upload resource.
Step-by-Step Migration Process
1. Scope and audit
Run the checklist above. Decide what moves to QuickBooks, what goes to an archive, and what you drop. Write the decision down. It is your reference if anyone disputes the scope later.
2. Map the chart of accounts
Map SYSPRO's GenMaster accounts to QuickBooks Online account types (Income, Expense, Bank, Other Current Asset and so on). If you have more than 250 accounts, consolidate or choose Advanced. Consolidation changes your reporting structure, so agree it with finance first.
3. Set up tax before any transaction
Intuit says US QuickBooks Online companies "created after November 10, 2017 manage sales tax calculations via an automated sales tax (AST) engine". Transactions use TaxCode objects. Each line is marked taxable or not, and the transaction carries a tax group. To check whether a company uses AST, query Preferences.TaxPrefs.PartnerTaxEnabled (developer.intuit.com).
So you cannot import SYSPRO tax codes as they are. The steps:
- Set up sales tax in QuickBooks before you load any taxable transaction.
- Map each SYSPRO tax code to a QuickBooks TaxCode, and store the mapping in your cross-reference table.
- On each Invoice or Bill, pass the QuickBooks tax code that matches the SYSPRO tax code on that transaction.
4. Migrate list entities in dependency order
Load in this order: Accounts, tax setup, Vendors, Customers, Items. Intuit notes that "referenced entities can't be created on the fly within a transaction" (developer.intuit.com). An inventory Item links to income, expense and asset accounts, so those accounts must exist first. Record each QuickBooks Id against its SYSPRO code in the cross-reference table.
5. Migrate open AR and AP with partial payments
This is the most complex step. A partly paid SYSPRO invoice is an invoice plus one or more payments. In QuickBooks, a Payment links to an Invoice through LinkedTxn. Load a partly paid invoice like this:
- Create the Invoice at its original amount. Record the returned
IdandSyncToken. - Create a Payment for the amount already paid, with
LinkedTxnpointing to the invoiceId. - The remaining balance shows as open in QuickBooks' AR Aging.
Do not create the invoice at the outstanding balance only. That loses the payment history and gives wrong aging. If a credit was applied in SYSPRO, create the Credit Memo first, then link it to the Invoice through the Payment.
6. Migrate transactions
Load transactions after all list entities exist: Journal Entries, Bills, Invoices, Payments, Purchase Orders. Each transaction references list entities by QuickBooks Id. Use batch requests of 30 payloads or fewer. When you get 429 Too Many Requests, wait 60 seconds before retrying, as Intuit advises.
7. Migrate attachments
QuickBooks keeps attachments in an attachment list. The API manages files "via the Upload and Download resources", and the Attachable resource holds the metadata that links a file or note to a transaction or Item (developer.intuit.com). Export the files you need from SYSPRO, upload them, and link each to its parent entity with an AttachableRef.
Teams often defer attachments and then forget them. If you must keep signed delivery notes or purchase agreements, plan this step explicitly.
8. Validate
Check record-count parity for every entity type. Pull a Trial Balance from both systems at the same cut-off date. Pull AR Aging and AP Aging from both. They must match on the cut-off date. Spot-check a sample of records field by field, and resolve every difference before go-live.
9. Rollback plan
Define the rollback condition before go-live. If validation fails after the bulk load:
- Fix forward for small issues: void or inactivate the wrong records by script, using the cross-reference table.
- Start again for large issues: load into a fresh QuickBooks company. This only works while SYSPRO stays live and accessible, so load into a new QuickBooks company, not one already in use.
- SYSPRO stays the system of record until AR and AP Aging reconcile in QuickBooks and finance signs off the validation report.
10. Final delta and go-live
Go live on a Monday, never on a Friday. Run the bulk load in the days before go-live while SYSPRO stays live. Freeze SYSPRO before Monday's working day starts. Run the final delta, which covers changed records only and takes about 30 minutes. Confirm parity, then go live.
Edge Cases and Common Failures
- 250-account cap: segmented SYSPRO GL structures can exceed 250 accounts. That forces consolidation (which changes reporting) or Advanced.
- Custom fields: SYSPRO plus tables can hold many custom fields per form. Check the custom field limits for your QuickBooks edition and API before you design the mapping.
- Tax set up after invoices: set up sales tax before you load any transaction. Fixing tax on loaded invoices in bulk is slow.
- Multicurrency: turn it on before you load foreign-currency customers or invoices. Intuit says "Once Multicurrency is on, you can no longer turn it off" (quickbooks.intuit.com). SYSPRO holds dated rates in
TblCurrDatedRates(help.syspro.com). Pass the SYSPRO rate on each historical transaction where your finance team needs it to match. - Realised gains and losses: closed foreign-currency invoices carry a gain or loss between invoice and payment dates. If QuickBooks calculates it at a different rate from SYSPRO, reconcile the difference with a journal entry.
- Lot and serial history: SYSPRO tracks lots in
LotDetailand serials inInvSerialHead. If you need that history for audit or recalls, archive it to a database you can query. See SYSPRO Lot and Serial Traceability Migration. - Multi-company SYSPRO: merging several SYSPRO companies into one QuickBooks company means eliminating intercompany balances and resolving code collisions by hand. Mapping one to one means a separate OAuth connection and load per QuickBooks company.
- Archived SYSPRO data: archived orders, jobs and BOMs sit in XML files, not the live tables. Check the archive before you call your extract complete.
- Duplicate names: SYSPRO codes are unique per company, but names can repeat. Check for duplicate display names across customers and vendors before import, and decide a naming rule.
- SyncToken conflicts: if someone works in QuickBooks during the load, updates can fail with error 5010. Load outside working hours, and re-read the record before each retry.
- Invoices with applied credits: load them as Invoice, Credit Memo and Payment linking both. Loading only the net balance loses the credit history and breaks the audit trail.
What About Manufacturing Data?
QuickBooks Online's item types are inventory, non-inventory, service and bundle. Bundles are groups of items sold together. The API supports only read and query operations on bundles, and you create them in the QuickBooks UI (developer.intuit.com). A bundle is not a production structure. Do not flatten SYSPRO BOMs into bundles.
If the business still needs manufacturing after SYSPRO, the options are:
- An inventory and manufacturing app next to QuickBooks. Katana says it can "track lots, serial numbers, and expiry dates from supplier to customer" and lists a QuickBooks Online integration (katanamrp.com). See SYSPRO to Katana. Fishbowl describes itself as inventory software for QuickBooks and Xero that can "manage simple to complex manufacturing processes" (fishbowlinventory.com). See SYSPRO to Fishbowl. SOS Inventory lists "Lot & Serial Number Tracking" and assemblies "with structured bills of materials" (sosinventory.com). Test your multi-level BOMs and costing in each before you commit.
- Archive manufacturing data from SYSPRO for lookup and audit, and run QuickBooks for financials only.
- Move to a full ERP instead. See SYSPRO to Dynamics 365 Business Central or SYSPRO to NetSuite.
Validation and Post-Migration Checks
A migration only succeeds if the finance team trusts the numbers.
- Record-count parity: compare counts for every migrated entity type.
- Trial Balance: pull it from both systems at the same cut-off date. Differences point to missing journals, wrong accounts or currency errors.
- AR and AP Aging: these must match on the cut-off date. Differences usually mean missing payments, credits applied in the wrong order, or invoices loaded at net.
- Tax: compare SYSPRO's tax totals by code against QuickBooks' sales tax reports. Differences point to mapping errors.
- Field-level spot checks: sample records and check names, addresses, invoice totals, payment amounts and item costs.
- Referential integrity: every Invoice references a valid Customer, every Bill a valid Vendor, every line a valid Item.
- Attachments: for a sample, confirm each attachment sits under the right parent record.
- UAT: have users create an invoice, record a payment and run a P&L, and check the results.
Post-Migration Tasks
Once the data is in QuickBooks:
- Rebuild automations: recurring transactions, billing and reminders.
- Train users: QuickBooks' navigation differs a lot from SYSPRO's.
- Back up SYSPRO: take a full SQL Server backup before your licence expiry date (31 October 2026 outside the US, 31 December 2026 in the US). Keep the cross-reference table of SYSPRO codes to QuickBooks Ids for audits.
- Archive manufacturing data: export lot, serial and BOM history you need for compliance before you lose access to SYSPRO.
- Keep unmigrated attachments: store them in an archive your auditors can reach. Your auditor or legal team sets how long you keep records, and the period runs from the transaction date.
Best Practices
- Never load straight into production. Test in a sandbox first. Intuit says you "can create sandboxes for QuickBooks Online Plus and QuickBooks Online Advanced" (developer.intuit.com).
- Extract from a restored copy, never from the live SYSPRO database.
- Keep a cross-reference table of SYSPRO codes to QuickBooks Ids for good.
- Load in dependency order: Accounts, tax setup, Vendors, Customers, Items, then transactions.
- Turn on Multicurrency and set up sales tax before loading data. Multicurrency cannot be turned off once it is on.
- Format timestamps as Intuit specifies:
<date>T<time><UTC offset>(developer.intuit.com). - Write rollback conditions down before go-live. Do not decide them under pressure.
Sample Data Mapping: SYSPRO to QuickBooks Online
This is a table-level map. Confirm the column names in your own SYSPRO database before you write extraction queries, because custom fields and releases vary.
| SYSPRO table | QuickBooks entity | Transform |
|---|---|---|
ArCustomer |
Customer | Build a unique display name; map contact and address fields |
[ArCustomer+] |
Customer custom fields or notes | Field-by-field decision |
ApSupplier |
Vendor | Build a unique display name |
InvMaster |
Item | Set item type; link income, expense and asset accounts |
GenMaster |
Account | Map to a QuickBooks account type; consolidate past 250 if not on Advanced |
GenTransaction |
JournalEntry | Summarise by period if you are not loading full history |
ArInvoice |
Invoice | Link Customer and Items by QuickBooks Id |
ApInvoice |
Bill | Link Vendor by QuickBooks Id |
SorMaster / SorDetail |
Sales order or Estimate | Confirm API support for sales orders first |
PorMasterHdr / PorMasterDetail |
PurchaseOrder | Link Vendor and Items |
| SYSPRO tax codes | TaxCode | Build the mapping before loading transactions |
| Customer payments and credits | Payment, CreditMemo | Load the Invoice first, then link through LinkedTxn |
Automation Script Structure
If you build an API pipeline, use a loop with a retry ceiling rather than recursion. The field names below come from your own staging layer, not from SYSPRO:
import requests
import time
QBO_BASE = "https://quickbooks.api.intuit.com/v3/company"
MAX_RETRIES = 5
def create_customer(realm_id, access_token, customer_data):
"""Create one customer in QuickBooks Online, retrying on HTTP 429."""
url = f"{QBO_BASE}/{realm_id}/customer"
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
"Accept": "application/json"
}
for attempt in range(MAX_RETRIES):
response = requests.post(url, json=customer_data, headers=headers)
if response.status_code == 429:
time.sleep(60) # Intuit: wait 60 seconds before retrying
continue
response.raise_for_status()
return response.json()["Customer"]["Id"]
raise RuntimeError(f"Failed to create customer after {MAX_RETRIES} attempts: {customer_data}")
def migrate_customers(realm_id, access_token, staged_customers):
"""Load staged SYSPRO customers and return a SYSPRO code -> QuickBooks Id map."""
id_map = {}
for row in staged_customers:
payload = {
"DisplayName": row["display_name"],
"CompanyName": row["company_name"],
"PrimaryEmailAddr": {"Address": row["email"]} if row.get("email") else None,
"PrimaryPhone": {"FreeFormNumber": row["phone"]} if row.get("phone") else None
}
payload = {k: v for k, v in payload.items() if v is not None}
id_map[row["syspro_code"]] = create_customer(realm_id, access_token, payload)
return id_mapFor larger datasets, group operations into batch requests. The loop below tracks the chunk index explicitly:
// Node.js: QuickBooks Online batch load with explicit retry tracking
const axios = require('axios');
async function pushBatch(records, accessToken, realmId) {
const batchUrl = `https://quickbooks.api.intuit.com/v3/company/${realmId}/batch`;
const chunkSize = 30; // Intuit's recommended maximum; test lower sizes in a sandbox
const maxRetries = 5;
let i = 0;
while (i < records.length) {
const chunk = records.slice(i, i + chunkSize);
const payload = {
BatchItemRequest: chunk.map((record, idx) => ({
bId: `bid_${i + idx}`,
operation: "create",
Customer: record
}))
};
let attempt = 0;
let success = false;
while (attempt < maxRetries && !success) {
try {
const res = await axios.post(batchUrl, payload, {
headers: {
Authorization: `Bearer ${accessToken}`,
Accept: 'application/json',
'Content-Type': 'application/json'
}
});
processBatchResponse(res.data);
success = true;
} catch (err) {
if (err.response && err.response.status === 429) {
await new Promise(r => setTimeout(r, 60000)); // wait 60 seconds
attempt++;
} else {
throw err; // Surface non-rate-limit errors immediately
}
}
}
if (!success) throw new Error(`Batch failed after ${maxRetries} attempts at chunk index ${i}`);
i += chunkSize;
}
}The same pattern (extract from SQL, transform in staging, load through the API with throttling) applies to every entity type. Change the endpoint and payload for Vendors, Items, Invoices and Bills.
When to Use a Managed Migration Service
Build in-house when you have a dedicated engineer, a small dataset and no deadline pressure. Use a managed service when:
- Your SYSPRO licence expiry date is close and the data must move in days, not weeks of development
- The data has complex links (invoices to customers, partial payments, applied credits)
- Tax code mapping needs checking against QuickBooks' automated sales tax output
- You need QuickBooks kept current while SYSPRO stays live during the transition
- Your engineers are needed on the business, not on a one-off ETL pipeline
ClonePartner is a vendor-neutral data migration service. We resell no software and do not implement QuickBooks. We extract from SYSPRO, load into QuickBooks through the API, and validate with record-count parity and field-level checks.
- Fixed pricing: one fixed price per project, from $500 (clonepartner.com). No hourly billing and no per-record metering.
- Timeline: most data migrations complete within 1 to 5 business days. Datasets under 10,000 records can finish in under 24 hours.
- Unlimited sample migrations before the full run.
- Security: SOC 2 Type II and ISO 27001. Staging data is purged within 30 days of project close.
For the full exit plan, see the SYSPRO Exit Checklist.
Frequently Asked Questions
- Can you migrate SYSPRO manufacturing data (BOMs, WIP) to QuickBooks Online?
- Not as manufacturing data. Intuit's developer guide lists four item types in QuickBooks Online (inventory, non-inventory, service and bundle). It lists tracking individual items by serial number and tracking by stock location as not supported. Archive BOM, WIP, lot and serial history separately, or pair QuickBooks with an inventory and manufacturing app.
- What are the QuickBooks Online API rate limits for data migration?
- Intuit's limits page gives 500 requests per minute per realm ID, 10 requests per second per realm ID and app, and 40 batch requests per minute per realm ID and app. It recommends at most 30 payloads in one batch request. Throttled calls return HTTP 429, and Intuit says to wait 60 seconds before retrying.
- How long does a SYSPRO to QuickBooks migration take?
- The data migration itself typically completes within 1 to 5 business days, depending on data volume, complexity and API rate limits. Datasets under 10,000 records can finish in under 24 hours.
- How do you handle SYSPRO custom fields when migrating to QuickBooks?
- SYSPRO stores custom form data in plus tables such as [ArCustomer+]. QuickBooks Online's legacy REST API provides up to three custom fields on certain transaction types. Intuit's newer Custom Fields GraphQL API allows more, depending on the QuickBooks edition. Fields that do not fit must be consolidated, moved to notes, or archived.
- How do I export my data from SYSPRO before the licence expires?
- SYSPRO licences expire on 31 October 2026 outside the US and 31 December 2026 in the US. Raise the data export with your SYSPRO account manager before your expiry date. For your own extract, run a one-off, read-only SQL read against a restored copy of the company database. Where SQL access is not possible, use the read-only Syspro OData Service, which returns up to 5,000 rows per call.