Products are shared; offers are owned. A store never owns a product. It
publishes an offer against a master product variant. Two stores selling the
same product each have their own offer, with their own SKU, price, and stock.
Key features
- Per-store listings: one offer per store per variant, each with its own SKU (unique within a store).
- Offer-scoped pricing: prices live on the master variant’s shared price set, scoped by an
offer_idrule so every store prices independently. - Offer-scoped inventory: inventory items link to the offer, not the variant, so stock never leaks between stores.
- Per-offer shipping: each offer points at the store’s own shipping profile.
- Order attribution: cart and order line items link to the purchased offer, driving fulfillment, commission, and payouts.
- Bulk operations: create and update many offers, and batch an offer’s inventory links, in a single workflow run.
Get started
Learn how the domain fits together:What is an offer
The offer record, how it points at a master variant, and its SKU.
Pricing & inventory
Offer-scoped prices on the shared price set and offer-linked inventory.
Shipping
How an offer carries its own shipping profile.
Examples
Build against the Offer domain in your own code:Create an offer
Run
createOffersWorkflow with a price and inventory.Bulk-create offers
List many offers against the catalog in one run.
Manage offer inventory
Attach, update, and detach inventory items on an offer.
Resources
Data models, workflows, service methods, and events for the Offer domain:Data models
The
Offer entity and its fields.Links
How the Offer domain links to other modules.
Workflows
Create, update, delete, and inventory-batch workflows.
Service
Module service methods for working with records directly.
Events
Events emitted as offers change.