Limits, conflicts and errors
Conflicts the app prevents
- One rule per product. A product can be a parent or a child, in one rule, and nothing else. Attempts to break that are refused with a message naming the rule that already owns the product.
- No chains. Because a parent cannot also be a child, a change never travels more than one step.
- No loops. Mirroring is parent to child only. The app’s own writes to a child do not start another sync.
Conflicts you resolve yourself
- A child edited by hand. Any field enabled in the rule’s config is overwritten on the next sync. Unenabled fields are never written. There is no per child exception, so if one child must differ on a field, turn that field off for the rule.
- A config several rules share. Editing it changes behaviour everywhere it is used. The configs list shows how many products each one covers before you edit it.
- Deleting a config in use. The app asks which config its parents should move to, and moves them as part of the deletion. The default config cannot be deleted at all; make another config the default first.
When a write fails
Each child is synced independently. A failure on one child does not stop the others, and each gets its own row in the sync history with Shopify’s own error message.
The common causes:
- A metafield value Shopify rejects, usually because the metafield’s definition on that product expects a different type.
- A product that no longer exists, for example a child deleted in the admin but still attached to the rule. Remove it from the rule.
- The parent itself missing. If the parent cannot be read, every child in the rule is recorded as failed with that reason, and nothing is written.
Fix the cause and press Sync Now on the rule to try again. Nothing retries automatically except rate limiting, described below.
If automatic syncs stop happening but Sync Now still works, open the app once from your Shopify admin. That refreshes the credentials the background syncs use.
Rate limiting
Shopify limits how much an app may do per second. The app watches the budget Shopify reports on every call, slows down as it gets low, and waits and retries when it is throttled rather than failing. A large sync therefore takes longer rather than breaking.
Retries are limited. When Shopify keeps refusing, the sync records the failure and moves on.
Ceilings worth knowing
| Limit | Value |
|---|---|
| Sync rules per store | Two on Free, unlimited on Pro. The app tells you when you reach it |
| Child products per rule | No limit |
| Images read from a parent | 250, Shopify’s own limit per product |
| Metafields read from a parent | 250 |
| Variants read from a parent | 250 |
| Metafields written per request | 25, Shopify’s documented maximum |
| Products scanned for recommendations | The first 1000 in the catalogue |
| Sync history shown on a rule | The last 30 rows |
| Sync history shown store wide | The last 200 rows |
Current plans and prices are on the App Store listing. Rules that already exist keep syncing whatever plan you are on, so moving to a cheaper plan never breaks a rule you have already set up.
Getting help
Write to hello@ioun.dev with your store’s myshopify domain and, if it is about one sync, the parent product’s name and roughly when it ran.