Skip to main content
Stack of paper invoice documents on the left transforming via an arc of arrows into a clean digital B2B portal interface on the right, with some documents in transit half-paper and half-pixel-block.

Importing old invoices into a Shopify B2B account: the migration playbook

Bringing legacy B2B invoice history into Shopify Plus's B2B account schema is the migration that breaks more launches than any other. Here is the five-phase playbook: scope, schema mapping, staged imports, reconciliation, and the failure modes we see most.

Rizwan Qaiser
Rizwan Qaiser·July 16, 2026·Updated October 7, 2026·10 min read·LinkedIn

The catalogue ports fine. Customer accounts import cleanly. The theme looks right. Then finance asks one question. How will 18 months of open receivables, the money buyers still owe you, show up in the new store?

That question moves the date. On the B2B builds we have audited, it lands two to three weeks before go live.

The short answer. Shopify Plus stores each business-to-business (B2B) buyer as a company, with its locations (the branches or depots that place orders) and its contacts (the people who buy). A catalogue is the price list a buyer sees. Payment terms are the deal on when they pay. Plus has no record type for an invoice you already issued. Most teams land open invoices as draft orders, which are orders you build in the admin before the buyer pays. They import closed invoices as dated orders.

A clean import saves your finance team weeks of hand keying. It stops your largest buyers chasing balances they have already paid. That is the part we build. Autonomous Technologies builds and runs the systems behind Shopify stores, for founders and operators who own the store after launch. This is one part of a Shopify Plus migration, and it is the part that most often sets the launch date.

Who this is for, and who it is not for. This is for the operations or finance lead on a B2B business moving onto Shopify Plus with open receivables to carry across. It is not for you if you are starting B2B fresh with no trading history: skip to the schema section, set your terms, and ignore the rest.

Plus has no object for an invoice you already issued

That is the whole problem in one line. Shopify’s B2B tools assume buyers start ordering today. Your customers arrive with 18 months of history.

They bring part paid balances, credit notes and net terms (pay within a set number of days) with running balances. A credit note is a document that cancels part of a bill you already sent. None of that fits “create a company and let them order”.

Before you map anything, sort the old records into five piles. Open invoices carry money you are still owed. Closed invoice history is what buyers expect to see when they log in. Quotes that never became orders are a sales rep’s pipeline.

Credit notes and pending refunds are the fourth pile. They surface a month after launch, when finance closes the books. Part paid invoices are the fifth. Someone paid $5,000 against $12,000, and the other $7,000 still has to be tracked.

Only the first pile can lose you money on day one. The rest lose you trust, which is slower to fix.

The customers who care most about invoice history are the ones with the largest balances. Small accounts rarely notice. The biggest ones tend to email you the day they log in.From the B2B Plus migrations we have audited, 2024 to 2026

The B2B model is three objects and four hard limits

Shopify’s docs name three objects. A Company is “the business entity that makes a B2B purchase”. A CompanyLocation is “a single location or branch of the company”, and it holds the billing and shipping addresses. A CompanyContact is “a person that acts on behalf of the company”, tied to an ordinary customer record.

Orders attach to a location, not to the company. So do catalogues, tax exemptions and payment terms. A catalogue is the price list one location is allowed to buy from. That split matters when a chain buys on different terms per depot. Setting up companies, catalogues and terms is the part most stores hand off; that work is Shopify B2B and wholesale setup help.

Four of those objects carry a published cap. The table below lists each cap and what it rules out.

Only two of the four published caps bite in a real migration. Checked 21 September 2026.
What is cappedPublished limitWhat it rules out
Locations per company.10,000.Nothing. Even large chains fit.
Customers per company.10,000.Nothing in practice.
Customers per location.50.A depot with 60 named buyers must be split.
Catalogues per location.25.Per account price lists past 25 need a rethink.
Only two of the four published caps bite in a real migration. Checked 21 September 2026.

The figures in that table are Shopify’s own, checked 21 September 2026. The trap is not the ceiling. It is the shape.

Old systems often store one buyer record per human, shared across two businesses. Plus needs that person twice: two contacts, two locations, two companies. If your data merges buyers, undo it before import.

Build the companies through the GraphQL Admin API. That is the interface Shopify gives you for writing data into a store. Its companyCreate request makes the company, and it can add a first contact and location in the same step, checked 21 September 2026. Shopify marked the older REST Admin API, its earlier interface, legacy on 1 October 2024. From 1 April 2025 new public apps (apps built for many stores) must use GraphQL, checked 21 September 2026. Do not plan a B2B import around REST.

Payment terms sit on the location, and net counts from the order date

Terms are the second thing to lock. They change what an imported invoice even means. Payment terms are the agreed rule for when a buyer pays. Net 30 means the full amount falls due 30 days after the order. A deposit means the buyer pays a set share of the bill up front.

The table below lists every term type Plus supports on its own, and when the clock starts on each one.

Net terms start at the order date, not the ship date, which shifts every due date you import.
Term typeWhat Shopify supportsWhen the clock starts
Net.7, 15, 30, 45, 60 and 90 days.The day the order is placed.
Due on fulfilment.Payment after the items ship.Fulfilment.
Fixed date.One calendar date, draft orders only.Set by hand.
Deposit.A percentage taken at checkout, Plus only.Order reads Partially paid.
None.Payment in full at checkout.Immediately.
Net terms start at the order date, not the ship date, which shifts every due date you import.

Two rows change plans. Net terms start from the day the order is placed, so if your old system counted from the invoice date, the due dates will differ.

Plus does support part payment, through a deposit percentage that leaves the order marked Partially paid, checked 21 September 2026. That covers new orders. It does not let you say an old invoice arrived half paid, so that pile needs its own call.

Buyers pay from their account. They can press Pay now at any point in the term, and orders stay payable after it lapses.

Five phases, each with one thing it has to prove

The five phases run in order. The image below shows what each one hands to the next.

A horizontal timeline with five markers rising in height from left to right, joined by arcs showing invoice and account data flowing forward from one phase to the next.
Each phase hands one artefact to the next. Skip phase three and you meet its bugs in production instead.

Phase one, extract and inventory. Pull every record into a flat file, one plain spreadsheet-style file. For each invoice take the number, the buyer reference, the lines with SKU (the code that identifies a product), quantity and price, both dates, the status, the amount paid and the balance. Then count companies, locations, buyers, open invoices and total open receivables. It has to prove every column has a target field, or a flag saying it has none.

Phase two, schema mapping. Decide where each old record lands in Shopify’s layout of fields, known as the schema. Name the companies that have no real name. Decide how one address with six buyers splits, and how contract pricing becomes catalogues. It has to prove a written mapping anyone can run without asking you.

Phase three, staged import to a development store. A development store is a private test copy of your store. Import in this order: companies, locations, contacts, catalogues, payment terms, then open invoices, then closed history, then credit notes. It has to prove open receivables in the test store match the old total to the dollar.

Phase four, open invoices. The usual pattern is one draft order per open invoice. Carry the old invoice number in the order name, with the original lines and the balance left. Draft orders can be paid through a checkout link, and finance can filter them. The cost is that reports do not always treat a draft order as an invoice. Some portal themes, the designs that control your buyers’ login area, do not list them at all. It has to prove a buyer can see the balance and pay it.

Phase five, the reconciliation. Reconciliation means checking that the two systems agree, line by line. Run the import against your live store in a planned window, with the old system read only, so nobody can change it. Then check three things. Compare old open receivables against the sum in Plus. Sample ten companies for terms and catalogue. Have five buyers log in to see their history. It has to prove a written sign off from finance. Book 5 to 10 business days.

Every ERP breaks in its own place

The image below maps four source systems onto the same Plus portal.

Four ERP system marks on the left joined by vermillion arrows to a Shopify Plus B2B portal on the right, with small mapping markers spaced along each arrow.
Each marker on these arrows is a 2 to 5 day subtask, and the count differs by source system.

The mechanics are the same from any source. The mapping is not. The table below names the one thing that costs a sprint (a short, fixed block of team work) in each of the four.

A few terms in it need a plain name. An ERP (enterprise resource planning system) is the software that runs a company’s orders, stock and accounts. An IDoc is SAP’s export file for a document such as an invoice. A metafield is an extra field you add to a Shopify record to hold data it has no slot for.

The one thing that costs a sprint in each source system, from the migrations we have run.
Source systemWhat costs you a sprintWhy
NetSuite.Parent and child customer records.Plus has 1 level, so the tree flattens into metafields.
NetSuite.Memorized recurring invoices.Move the invoice, miss the schedule, and the next cycle bills nothing.
SAP.IDoc exports for orders and invoices.Complete but verbose. Budget a sprint for the parser.
SAP.Credit memo states.Issue, part apply, full apply and void have no direct match.
Dynamics.Dimensions on every line.Department and project tags have no home and land in metafields.
QuickBooks.Two books that already disagree.The ledger and the old storefront drifted. Reconcile first.
The one thing that costs a sprint in each source system, from the migrations we have run.

Metafields, named in two of those rows, are where the leftovers land.

One rule holds across all four. The import script, the program that loads your data, runs once, in a window, and never again. Make it complete and well logged. Make it safe to re-run against failed rows too, which engineers call idempotent: a second run never creates duplicates.

What breaks, and who owns it

The objection is that this is over-planning. The data is clean, the vendor has done it before, so why name a signer. Four things break most often.

Buyers see the wrong price on first login. The catalogue was not attached, or it was built from the wrong field. Old prices are often worked out rather than stored, and the script picked up the base price. Before cutover, the day you switch to the new store, check each company’s catalogue.

Open invoices appear but cannot be paid. The draft orders landed, but nobody turned on the payment link or told support how to take the money. The buyer sees a dead end.

History arrives in the wrong order. If the script stamps today’s date on imported orders, every buyer sees 18 months of history bunched into one week. Set the original dates on import.

Nobody signed. A check with no named approver is a spreadsheet nobody owns. Put one person’s name against the sign off. On Sene’s order systems we run the same rule on code: thirty seven pull requests (proposed code changes) landed between 14 July and 8 September 2026, and a named person accepted every one.

Three things to do this week

  1. Pull the totals from the old system: companies, open invoices, total open receivables, and the split by payment term. Get them into a document finance can sign.
  2. Stand up a development store and import 5 to 10 companies with 20 to 30 invoices. Find the schema bugs while they are cheap.
  3. Book a 5 business day window for the reconciliation. If it is not booked, the launch slides into it anyway, unowned.

The table below puts the time figures from this guide in one place, so you can hold your plan against them.

Time budgets from the B2B Plus migrations we have audited, 2024 to 2026. The reconciliation is the line teams cut, and the one finance pays for.
Piece of workTime to bookWhat it covers
Whole move, 50 to 200 companies and 500 to 2,000 old invoices.6 to 10 weeks.From access to launch.
Each mapping subtask per source system.2 to 5 days.One marker on the mapping image above.
Test import to a development store.5 to 10 companies, 20 to 30 invoices.Enough to surface the schema bugs.
Reconciliation window.5 to 10 business days.Old system read only, finance signs off.
Time budgets from the B2B Plus migrations we have audited, 2024 to 2026. The reconciliation is the line teams cut, and the one finance pays for.

Start the first one this afternoon. Pull the totals yourself, put your name at the top of that document, and ask your finance lead to sign it by Friday. Nothing else here is safe to plan until that signature exists.

Common questions

Can I bulk load invoices with Shopify's CSV import?

No. The standard CSV import does not cover companies, locations or draft orders. Build the import on the GraphQL Admin API. Shopify marked the REST Admin API legacy on 1 October 2024, so do not design a new import around REST.

Can Shopify track an invoice that is already part paid?

Not directly. Shopify supports a deposit percentage at checkout, which leaves a new order marked Partially paid, and that feature needs Plus. There is no native way to say an old invoice arrived with money already against it. Decide up front whether you import the balance or the full amount.

How long does a B2B move onto Plus take?

For 50 to 200 companies and 500 to 2,000 old invoices, plan 6 to 10 weeks from access to launch. Anything shorter usually means the reconciliation was cut, and that cost lands on finance in month three.

Filed under

b2b-migrationdata-migrationinvoice-migrationshopify-b2bshopify-plus

From the intelligence suite

Where is your ecommerce stack leaking revenue?

SiteScore surfaces the technical and conversion gaps holding your store back. Free analysis, no sales pitch.

Run a free check
Continue reading
A row of five storefronts, each with a browser panel above the door, selling clothing, beauty products, sneakers, homeware and bicycles.

Shopify & Ecommerce

Shopify Plus examples: 10 stores and what to copy

Ten Shopify Plus stores, each confirmed as Plus on Shopify's own customer pages, read as teardown notes. For each one: what to study, why it matters, and whether you need Plus to copy it.

Rizwan QaiserOct 6, 2026
7 min read
An open ledger beside stacks of gold coins, three plan blocks rising in height with a storefront on the tallest, and add-on cards for an app, a payment card and settings feeding into a checked total.

Shopify & Ecommerce

Shopify Plus pricing: what $2,300 a month really costs

Shopify Plus lists at $2,300 a month on a three year term, but the licence is the only line Shopify prices for you. Here is the total cost by stage, Advanced and Plus side by side, and the cases where Advanced is the better answer.

Rizwan QaiserOct 6, 2026
8 min read
Flat mid-century geometric poster of a circle, diamond and rectangle joined in a pipeline, with a gold dot travelling along the line, illustrating a trigger, condition and action.

Shopify & Ecommerce

Shopify Flow Examples: 20 AI Prompts That Build Real Workflows

Twenty Shopify Flow examples, each written as the sentence you type into the Flow AI assistant. It only works if that sentence names a real trigger, a real condition and a real action. Here is what each prompt builds, and what to check before you switch it on.

Rizwan QaiserSep 23, 2026
8 min read