[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-the-import-that-exits-zero-and-imports-nothing":3},{"name":4,"created_at":5,"published_at":6,"updated_at":7,"id":8,"uuid":9,"content":10,"slug":93,"full_slug":94,"sort_by_date":95,"position":96,"tag_list":97,"is_startpage":98,"parent_id":99,"meta_data":95,"group_id":100,"first_published_at":6,"release_id":95,"lang":101,"path":95,"alternates":102,"default_full_slug":95,"translated_slugs":95},"The import that exits 0 and imports nothing","2026-09-03T12:59:30.836Z","2026-09-03T12:59:30.876Z","2026-09-03T12:59:30.890Z",216067157379233,"6a2d7f42-8bff-43a2-8d07-b18d3ff4d707",{"_uid":11,"body":12,"title":4,"excerpt":90,"component":91,"publish_at":92},"f6b91829-83f5-4a45-8720-ae3b6a99105b",{"type":13,"content":14},"doc",[15,21,25,32,36,40,45,49,53,58,86],{"type":16,"content":17},"paragraph",[18],{"text":19,"type":20},"A full product import normally takes most of a day on the install I am thinking of. Roughly 190,000 products. One run finished in eighty seconds, exited 0, wrote a clean job row, and moved both timestamps.","text",{"type":16,"content":22},[23],{"text":24,"type":20},"It had imported one family out of about 1,600.",{"type":26,"attrs":27,"content":29},"heading",{"level":28},2,[30],{"text":31,"type":20},"Failure one: it refuses, and still exits 0",{"type":16,"content":33},[34],{"text":35,"type":20},"If a previous job is still marked as processing, the import command prints a message saying it cannot run two jobs at once, and then exits with status 0. Any wrapper, cron entry or deploy script that checks the exit code records a twelve hour import as having completed successfully in under a second.",{"type":16,"content":37},[38],{"text":39,"type":20},"The lock is a status column on the job table. A crashed run leaves it set, and every subsequent import politely declines while reporting success.",{"type":26,"attrs":41,"content":42},{"level":28},[43],{"text":44,"type":20},"Failure two: a leftover filter scopes the whole run",{"type":16,"content":46},[47],{"text":48,"type":20},"The connector supports an advanced filter, which is how you import one family while testing. The filter is configuration, so it persists. Nobody clears it.",{"type":16,"content":50},[51],{"text":52,"type":20},"A later \"full\" import honours that filter. It exits 0, sets the job status to success, updates the timestamps and logs a clean run. Nothing in the exit code, the job row or the log distinguishes it from a real full import. The only tell is the duration, and only if you know what the duration is supposed to be.",{"type":26,"attrs":54,"content":55},{"level":28},[56],{"text":57,"type":20},"What to check instead",{"type":59,"content":60},"bullet_list",[61,68,74,80],{"type":62,"content":63},"list_item",[64],{"type":16,"content":65},[66],{"text":67,"type":20},"Never trust the exit code on this command. It is not lying about the command, it is telling you the command ran, which is a different question from whether the import happened.",{"type":62,"content":69},[70],{"type":16,"content":71},[72],{"text":73,"type":20},"Compare the duration against a known-good run. Eighty seconds against eighteen hours is not a performance improvement.",{"type":62,"content":75},[76],{"type":16,"content":77},[78],{"text":79,"type":20},"Clear the advanced filter after any scoped test, and check it before any run you intend to be complete.",{"type":62,"content":81},[82],{"type":16,"content":83},[84],{"text":85,"type":20},"Check the job status before starting, and know which value means processing, because that is what silently blocks the next run.",{"type":16,"content":87},[88],{"text":89,"type":20},"The theme, and it is the same theme as most things I end up writing down: the failure is quiet, the reporting is confidently wrong, and the only defence is knowing what the numbers should look like when it works.","Two different ways a product import reports complete success while doing none of the work, and neither of them shows up in the exit code or the job table.","blog_post","2026-07-22 09:00","the-import-that-exits-zero-and-imports-nothing","blog\u002Fthe-import-that-exits-zero-and-imports-nothing",null,-80,[],false,215738016545577,"14a3ca0a-ed7b-4f68-b92c-8f1885e9173e","default",[]]