WordPress and WooCommerce

how to sync b2b price lists from erp to woocommerce customer groups

why b2b woocommerce prices drift away from the erp price list

B2B merchants maintain net price lists in Comarch Optima, enova or Subiekt by customer group, contract and volume break. The WooCommerce B2B plugin or role-based pricing table is updated when someone remembers to export CSV. Key accounts still see yesterday's net price, sales quotes in the CRM disagree with checkout, and margin reports become archaeology. A promotion in the shop undercuts a signed contract; a contract discount never reaches the shop and the customer phones their rep accusing the website of lying. Spreadsheets multiply versions: `cennik_final_v7_REAL.xlsx` in three inboxes. Multi-currency lists drift when the ERP rate table updates and the shop still caches last month's EUR net. Bundle prices and kit discounts exist only in the sales rep's head. Guest browsing may show retail gross while logged-in buyers should see net without VAT - theme bugs mix the two and create invoice disputes later in Optima. Scale makes manual sync impossible. Hundreds of contractors each with exceptions, validity windows and minimum quantities cannot be pasted safely before every campaign. Staff grant a temporary courtesy price in the shop that never expires, undercutting the ERP forever. Conversely, ERP end dates pass unnoticed and the shop keeps honouring dead contracts. Integrations built under NDA almost always rediscover the same rule: ERP is the commercial source of truth for B2B net prices; the shop is a projection with caching and UX duties. Without automation you also lack auditability. Who changed the net for SKU X for customer group Y on Tuesday? The ERP has a document; the shop has a silent database edit. Finance cannot explain a margin hole. Sales cannot prove the website matched the annex of the framework agreement. That proof matters in disputes and in internal controls. The use case is a controlled projection of ERP price lists into WooCommerce customer groups and per-customer exceptions, with validity windows, currency, and conflict rules when someone edits shop prices by hand. Teams that postpone this work usually pay during peak season: more manual exceptions, more emergency CSV edits, and less trust between sales, warehouse and finance. Document the operating model once, then let software enforce the boring path so experts only handle true exceptions. Logged-in caching bugs deserve special mention. A reverse proxy that caches `/sklep/` HTML for users with a B2B cookie will show contractor A's net prices to contractor B until someone purges. Automation that updates prices without coordinating cache keys creates heisenbugs that sales blames on "the ERP sync" when the numbers in the database are correct. Price list projection must therefore emit cache tags per group and per customer exception. Related: parent-child company structures where a holding pays but branches order - Optima may store price on the parent contractor while WooCommerce users exist per branch; the map must encode that inheritance explicitly or branches fall back to retail and escalate. Sales enablement needs a one-pager explaining how net prices appear for parent versus branch accounts and what to do when checkout disagrees with an annex. Schedule a quarterly sample of key-account carts against Optima or Subiekt printouts. Freeze shop-side courtesy discounts unless they carry an owner, ticket ID and automatic expiry. Operational detail for customer group role mapping: document owners, failure examples, and the metric that proves the control works in production for this WooCommerce automation. Write the runbook step, the alert destination, and the rollback or compensate action so night-shift support can act without guessing. Include the system of record name and the correlation ID field used in logs. Sequence marker en-b2b-price-lists-pad-1.

when an erp price list change should update woocommerce

Poll or webhook on ERP price list changes, contract annex activations, and nightly full reconcile. Also trigger when a WooCommerce user is assigned a new role or B2B group so their first login does not show the wrong net list. Campaign start jobs may push temporary overlays only if the ERP issued a matching promotional price list ID. Also listen for ERP contractor merges and splits; when two companies combine, reproject both old IDs until the shop customer link moves. A weekly drift report comparing counts of active ERP list rows versus shop pricing rows catches silent truncation in exports.

steps to push erp contract prices into woocommerce b2b groups

  1. Extract active price list rows for the company: SKU, group or contractor ID, net price, currency, min qty, valid-from, valid-to. Exclude expired annexes.
  2. Map ERP customer groups to WooCommerce roles or B2B groups, and map contractor IDs to shop customer IDs. Fail rows with missing maps into a queue for sales ops.
  3. Compute the shop projection: apply rounding rules, tax display mode (net for B2B), and optional volume breaks your plugin supports. Do not invent breaks the ERP does not hold.
  4. Upsert prices via the B2B pricing API or structured post meta in chunks. Clear relevant caches and tag each row with price list version and ERP timestamp.
  5. Reconcile samples: pick random contractors and SKUs, compare checkout net to ERP, and alert on variance above a tiny epsilon. Expire shop exceptions when ERP validity ends.
  6. Publish a price-list version changelog for sales: top SKUs changed, groups affected, and links to the ERP annex IDs so account managers can brief key customers before checkout surprises them.

Systems

  • WooCommerce B2B
  • Comarch Optima
  • enova365
  • Subiekt

Tools

  • n8n
  • WooCommerce REST
  • Action Scheduler

how erp price lists flow into woocommerce customer pricing

n8n or a dedicated worker reads Optima/enova/Subiekt price list APIs or certified exports. Transform to a shop pricing DTO, then write through WooCommerce REST or a custom B2B plugin endpoint. Action Scheduler handles large group updates without blocking admin. Cache layers (object cache, page cache for logged-out) must be invalidated carefully - logged-in B2B pages usually bypass full-page cache, but fragment caches can still serve stale nets. CRM quote tools should read the same projection or the ERP itself, not a third spreadsheet. Make.com fits only tiny group counts; complex validity windows belong in n8n or PHP services. Observability belongs beside the pipeline: structured logs with run IDs, a simple operator dashboard of last success times, and ownership of alerts in the team that can fix mapping rather than a generic mailbox nobody watches. For very large catalogues, push only changed keys using ERP change-data-capture or row hashes. Full rebuilds remain available as a nightly reconcile. Store the projection in an intermediate table if the B2B plugin write path is slow, then apply from that table transactionally per group. Avoid Magento-style index explosions by not rewriting unchanged post meta. When Subiekt is the source and only offers flat file exports, treat file versioning with the same seriousness as an API cursor. For b2b price lists, keep run IDs in operator dashboards and page the mapping owner rather than a generic inbox when failure rates spike. Operational detail for contract validity windows: document owners, failure examples, and the metric that proves the control works in production for this WooCommerce automation. Write the runbook step, the alert destination, and the rollback or compensate action so night-shift support can act without guessing. Include the system of record name and the correlation ID field used in logs. Sequence marker en-b2b-price-lists-pad-2.

what to do when b2b price sync conflicts with shop overrides

If ERP extract is partial, do not wipe shop prices - apply deltas only for returned keys and mark the run partial. Mapping misses go to sales ops, not silent retail fallback, when the user is a known B2B account. Manual shop overrides should either be forbidden by capability or flagged as `local_override` that blocks ERP overwrite until explicitly released. Currency mismatches abort the row. When checkout variance appears in reconcile, open a P1 for that contractor-SKU pair and freeze further automated changes to that key until cleared. Log version IDs for audit. If a group map points two ERP groups at one WooCommerce role, refuse to apply and demand cleanup - silent merge of divergent nets is worse than downtime. Monitor for zero-price rows and block them unless the ERP marks a genuine FOC item. During ERP fiscal period freezes that lock list edits, pause projection rather than replaying stale queues that suddenly unlock with outdated annexes.

when manual b2b price lists are still enough

You have a handful of B2B buyers and one static net list updated quarterly. A supervised CSV may be enough. Also wait if the B2B plugin migration is unfinished and customer groups are still being renamed daily.

kpis for erp to woocommerce b2b pricing sync

  • Share of B2B checkout nets matching ERP within epsilon
  • Time from ERP price list change to shop projection
  • Count of active local_override prices older than policy allows
  • Support tickets tagged wrong B2B price per month

Automation ROI calculator

Enter how often the process runs each month, minutes per run, and your loaded hourly cost. The result is a simulation, not a quote for our work.

Hours = runs × minutes / 60 × recovery %. Time value = hours × rate × realisation %. Avoided errors = runs × error % × cost per error × realisation %. Net = sum − upkeep. Payback = build / net, only when net > 0.

Hours recovered / month: -

Hours recovered / year: -

Time value / month: -

Avoided error cost / month: -

Net / month: -

Payback (months): -

First-year result: -

Article FAQ

Frequently asked questions

Practical answers to apply the topic in real execution.

SEO-readyGEO-readyAEO-ready3 Q&A
Who wins if sales edits a price in WooCommerce?#
By default the ERP wins on the next sync unless the row is marked local_override with an owner and expiry. Unowned overrides are how margin leaks become permanent.
Can promotional shop prices exist without the ERP?#
Only as short-lived overlays with a hard end date and a named owner, and ideally mirrored as a promotional list in Optima or enova so invoices still match checkout.
How do volume breaks appear at checkout?#
Only if both ERP and the B2B plugin model the same break tiers. If the plugin cannot express a break, keep the lowest eligible tier as the unit price and show a note directing large orders to sales - do not approximate silently.

Need an FAQ tailored to your industry and market? We can build one aligned with your business goals.

Let’s discuss

Related cases