---
title: "QuickBooks to Xero Migration: Jet Convert Limits & Data Mapping"
slug: quickbooks-to-xero-migration-jet-convert-limits-data-mapping
date: 2026-05-06
author: Raaj
categories: [Migration Guide, Xero, QuickBooks]
excerpt: "Xero's free Jet Convert tool only migrates two fiscal years. Learn the 6,000-item Conversion Toolbox cap, how Jobs and sub-accounts break, and methods for full historical transfers."
tldr: "Jet Convert migrates only 2 fiscal years free; the Conversion Toolbox caps at 6,000 items; QuickBooks Jobs, sub-accounts, and Classes all break in Xero's flat architecture — custom API migration is the only way to preserve full history."
canonical: https://clonepartner.com/blog/quickbooks-to-xero-migration-jet-convert-limits-data-mapping/
---

# QuickBooks to Xero Migration: Jet Convert Limits & Data Mapping


Xero's free Jet Convert tool migrates only the **current and prior fiscal year** of transactional data. If your QuickBooks file holds five, eight, or fifteen years of financial history, the rest gets compressed into opening balances — or dropped entirely. The Xero Conversion Toolbox, the DIY alternative, caps historical imports at **6,000 items** before requiring manual intervention from Xero support. And QuickBooks **Jobs**, **sub-accounts**, and **Classes** all break during the transition because Xero uses a fundamentally different data architecture.

This guide covers the exact technical limits of every migration path, the structural mismatches between QuickBooks and Xero's data model, object-by-object mapping, and how to get your full financial history into Xero without data loss.

For a broader view of what typically breaks when moving financial data between accounting platforms, see [7 Costly Mistakes to Avoid When Migrating Financial Data](https://clonepartner.com/blog/blog/financial-data-migration-mistakes-to-avoid/).

## The 2-Year Trap: Jet Convert's Limitations

**Jet Convert** is Xero's official migration partner and the default recommendation for anyone switching from QuickBooks. <cite index="8-2">Jet Convert is Xero's trusted data migration partner, with free and paid options depending on your needs.</cite> The pitch is compelling: automated migration, free for standard conversions, completed in as little as 20 minutes.

Here's what the marketing doesn't emphasize:

<cite index="1-12">It's free to transfer your current and prior fiscal year of financial records.</cite> <cite index="1-2">You may have to pay an additional fee to migrate more than two years of data.</cite>

That means if your fiscal year ends December 31 and you migrate in June 2026, Jet Convert brings over transactions from January 1, 2025 through the migration date — free. Everything before 2025 either requires a paid package or gets rolled into consolidated opening balances that destroy your transaction-level detail.

Jet Convert documents the scope difference between its packages. Its Standard package covers 2 years of transactional history, Accelerate covers 4+ years, and Custom goes further. ([support.jetconvert.com](https://support.jetconvert.com/portal/en/kb/articles/package-options)) The "free" part is real, but it is real for a deliberately smaller migration.

<cite index="35-6,35-7">The current and previous fiscal year's line item details will come over as part of the typical conversion. You may go as far back as 10 years, but this will come at an additional cost.</cite>

**What you lose with the free tier:**

- Transaction-level detail for any fiscal year older than the prior year
- The ability to run year-over-year comparisons against historical periods
- Audit trail continuity for periods outside the two-year window
- Individual invoice and bill line items for older transactions
- Historical payments applied to invoices outside the window, which often fail to map and result in out-of-balance customer accounts

**Other Jet Convert constraints worth knowing:**

- <cite index="9-3">QuickBooks Desktop must be a USA edition from 2014 or newer and must have never had multi-currency turned on.</cite>
- <cite index="4-6">Your file size must be less than 1GB.</cite>
- Payroll data is **not** converted
- <cite index="4-1">If you have more than 699 accounts within your Chart of Accounts, you must merge accounts or delete inactive accounts, as this is the limit within Xero.</cite>
- <cite index="4-7">Special characters like colons, semicolons, quotation marks, or tildes will cause the migration to fail.</cite>

> [!WARNING]
> Jet Convert extracts data at a point in time. <cite index="2-9,2-10">Stop working in QuickBooks Online — data will be extracted at a point in time. Data entered after this date will need to be re-entered if you continue working in QuickBooks Online.</cite>

For details on extracting your QuickBooks data before starting any migration, see [How to Export Data from QuickBooks Online: API Limits & Audit Gaps](https://clonepartner.com/blog/blog/how-to-export-data-from-quickbooks-online-api-limits-audit-gaps/).

## Xero Conversion Toolbox: The 6,000-Item Cap and 1,000-Line Inventory Limit

The **Xero Conversion Toolbox** is a self-serve CSV import tool aimed at accountants and bookkeepers who want direct control over the migration. <cite index="11-5">The Xero Conversion Toolbox suits accounting professionals who want full control over the data import process using CSV files.</cite>

It supports importing Charts of Accounts, contacts, invoices, bills, bank transactions, manual journals, conversion balances, and inventory items. But it has hard caps:

| Object | Limit | Notes |
|---|---|---|
| Historical items (invoices, bills, etc.) | 6,000 | <cite index="11-1">If you need to import several years of data or more than 6,000 items, please contact Xero for assistance.</cite> |
| Inventory items per CSV | 1,000 lines | Per-file maximum, excluding the header row |
| Chart of Accounts | 699 accounts | Xero's platform-wide limit |
| Account codes | 10 characters | Hard limit per account |

**What this means in practice:** A business processing 200 invoices and 100 bills per month will hit the 6,000-item ceiling in under two years of combined history. The 6,000-item limit applies across all transactional object types combined. It's not 6,000 invoices *plus* 6,000 bills — it's 6,000 total. If you're migrating five or more years of transaction data, you need to contact Xero support for a manual override or split your data into batches — a tedious, error-prone process.

If your QuickBooks file has 15,000 SKUs, you must slice your inventory export into 15 separate CSV files to stay under the 1,000-line-per-file cap. A single formatting error in file 12 fails the batch, and you're hunting down a mismatched comma or invalid character.

> [!WARNING]
> **Data Validation Failures**
> The Conversion Toolbox does not offer detailed error logs. If a CSV fails due to a character encoding issue (like a stray ampersand in a vendor name), the tool often returns a generic failure message, leaving engineers to run manual diffs on the raw data to find the problem.

<cite index="11-19">The Xero Conversion Toolbox does require an accountant or bookkeeper to handle the technical side of importing your financial data.</cite> This is not a business-owner-friendly tool. Each CSV must match Xero's exact template format, and column mapping errors silently drop data.

## Why QuickBooks Jobs and Sub-Accounts Break in Xero

This is where most migrations go wrong — and where the data loss is permanent if you don't catch it before cutover.

### The sub-account problem

<cite index="22-5,22-6">In QuickBooks the Chart of Accounts has the option for both main and sub-accounts, and moving the accounts around is easy. The sub-accounts are automatically saved and effective on all the reports.</cite>

<cite index="22-2">The Xero Chart of Accounts is a flat list — there are no sub-accounts.</cite>

This is not a minor difference. If your QuickBooks file has a structure like:

```
Expenses
  └─ Marketing
       ├─ Paid Ads
       ├─ Content
       └─ Events
  └─ Sales
       ├─ Travel
       └─ Commissions
```

Xero flattens this into independent accounts: `Marketing - Paid Ads`, `Marketing - Content`, `Marketing - Events`, etc. The parent-child relationship is gone. You can use Xero's Report Layout Designer to visually group these, but the structural hierarchy that powered your QuickBooks reporting no longer exists at the data layer.

<cite index="31-2">Sub Accounts in QuickBooks Online are converted as Independent Accounts in Xero.</cite> This is true for both Jet Convert and third-party tools like MMC Convert — it's a Xero platform limitation, not a tool limitation.

Off-the-shelf migration tools convert sub-accounts into independent accounts, instantly bloating a clean 150-account Chart of Accounts into a disorganized 600-account list. Before executing a transfer, you must redesign your CoA. See [Your Chart of Accounts Migration Plan](https://clonepartner.com/blog/blog/accounts-migration-plan/) for exactly how to map legacy hierarchies to flat structures.

### The Jobs problem

QuickBooks **Jobs** (also called Customer Jobs or Sub-Customers) let you track revenue and costs per project under a parent customer. A general contractor might have:

```
Smith Residence (Customer)
  └─ Kitchen Remodel (Job)
  └─ Bathroom Addition (Job)
```

Xero has no native equivalent. <cite index="33-9">MMC Convert explicitly lists Customer Jobs under its exclusions.</cite> Jet Convert doesn't surface this limitation clearly in its marketing, but the same constraint applies — Xero's contact model is a flat list.

<cite index="22-7,22-8">Like the Chart of Accounts, the Xero Contacts list is a flat list — there are no separate "Customers" and "Vendors" like in QuickBooks. Instead, all transactions are stored under one name.</cite>

When tools process this hierarchy, they apply destructive workarounds. They often drop unattached jobs entirely or flatten the relationship. `Smith Construction : Kitchen Remodel` becomes a standalone contact named `Smith Construction - Kitchen Remodel`. The parent-child relationship is permanently severed. You can no longer pull a consolidated statement for Smith Construction without manual tagging.

Even inside QuickBooks, job data is not perfectly portable. Intuit's own sub-customer-to-Project conversion guide notes that fields such as addresses, tax code, and payment or billing info do not transfer. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/accounting-bookkeeping/change-sub-customers-projects/L0GzJsoue_US_en_US)) If that metadata is fragile inside the same product family, assume it needs explicit mapping when leaving QuickBooks altogether.

**Your options for handling Jobs during migration:**

1. **Xero Projects** — Xero's built-in project tracking module. It tracks time and expenses per project, but it's not the same as QuickBooks Jobs. Projects don't carry AR/AP relationships.
2. **Tracking Categories** — Map Jobs to a tracking category option. This works for reporting but is limited to 2 active categories and 100 options per category.
3. **Contact Groups + manual tagging** — Create contact groups and use naming conventions to preserve the customer-job relationship. Functional but fragile.
4. **Custom fields via API** — Programmatically preserve the hierarchy in Xero's custom contact fields. Requires development work.

> [!NOTE]
> If parent-child reporting matters, capture the hierarchy in a mapping sheet before the first load. Once a tool flattens sub-accounts into independent Xero accounts, rebuilding the lineage later is manual repair.

## Mapping QuickBooks Classes to Xero Tracking Categories

QuickBooks **Classes** let you tag transactions across your entire chart of accounts — by department, location, product line, or any custom dimension. Businesses with multiple locations or revenue streams rely heavily on Class-based P&L reporting.

Xero's equivalent is **Tracking Categories**. The mapping is not 1:1.

| Feature | QuickBooks Classes | Xero Tracking Categories |
|---|---|---|
| Number of dimensions | Unlimited (with Classes + Locations) | **2 active categories max** |
| Options per dimension | Unlimited | **100 per category** (recommended) |
| Applied to | All transaction types | Most transaction types; payroll limited to 1 |
| Sub-classes | Supported | Not supported |

<cite index="52-6">Xero allows only 2 active tracking categories to be used within all transaction pages, including quotes, invoices, payments, bills, bill payments, and manual journals.</cite>

<cite index="59-6">Each business can set up two active Tracking Categories, and each category can contain up to 100 individual options.</cite>

This is the hard constraint. <cite index="58-1,58-2">Currently there's only 2 fields and in a situation where you want to track complex sales cycles and sources, this is not sufficient.</cite> This has been a long-standing feature request on Xero's product ideas forum with no resolution.

One nuance that matters during migration: QuickBooks lets you assign a class either to the whole transaction or to each line item. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/class-list/track-transactions-class/L927QQfNV_US_en_US?uid=m4a4n72h)) That row-vs-transaction choice affects how profitability can be reconstructed in Xero, because Xero tracking categories apply at the line level. If your QuickBooks data uses row-level class tagging, the migration must preserve that granularity.

**What breaks in practice:**

- If you use Classes **and** Locations in QuickBooks (two separate dimensions), you can map them 1:1 to Xero's two tracking categories. This is the best-case scenario.
- If you use Classes, Locations, **and** Customer Types, you're forced to drop one dimension or merge two together.
- Sub-classes (e.g., `Marketing > Digital > PPC`) flatten to a single option. The nesting is lost.
- <cite index="52-29">Payroll transactions currently support only one tracking category, which creates limitations for organizations that require multi-dimensional payroll analysis.</cite>

**To prevent data loss, compress your data model before migration:**

1. **Evaluate usage** — Determine which QuickBooks dimensions are actually necessary for reporting.
2. **Merge dimensions** — If possible, combine "Location" and "Department" into a single Tracking Category (e.g., `New York - Sales`).
3. **Map to Contacts** — If a Class was used to track Sales Reps, map that data to "Contact Groups" in Xero instead of burning a Tracking Category.

> [!TIP]
> Before migrating, export a Class-filtered P&L from QuickBooks for every combination you currently report on. If you can't replicate those reports with only two Xero tracking categories (100 options each), redesign your reporting structure before cutover — not after.

## Comparing Migration Methods: Jet Convert vs. Third-Party vs. Custom API

Here's a direct comparison based on real constraints:

| Factor | Jet Convert (Free Tier) | Xero Conversion Toolbox | MMC Convert | Custom API Migration |
|---|---|---|---|---|
| **Cost** | Free (2 years); paid for more | Free | Starting ~$289 | Varies by scope |
| **History limit** | Current + prior FY | 6,000 items | Full history | Unlimited |
| **Jobs** | Dropped | Manual mapping | Excluded | Programmatic mapping |
| **Sub-accounts** | Flattened | Manual restructure | Flattened | Preservable via naming + tracking |
| **Classes** | → Tracking Categories | Manual CSV mapping | → Tracking Categories with workarounds | Full control |
| **Multi-currency** | QBO only (not Desktop) | Manual | Supported (may produce FX variance) | Full control |
| **Inventory** | Basic | 1,000 lines/CSV | Basic | Full control |
| **Payroll** | Not converted | Not supported | Setup + details included | Depends on scope |
| **Timeline** | 20 min – 5 business days | Hours to days (manual) | ~2 business days | 3–7 days typical |
| **Technical skill needed** | Low | High (accountant required) | Low | High (engineering) |

<cite index="6-13,6-14">DIY Tools are often free or under $300. Professional Services typically cost $500–$1,500+ depending on history, payroll, and multi-entity needs.</cite>

**When Jet Convert is the right choice:** You're a small business with 1–2 years of clean data, no Jobs, no complex Class structure, and you want to be done fast.

**When the Conversion Toolbox works:** You're an accountant comfortable with CSV manipulation, the data fits under 6,000 items, and you need precise control over the mapping.

**When MMC Convert makes sense:** You need full historical years and can accept sub-account flattening and Jobs exclusion. Better scope than the free path is not the same as full fidelity. ([mmcconvert.com](https://www.mmcconvert.com/faq-qbo-to-xero-conversion))

**When you need custom API migration:** You have more than 6,000 items, complex Jobs hierarchies you need to preserve, multi-currency Desktop files, or reporting structures that require precise programmatic mapping between QuickBooks dimensions and Xero tracking categories.

## How to Migrate Your Full Financial History Without Data Loss

Bypassing the 2-year Jet Convert limit and the 6,000-item Toolbox cap requires working directly with both the QuickBooks and Xero APIs. Here is the technical blueprint.

### Step 1: Define the reporting outcome first

Start with reports, not objects. Decide what must work natively in Xero on day one: full invoice and bill history, bank transactions, class/job reporting, tax-period comparatives, inventory valuation, or just opening balances plus archive access. This decision determines what stays live and what becomes archive-only — and it drives every mapping decision downstream.

### Step 2: Extract the full QuickBooks data via API

Use the QuickBooks Online Accounting API or the QuickBooks Desktop SDK to extract **all** transactional data:

- Chart of Accounts (with parent-child relationships preserved)
- Contacts (Customers, Vendors, with Job sub-entries)
- Invoices, Bills, Credit Notes, Payments
- Bank Transactions
- Journal Entries
- Inventory Items
- Class assignments per transaction line

The QuickBooks Online API limits queries to 1,000 entities per request. For a database with 50,000 historical invoices, implement paginated extraction. Intuit's production APIs are throttled at 500 requests per minute and 10 requests per second per realm. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/data-queries))

```http
GET /v3/company/<realmId>/query?query=SELECT * FROM Invoice STARTPOSITION 1 MAXRESULTS 1000
GET /v3/company/<realmId>/query?query=SELECT * FROM Customer WHERE Active IN (true,false)
```

For Desktop files, export to IIF or QBXML format as an intermediate step.

### Step 3: Transform and map data structures

This is where the structural translation happens:

- **Sub-accounts** → Flatten with consistent naming conventions (e.g., `Travel:Airfare` becomes `Travel - Airfare`)
- **Jobs** → Map to Xero Tracking Category options or Xero Projects, depending on reporting needs
- **Classes** → Map to one of the two Xero Tracking Categories
- **Locations** → Map to the second Tracking Category (if available)
- **Multi-currency transactions** → Preserve original currency and exchange rate; handle FX variance adjustments
- **Tax codes** → Map QuickBooks tax rates to Xero's tax rate structure

Instead of letting a tool randomly assign account codes, write a transformation script:

```json
// Example Transformation Logic
{
  "QuickBooks_Account": "Travel:Airfare",
  "Xero_Account_Code": "450-1",
  "Xero_Account_Name": "Travel - Airfare"
}
```

To preserve `Customer:Job` profitability tracking, intercept the QuickBooks Job data and map it to a Xero Tracking Category named "Jobs." When migrating historical invoices, the script must tag every line item associated with that Job with the corresponding Tracking Option. This allows you to run P&L reports by Job in Xero, mimicking QuickBooks functionality.

Create explicit mapping crosswalks for chart of accounts, contacts, jobs or sub-customers, classes, tax codes, currencies, and inactive records. Include source IDs, parent IDs, full display paths, target values, and an archive rule. Our [Chart of Accounts migration plan](https://clonepartner.com/blog/blog/accounts-migration-plan/) is a good template for how to document these crosswalks.

### Step 4: Use a delta window for cutover

Do the heavy historical backfill first. Then use QuickBooks Change Data Capture (CDC) to collect late changes before the final switch. Intuit's CDC operation tracks changes from the last 30 days and returns up to 1,000 objects per response, which makes it useful for controlled cutovers but not something you should run with oversized time windows on busy files. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/change-data-capture))

```http
GET /v3/company/<realmId>/cdc?entities=Invoice,Customer&changedSince=2026-05-01T00:00:00-07:00
```

### Step 5: Load into Xero via API with rate limit handling

<cite index="44-2">Xero enforces 60 calls per minute and 5,000 daily calls per organization.</cite>

<cite index="43-3,43-4">You can create more than one Invoice in a single PUT or POST Invoices API call. While there is no upper limit in the number of nodes that can be sent at one time, a ceiling of about 50 nodes per request is practical — this will ensure a request does not exceed the maximum size of 3.5MB.</cite>

At 50 invoices per batch and 60 calls per minute, you can push roughly 3,000 invoices per hour. But real-world migrations include contacts, payments, bank transactions, and journals — all consuming from the same 5,000 daily pool. Budget for **2–4 days** for a 10-year history with moderate volume.

The safest load order: chart of accounts → contacts → tracking structure → opening balances → historical transactions → cutover deltas.

> [!WARNING]
> <cite index="46-18">If you exceed either rate limit you will receive an HTTP 429 (too many requests) response.</cite> Your migration scripts must implement exponential backoff and resume logic. A single unhandled 429 can corrupt your migration state if batches are not idempotent.

> [!NOTE]
> **The Daily Limit Math**
> If you batch 50 invoices per API call, you can theoretically push 250,000 invoices per day into Xero. If you push them one by one, you max out at 5,000 invoices per day. But this math only works if invoices are the only object you're migrating — in practice, contacts, payments, and journals all draw from the same 5,000-call daily pool.

### Step 6: Validate before cutover

A clean trial balance is necessary but not sufficient. Run these comparisons before cutting over:

- **Trial Balance** — Match the QB and Xero trial balances for every fiscal year migrated. Any variance greater than $0.00 must be flagged and investigated.
- **AR/AP Aging** — Confirm open invoice and bill balances match
- **Bank account balances** — Verify ending balances per account per period
- **Tracking Category reports** — Confirm Class-based P&L from QB matches Tracking Category-filtered P&L in Xero
- **Contact counts** — Verify no customers or vendors were dropped
- **Sample line-level transactions** — If the source used row-level class tagging, sample invoices and bills line by line

Verify payroll scope separately: Xero's standard QuickBooks conversion path excludes payroll migration, while some third-party services advertise payroll setup. Get that scope in writing.

For more on avoiding validation failures, see [7 Costly Mistakes to Avoid When Migrating Financial Data](https://clonepartner.com/blog/blog/financial-data-migration-mistakes-to-avoid/).

## QuickBooks Desktop Sunset: Why Migration Timing Matters

If you're on QuickBooks Desktop 2023, the clock is ticking. <cite index="1-12">The free Jet Convert migration covers the current and prior fiscal year</cite>, which means the longer you wait, the less free history you get.

The bigger issue: QuickBooks Desktop 2023 loses payroll, bank feeds, payments, and security patches on **May 31, 2026**. Migrating before that date means you can still extract data from a fully functional QuickBooks instance. After sunset, certain API endpoints and connected services stop working, complicating extraction.

For full details on the Desktop sunset timeline, see [QuickBooks Desktop 2023 End of Support: What Breaks on May 31, 2026](https://clonepartner.com/blog/blog/quickbooks-desktop-2023-end-of-support-what-breaks-on-may-31-2026/).

For a broader view of all QuickBooks migration paths — including QBO, Enterprise, and mid-market ERPs — see [QuickBooks Migration Guide 2026: Desktop Sunsets & ERP Paths](https://clonepartner.com/blog/blog/quickbooks-migration-guide-2026-desktop-sunsets-erp-paths/).

## Picking the Right Migration Path

The right approach depends on three things: how much history you need, how complex your QuickBooks data structure is, and how much you're willing to invest.

**If you have <2 years of clean data and no Jobs:** Use Jet Convert. It's free, fast, and good enough.

**If you have 2–5 years and moderate complexity:** Consider MMC Convert or a similar third-party service. Accept that sub-accounts will flatten and Jobs will be excluded. Budget $300–$1,500.

**If you have 5+ years, Jobs hierarchies, complex Class structures, or multi-currency Desktop files:** You need a custom API migration. The free and third-party tools will leave data on the table.

Migrating financial data is not about finding the cheapest tool — it's about protecting the integrity of the numbers that run your business. When free tools dictate your accounting architecture, the business suffers.

> [!TIP]
> Regardless of the migration method you choose, keep the old QuickBooks file in read-only mode after go-live. Archive access is cheap. Reconstructing lost lineage in Xero is not.

At ClonePartner, we've handled QuickBooks-to-Xero migrations where clients needed 10+ years of transaction-level history preserved, Jobs mapped to tracking categories without losing the customer relationship, and Class structures translated with full reporting continuity. We extract via API, transform programmatically, and load directly into Xero — bypassing every cap and limitation described in this guide.

> Need to migrate your full QuickBooks history to Xero — including Jobs, Classes, and data beyond the 2-year free window? Our engineering team builds custom migration scripts that bypass Jet Convert's limits and preserve your reporting structure. Book a 30-minute call to scope your migration.
>
> [Talk to us](https://cal.com/clonepartner/meet?duration=30)

## Frequently asked questions

### How many years of data does Jet Convert migrate for free?

Jet Convert migrates the current and prior fiscal year of transactional data for free. Migrating additional years (up to 10) requires a paid package. Everything outside the free window is consolidated into opening balances, destroying transaction-level detail.

### What is the Xero Conversion Toolbox item limit?

The Xero Conversion Toolbox caps historical data imports at 6,000 items total across all transactional object types. Inventory item imports are further limited to 1,000 lines per CSV file. Exceeding these limits requires contacting Xero support directly for manual backend intervention.

### Do QuickBooks Jobs transfer to Xero?

No. Xero has no native equivalent to QuickBooks Jobs (Customer Jobs / Sub-Customers). Both Jet Convert and third-party tools like MMC Convert exclude or flatten Jobs during migration. You must manually remap them to Xero Tracking Categories, Xero Projects, or Contact Groups.

### How do QuickBooks Classes map to Xero?

QuickBooks Classes map to Xero Tracking Categories, but Xero allows only 2 active tracking categories with up to 100 options each. If you use Classes, Locations, and Customer Types in QuickBooks (three dimensions), you must merge or drop one dimension before migrating.

### What is the Xero API rate limit for migrations?

Xero enforces 60 API calls per minute and 5,000 calls per day per connected organization. You can batch up to 50 records per request (within a 3.5MB size limit). Exceeding these limits returns an HTTP 429 error, so migration scripts must include retry logic with exponential backoff.
