Sync control
With the sync:write scope, POST /products accepts three more fields that decide where a product goes: isActive, syncEnabled and destinations. They're for integrations that own that decision, for example an ERP where an "ecommerce" flag on an item means "list this product".
These switches send data to live systems, so they need their own scope on top of products:write. The Full integration preset includes both. Edit catalogue keys can't use these fields.
The three fields
| Field | Type | What it controls |
|---|---|---|
| isActive | boolean | The product's master Sync switch. Off means the product reaches no channel and no app, whatever the other switches say. New products start with it off. |
| syncEnabled | boolean | The product's Channel Sync switch. Off means Fulify won't update the product on its sales channels (BigCommerce and Shopify). New products start with it off. Turning it on doesn't push anything by itself. |
| destinations | object | Opt-ins for connected apps, such as {"linnworks": true}. Linnworks is the only destination today. |
All three are optional and partial. Send only the ones you want to change, per product:
The same fields appear on every product read. On a read, destinations is a list with the state of each connected app:
enabledis whether the product is opted in.statusis the outcome of the last push:synced,errororpending. It'snullwhen nothing has been attempted.errorholds the last error message, if any.- Only apps that are installed and included in your plan are listed. With no connected apps,
destinationsis an empty list.
Rules
- Without
sync:write, the whole request is refused. If any product in the request sendsisActive,syncEnabledordestinationsand the key lacks the scope, the response is403 forbidden_scopeand nothing in the request is written. This applies to dry runs too. - Values must be real booleans.
"false"as a string is an error, not off. - Opting in to an app that isn't installed, or isn't in your plan, fails that product with a message saying so. Opting out is always allowed.
- Channel assignment isn't writable. Which BigCommerce or Shopify stores a product is listed on is set in Fulify, not through the API. Channel Sync only lets Fulify update the channels a product is already assigned to.
Linnworks
If your organization has the Linnworks app installed, Fulify creates and updates Linnworks stock items for every product that's opted in, matched on SKU. A product goes to Linnworks when all of these are true:
isActiveis on.- The product has a SKU.
- The product is opted in with
"destinations": { "linnworks": true }.
Anything the API starts follows the Linnworks opt-in and doesn't look at syncEnabled, which governs BigCommerce and Shopify. In the Fulify app, saving a product or switching on its Linnworks opt-in in the product editor pushes it to Linnworks only when Channel Sync is also on.
Opting in starts a sync
Opting a product in through the API starts a sync, just as ticking the box in the app does. The products are queued for the background Linnworks job rather than sent during your request, because Linnworks limits how many calls Fulify can make per minute. If a Linnworks job is already running, the products join it.
When a request will send products to Linnworks, the response includes a linnworks object:
switchedOncounts only the products the job will actually send: active products that were just opted in, and opted-in products that were just switched active.jobIdis the Linnworks job carrying them.- Sending
"linnworks": trueagain for products that are already opted in doesn't re-send them, so a nightly feed that repeats the opt-in doesn't re-push your whole catalog. To re-send opted-in products, use Sync all products in Settings → Apps on the Linnworks app.
Opting in an inactive product
If you opt in a product whose isActive is off, the opt-in is saved but nothing is sent. The result carries a warning:
Send "isActive": true and the product goes out.
Opting out
Opting out never deletes anything in Linnworks, because an item there may still hold stock. It only stops Fulify writing to that item.
Typical setup
For an ERP or OMS that decides what's listed:
- Create a key with the Full integration preset.
- For each product that should be live, send
"isActive": trueplus"syncEnabled": truefor your sales channels and"destinations": { "linnworks": true }for Linnworks. - For a product that should stop syncing, send
"isActive": false. It then reaches no channel and no app. - Run the request with
?dryRun=truefirst to check the scopes and values.