A brand with several Shopify stores does not want to write every page, menu and blog post once per store. At aiconomy AG, a team of four developers built an admin app that keeps content in sync across a client's stores: metaobjects, metafields, menus, blogs, pages and translations. Each client gets its own instance. This is about the parts I built.

Metaobjects that do not match

Metaobjects are Shopify's structured content: a "team member" or an "FAQ entry" with fields you define. Copying them between stores sounds easy until the two stores' definitions differ. My part of the synchronisation handles three of those differences:

  • Reserved types. Some metaobject types are Shopify's own. They are checked for existence on the target store rather than created.
  • Validations. Definition validations are remapped against the target store, so a rule that points at something in store A points at its equivalent in store B.
  • Files. Referenced file IDs are mapped, so the images inside a metaobject survive the transfer instead of pointing at a file that only exists in the source store.

A file library too big to read

To make sure the target store has the images its theme needs, the obvious approach is to list the source store's whole file library and copy what is missing. On real stores that listing was timing out.

So the app now works backwards: it resolves only the files the live theme actually references and uploads the ones missing on the target, as a scheduled background job. Fewer files to read, no timeouts, and no request waiting on a merchant's screen.

A related fix made file lookups match the exact filename. Before, two files with similar names could collide, and the wrong asset got uploaded.

Errors people can read

I also added blog metafield sync as a new route and screen. When something fails across hundreds of items, a wall of identical errors helps nobody, so errors are deduplicated into a short summary that expands to the full detail when you need it.

Each store in its own language

Finally, market adaptation: each target store receives translations in its own primary language.

None of this shows on a storefront, which is the point. Merchants write once, and every store gets the right content, with its images, in its own language.

Further reading