the brief
A new store on a ready-made theme, prepared for this shop: menus and filters, a cart that understands print runs, quotes with payment with VAT or to a sole proprietor, Nova Poshta, a layout file attached to the order, and KeyCRM both ways — products and prices in, orders out.
the hard part: two kinds of product
Clothing and promo goods come from a supplier’s feed in sizes and colours, and are sold with branding — embroidery, heat transfer, UV print and more: 20 methods, each priced by run size in 137 tiers, mapped onto the store’s categories from the client’s own table (umbrellas, for one, take none). Print products come from KeyCRM with axes of their own — run, paper, finish.
In WooCommerce both had turned into variations, 40,097 of them. A stapled brochure alone carried 380, and its page weighed 2.6 MB of HTML. Sorting a category by price put 873 zero-priced products first, and was slow. The CRM sync overwrote discounts and marked print products out of stock — they have no stock to count.
what was built
- A catalogue plugin with its own tables — products, variants, axes, branding methods and tiers, category settings, sync runs, a change log. One product, one price, no variations.
- Two sources, the supplier feed and KeyCRM, normalised into the same axes — CRM data holds the same property under two spellings, and the size grid would otherwise double.
- A configurator on the product page: colour, size grid, branding method, run. Size quantities have to add up to the run, and the price is recalculated on the server, in the cart as well.
- Orders carry the whole configuration into KeyCRM.
- Migration in waves, with a dry-run parity report and resumable after a kill; then the whole release database built offline, because the hosting has no terminal — code as a zip, data as a ready dump for phpMyAdmin. Checked before release: no differences in titles, texts, photos or categories across 3,074 products.
what it did not need
No new theme, no paid configurator plugin, no change in how the client works in KeyCRM.
where it stands
The store runs on a staging domain until it replaces the client’s current site; the old site’s addresses will need redirects at the move, as a separate task. The nightly sync needs a cron job the hosting does not provide yet — until then it runs from a button in the admin.