What is the actual difference between a batch sync and a read-through?
A batch sync copies. On a schedule, something reads a set of records out of Acumatica or Cin7 and writes them into Shopify, BigCommerce, Shopware or Drupal Commerce, where they sit as ordinary platform data. The storefront then serves them without knowing the ERP exists. A read-through does not copy. When the page needs a number, the storefront asks the ERP for it, usually through Middleware is a layer of software that sits between the ERP and the storefront, translating and enforcing rules that neither system holds on its own. It can be a hosted integration platform or a custom service., and renders whatever comes back.
The trade is the same one every caching system makes. A batch sync gives you speed, independence from ERP uptime and cheap scaling, and it pays for that with data that is always at least one cycle old. A read-through gives you accuracy at the instant of reading, and it pays with latency, with load on the ERP, and with a hard dependency: if the ERP is not answering, the page has nothing to show.
The mistake almost every project makes is treating this as one decision for the whole integration. It is not. A product description that changes twice a year and a stock figure that changes forty times an hour have nothing in common except that they both live in the ERP. The useful version of this decision is a table with one row per field.
| Criterion | Batch sync | Read-through |
|---|---|---|
| Page speed | No ERP round trip at render. The platform serves its own data and caches it like any other page. | Adds a round trip on every page that needs the value, and a listing page needs many. A batch endpoint is mandatory or the page degrades as merchandising improves. |
| AccuracyRead-through narrows the window. Nothing closes it, because the buyer still takes time to fill a cart. | Correct as of the last successful run. Wrong for the whole window between runs whenever the underlying value moved. | Correct at the instant of reading, which is not the same as correct at the instant of ordering. |
| ERP API load | Predictable and schedulable. You know how many calls a nightly run costs and you can move it off business hours. | Scales with traffic, which is exactly when you least want it. A crawler hitting 40,000 product pages will generate 40,000 price and stock calls unless you cache. |
| Behaviour when the ERP is down | The storefront keeps trading on the last run. Orders queue for transmission. | The page has no value to render unless you cached and decided what an expired cache entry means. |
Checked against: SparkLayer documentation: Cin7 Core sync cycle and overselling guidance, read 20 August 2026, Acumatica community 11823: BigCommerce price list movement depends on a scheduled Prepare and Process
What does "eventually consistent" mean to a customer looking at a stock number?
Eventually consistent is a phrase engineers use to mean the two systems will agree in a while, and nobody promises how long a while is. Translated for a buyer, it means the number on the screen is a report about the past. It was true when the sync ran. Whether it is true now depends on what your warehouse and your counter staff have done since.
Put a real cadence on it and the problem becomes concrete. If stock syncs on a four-hour cycle, which is what SparkLayer documents for Cin7 Core, then in the worst case a buyer is reading a number that is three hours and fifty-nine minutes old. For an item that sells twice a week that is irrelevant. For an item where a single counter sale clears the shelf, you have shown available stock on something that went out of the door before lunch, and the customer finds out when their order is short-shipped.
The honest arithmetic is a division, and you can do it per item without any tooling. Take the item’s average units sold per hour across your busiest hours, multiply by the sync interval in hours, and compare the result to the quantity you typically hold. If the sync window can consume a meaningful share of your holding, batching that item is a decision to oversell it occasionally. That is a legitimate decision if you make it deliberately and staff the exception process, and it is a bad surprise if you find out from a customer.
The Acumatica and Cin7 communities both carry the operational version of this. Acumatica has an open thread about UNASSIGNED commitments causing the Shopify connector to publish the wrong available quantity, and Cin7 Core’s documented behaviour is that manufacturing availability is drawn from finished-goods stock and ignores raw material and component availability. In both cases the number is calculated from the wrong base rather than simply being out of date, and no increase in sync frequency will fix that.
Take your twenty fastest-moving items and calculate units sold in your busiest hour, per item.
Multiply by your sync interval to get the worst-case quantity that can move between runs.
Compare that number to the quantity you typically hold. Where it is a large share, that item needs a read-through, a safety buffer, or a stock display that shows a band rather than a figure.
Decide what your storefront does when an order is accepted for stock that has gone. That process exists whether you designed it or not.
Checked against: SparkLayer documentation: Cin7 Core syncs on a four-hour cycle with explicit overselling-prevention guidance, read 20 August 2026, Acumatica community: UNASSIGNED commitments cause the Shopify connector to publish the wrong available quantity, Cin7 Core Shopify integration FAQs: manufacturing availability comes from finished goods only, read 20 August 2026
Which fields should be batched and which should be read live?
Work through your integration one field at a time and put each into one of three buckets: batch it, read it live, or do both by batching a display value and reading live at the decision point. The third bucket is where most good B2B integrations end up, and it is worth naming because platform vendors rarely describe it.
The pattern behind bucket three is simple. Show a batched number on the listing page, where the buyer is browsing and a stale figure costs nothing, and read live at the moment the buyer commits, which is the cart or the checkout. That gives you a fast catalogue and an accurate order, and it puts the ERP call on the one page per session where a hundred milliseconds does not matter.
Note that some of these decisions are made for you by the platform. BigCommerce has no concept of inventory locations, which Acumatica’s own community moderator has stated, so per-warehouse availability there needs a customization keyed on something like the ship-to state regardless of whether you batch or read live. Cin7 Core does not auto-push product edits at all: its Shopify FAQ documents a manual Load Products then Publish Product step, which makes product content a batch decision with a human in it.
| Criterion | Sensible default | Why |
|---|---|---|
| Product content, images, attributes | Batch. | The storefront needs it locally for search, faceting and rendering, and it changes slowly. On Cin7 Core it is batch by necessity, since product edits need a manual Load and Publish. |
| Price | Batch if your prices are tier-driven, read live if they are negotiated per customer with dates. | The effective price is a calculation rather than a field, so a batch can only ever publish an approximation of it. |
| Stock availabilityDisplaying a band rather than a number is the cheapest single fix for stale stock, and it is under-used. | Batch a band for listings, read live at cart or checkout. | Listing pages are read constantly and tolerate staleness. The commitment point does not. |
| Credit position and terms | Read live at checkout. | A batched A credit limit is the amount a customer may owe at any one time. Buying on account, often on thirty-day terms, is standard in B2B and the limit is enforced by the ERP. is a number, not an enforcement. Cin7 syncs credit limits to Shopify as metafields, which are visible and not enforced. |
| Order status, shipments, tracking | Batch, or push from the ERP on an event. | Nobody loads an order history page often enough to justify a live call, and the value changes a handful of times per order. |
| Invoices and account balance | Read live. | It is low traffic, it is finance data that has to be exactly right, and copying it into a commerce platform creates a reconciliation problem you did not need. |
Checked against: Acumatica community 5378: BigCommerce has no concept of inventory locations, per an Acumatica moderator, Cin7 Core Shopify integration FAQs: product edits require manual Load Products then Publish Product, read 20 August 2026, SparkLayer documentation: Cin7 credit limits sync to Shopify as metafields, visible rather than enforced, read 20 August 2026
What does each option cost your ERP in API calls?
This is the constraint that turns an elegant read-through design into an outage, and it is almost never modelled before build. A batch sync has a cost you can calculate in advance: records divided by page size, multiplied by runs per day. A read-through has a cost that scales with traffic, and traffic includes crawlers, which do not buy anything and do not stop.
Do the estimate before you design. Take your monthly product page views, add your listing page views multiplied by the number of products on a listing page if you have not built a batch endpoint, and add whatever your search engine crawler does to a catalogue of your size. That is your read-through call volume before any caching. Then apply your cache hit rate honestly, remembering that a per-customer cache key means the hit rate on a long-tail catalogue with many accounts is far lower than the number an engineer will guess.
On the ERP side, both vendors meter. Cin7 documents API call limit errors as an ordinary integration FAQ item, which tells you they are common enough to write a help article about. Acumatica meters API access by licence, and the shape of the limit depends on the licence tier you hold, so the number that applies to you is in your own contract rather than in a blog post. We are not going to publish a figure for either, because the figure that matters is the one your instance enforces, and it is worth ten minutes with your VAR to get it in writing before you design around it.
The practical protections are the same in every design: cache aggressively at the edge, put a batch endpoint in front of anything that renders a list, rate-limit your own integration below the ERP’s ceiling so you fail politely rather than getting throttled, and keep a queue in front of writes so a throttled call retries instead of dropping an order.
Checked against: Cin7 Core Shopify integration FAQs: API call limit errors are documented, read 20 August 2026, Cin7 Core: integrations disconnect when preferences change, read 20 August 2026
When is a plain nightly batch the right answer?
More often than an integration specialist will tell you. A nightly batch is cheap to build, easy to monitor, trivially restartable, and it keeps trading when the ERP does not. If your catalogue and your commercial model allow it, choosing it is good engineering rather than a compromise.
The situations below are the ones where we would argue against paying for anything cleverer in phase one. If your business is in three or more of them, buy the batch, spend the difference on product data, and revisit in a year with real traffic to look at.
And the converse, stated plainly so this does not read as a sales page for the cheap option: if you sell fast-moving stock from multiple warehouses to accounts with enforced credit limits, a nightly batch will oversell, misprice or accept orders you cannot fill, and the cost of that lands on your order desk rather than on your IT budget, which is why it stays invisible until someone measures it.
Your fastest-moving item cannot sell out inside your sync window at your busiest hour.
You hold enough buffer stock that showing a slightly old figure is commercially harmless.
Your prices are tier-driven and change a few times a year rather than daily.
Your customers are on prepayment or card, so no credit position has to be checked at checkout.
Your online catalogue ships from one warehouse, which removes the hardest part of availability entirely.
Checked against: Acumatica community 5378: multi-warehouse availability on BigCommerce needs a customization regardless of sync design
The wider picture
This page answers one narrow question. Acro Commerce covers the strategy around it.
Common questions
- How often should inventory sync from Acumatica or Cin7 to a storefront?
- Often enough that your fastest-moving item cannot sell out inside the window. Calculate it rather than picking a round number: units sold in your busiest hour, multiplied by the sync interval, compared to the quantity you hold. SparkLayer documents a four-hour cycle for Cin7 Core, which is fine for slow-moving stock and clearly not fine for an item that a single counter sale can clear, so the answer is usually a fast cycle for a small set of items plus a live check at checkout.
- Does reading live from the ERP make overselling impossible?
- No, it narrows the window rather than closing it. A read-through gives you a number that was correct when the page rendered, and the buyer still spends time filling a cart and completing checkout, during which the warehouse and the counter keep trading. The only reliable protection is a check at the moment of order acceptance plus a defined process for what happens when the check fails, which you need whether you batch or read live.
- Can a B2B storefront mix batch sync and read-through in the same integration?
- Yes, and most good ones do. The common pattern is to batch product content, images and a display-level stock band so listing pages are fast, and then read live at the cart or checkout for stock, price and credit position, where accuracy matters and traffic is a fraction of catalogue traffic. Decide it field by field and write the decision down, because an undocumented mix becomes very hard to debug when two numbers disagree.
- What happens to a read-through storefront when the ERP goes down for an upgrade?
- Whatever you designed, and if you designed nothing it usually renders a blank or a zero. The workable options are to serve the last cached value with a note that it is indicative, to hide the value and offer a quote, or to put the affected pages into a stated maintenance mode. Pick one before go-live and test it by disabling the ERP connection in a sandbox, because the behaviour on that path is almost never what the team assumed.
- Why does my stock number look wrong even though the sync ran successfully?
- Because a successful sync of the wrong base value is still wrong. Acumatica’s community documents UNASSIGNED commitments causing the Shopify connector to publish an incorrect available quantity, and Cin7 Core’s own FAQ states that manufacturing availability is drawn from finished-goods stock and ignores raw material and component availability. Check what the number is calculated from before you increase the sync frequency, because frequency does not fix a definition problem.
- Will a read-through design blow through our ERP API limits?
- It can, because read-through call volume scales with traffic including crawlers, which browse everything and buy nothing. Estimate the volume before you build: product page views, plus listing views multiplied by products per page if you have no batch endpoint, then apply an honest cache hit rate given that a per-customer cache key reduces hits considerably. Cin7 documents API call limit errors as a normal FAQ item, and Acumatica meters by licence tier, so get your own instance’s ceiling in writing from your VAR rather than working from a published figure.
Last updated 2026-08-20. Facts on this page last checked against source 2026-08-20.
