[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-four-systems-and-no-catalogue":3},{"name":4,"created_at":5,"published_at":6,"updated_at":7,"id":8,"uuid":9,"content":10,"slug":126,"full_slug":127,"sort_by_date":128,"position":129,"tag_list":130,"is_startpage":131,"parent_id":132,"meta_data":128,"group_id":133,"first_published_at":6,"release_id":128,"lang":134,"path":128,"alternates":135,"default_full_slug":128,"translated_slugs":128},"Four systems and no catalogue","2026-09-04T07:52:00.071Z","2026-09-04T07:52:00.108Z","2026-09-04T07:52:00.127Z",216345477437605,"3f9bb30c-37de-4985-8a97-84deeab126e5",{"_uid":11,"body":12,"title":4,"excerpt":123,"component":124,"publish_at":125},"8b47b8c1-2f6e-47ae-bc52-dae21526bbb1",{"type":13,"content":14},"doc",[15,21,25,32,36,40,44,49,53,76,86,91,119],{"type":16,"content":17},"paragraph",[18],{"text":19,"type":20},"Most mid-sized shops I see have product data in at least three places. A PIM that marketing owns. An ERP that finance owns. The shop database itself, which developers own. And a spreadsheet somebody maintains because none of the other three does the thing they need.","text",{"type":16,"content":22},[23],{"text":24,"type":20},"Each is authoritative for something. None is authoritative for everything. The import decides who wins, usually without anyone having chosen the rules.",{"type":26,"attrs":27,"content":29},"heading",{"level":28},2,[30],{"text":31,"type":20},"The import that reports success and does nothing",{"type":16,"content":33},[34],{"text":35,"type":20},"Start with whether the sync ran at all, because the answer is less obvious than it looks.",{"type":16,"content":37},[38],{"text":39,"type":20},"One connector I work with exits 0 when it refuses to run. If a previous job is still flagged as processing, it prints a message saying it cannot start a second job, and returns success. Every wrapper checking the exit code records a twelve hour import as complete in under a second.",{"type":16,"content":41},[42],{"text":43,"type":20},"The same connector honours a leftover filter. Somebody scopes an import to one product family while testing, the filter is configuration so it persists, and the next full import quietly runs against that one family. Eighty seconds instead of eighteen hours, clean job row, success status, both timestamps moved. Nothing distinguishes it from a real run except the duration, and only if you know what the duration should be.",{"type":26,"attrs":45,"content":46},{"level":28},[47],{"text":48,"type":20},"Then whether it wrote what you think",{"type":16,"content":50},[51],{"text":52,"type":20},"Two examples from the same install.",{"type":16,"content":54},[55,57,62,64,68,70,74],{"text":56,"type":20},"Every attribute in the admin was labelled ",{"text":58,"type":20,"marks":59},"Unknown",[60],{"type":61},"code",{"text":63,"type":20},". Not blank, the literal word, on nearly two thousand attributes. The connector writes a fallback whenever the PIM has no label in the *admin* locale, the admin locale was English, and the PIM only carried Dutch. The real labels were in the store label table the whole time. Anything rendering ",{"text":65,"type":20,"marks":66},"getFrontendLabel()",[67],{"type":61},{"text":69,"type":20}," showed the fallback; anything using ",{"text":71,"type":20,"marks":72},"getStoreLabel()",[73],{"type":61},{"text":75,"type":20}," was fine.",{"type":16,"content":77},[78,80,84],{"text":79,"type":20},"And a request to disable one product on one website turned out to be unstorable, because ",{"text":81,"type":20,"marks":82},"status",[83],{"type":61},{"text":85,"type":20}," had been changed to global scope years earlier. A global attribute has one value and nowhere to put a second. The import went further and actively deleted store-scoped status rows on every run.",{"type":26,"attrs":87,"content":88},{"level":28},[89],{"text":90,"type":20},"The questions that sort this out",{"type":92,"content":93},"bullet_list",[94,101,107,113],{"type":95,"content":96},"list_item",[97],{"type":16,"content":98},[99],{"text":100,"type":20},"For each field, which system is authoritative, and does the import agree with your answer?",{"type":95,"content":102},[103],{"type":16,"content":104},[105],{"text":106,"type":20},"What does a failed sync look like? If the answer is \"the same as a successful one\", that is the first thing to fix.",{"type":95,"content":108},[109],{"type":16,"content":110},[111],{"text":112,"type":20},"What is a normal run time, and does anyone check it? Duration is often the only honest signal you have.",{"type":95,"content":114},[115],{"type":16,"content":116},[117],{"text":118,"type":20},"Which columns does a connector own? Anything it owns cannot be repaired in the database, because the next run puts it back.",{"type":16,"content":120},[121],{"text":122,"type":20},"None of this is a data problem in the way people mean when they say data problem. It is an ownership problem, and it shows up as data.","When product data lives in a PIM, an ERP, the shop and a spreadsheet, you do not have a catalogue. You have four opinions, and the import quietly picks a winner.","blog_post","2026-08-05 09:00","four-systems-and-no-catalogue","blog\u002Ffour-systems-and-no-catalogue",null,-110,[],false,215738016545577,"ef0fe871-5461-4bf6-b8f5-404708523a0c","default",[]]