JTL-Wawi and WooCommerce: seven things that silently break during sync

Anyone connecting an ERP to a shop expects error messages. They do come, at the beginning. The real problem starts afterwards: the sync finishes green, and still something is off. A price, a text, a URL. Nobody notices until a customer calls or the warehouse asks which flavour to pack.
The seven cases here come from a shop with 101 products, JTL-Wawi behind it and a custom frontend in front of WooCommerce. Each case has the same shape: what happens, why it happens, what fixes it. At the end you find what I now do before and after every full sync.
1. Sale prices stay put
What happens: A promotion ends in the ERP. The shop keeps running it, or the product suddenly shows 0 euros.
Why: The connector does not send an ended sale price as "please delete", it does not send it at all. WooCommerce keeps the old sale price, and in one case the regular price got overwritten with 0. From the sync's point of view everything was fine, there was simply nothing to report.
What fixes it: A check script after every sync that compares every product with a sale price against the ERP and lists deviations. Dry run first, then live. The shop may only show a sale price as long as the ERP knows it.
2. Short descriptions vanish
What happens: For some variants the maintained short description is replaced by the attribute line, something like "Flavour: vanilla, size: 500 g".
Why: The ERP sends the short description. When creating the variant, the sync rebuilds it from the attributes for some child articles and overwrites the text. Which variants are affected follows no visible pattern.
What fixes it: Measure instead of assume. A script compares the short descriptions after the sync with the ERP data and reports every one that consists of attributes only.
3. Variants get new URLs
What happens: A product reachable yesterday under /product/protein-vanilla/ lives at a different URL today. Links in the menu, in newsletters and in search go nowhere.
Why: A full sync builds the structure the way the ERP sees it. Several single articles become a parent with variants, and the parent gets a new permalink. The shop does not announce it anywhere.
What fixes it: Never hardcode URLs in the menu, in redirects or in the search index. After every full sync, check all homepage links against the current product data. Old URLs get a redirect, not a 404.
4. One article takes ten down
What happens: Ten products are not updated. The log shows a single error, on an entirely different article.
Why: The connector transfers in batches. If one product in the batch lacks a required entry, in this case the product type term, the whole batch aborts. The other nine were fine and still did not arrive.
What fixes it: After every sync, a script that checks the required fields of all products and names the one troublemaker. And knowing that a full sync replaces images every time, so never edit images in the shop, always in the ERP.
5. Copy in the wrong sales channel
What happens: After a full sync, 160 long descriptions are empty. The products are there, the prices are right, the descriptions are gone.
Why: JTL keeps copy per sales channel. The descriptions had been imported into the wrong channel. The sync for the shop channel found nothing there and transferred exactly that: nothing.
What fixes it: Before the first full sync, check which channel holds the copy. After every sync, count the products without a long description and compare with the ERP.
6. Order lines without the flavour
What happens: The order arrives in the ERP. The line says "Organic Protein Powder". The warehouse does not know whether vanilla or chocolate.
Why: The line name is built from the parent article, the variant gets lost on the way. Two neighbours came with it: discounts arriving as a changed line price instead of a coupon, and a payment method the ERP could not map.
What fixes it: The line name has to carry the flavour, "Organic Protein Powder, vanilla, 500 g". Discounts run as coupons, not as altered line prices. The payment method is set through a mapping table, not guessed from a title. And before going live, a test order that someone actually opens in the ERP.
7. The backend cannot reach the frontend
What happens: A product changes in the ERP, the sync runs, the shop still shows the old state. For days.
Why: The server hosting the WordPress backend resolved the shop domain to itself, because the old shop used to live there. The webhook meant to tell the frontend to reload went to the wrong recipient and reported success.
What fixes it: Before launch, check from the backend machine where the shop domain really points. When in doubt, pin webhooks to the frontend address instead of trusting name resolution.
What I do before and after every full sync now
The thread through all of this is the same: none of it breaks loudly. The right thing just never arrives. That is why a sync is not a button for me, it is a procedure.
- Before: Database backup. Check which channel holds the copy. A test order that gets compared after the sync.
- After: Scripts for record links, sale prices, short descriptions, long descriptions and URLs. Every deviation gets reported before a customer sees it.
- Principle: The ERP is the system of record. What is missing there is missing on purpose. Nothing gets patched in the shop, or the next sync overwrites it again.
If your shop and your ERP do not talk to each other cleanly, the problem is rarely the connector. It is the data and the missing checks. That is exactly what I connect: ERP integration for your online shop, JTL-Wawi and WinLine, custom frontends included. What it looks like in production: the ROC Sports case study.
From the author
These guides come from my day-to-day work: I build and maintain shops as a WooCommerce & WordPress developer, create storefronts with headless WooCommerce and connect ERP systems such as JTL-Wawi. If your shop needs speed, features or a sync that holds, get in touch.
Built with AI – the newsletter
Hands-on AI tutorials and the tools I actually use, straight to your inbox. Free, no hype.
Powered by Substack. Unsubscribe anytime.