1---2name: marketplacer3description: Operator-side patterns for integrating Marketplacer into a composable commerce stack — GraphQL Operator API, per-seller order splits via Invoices, caller-shaped webhooks with HMAC, MPay deposit-and-reconcile payouts, Golden Product PIM sync, wholesale orders, additional charges, and Catalog Rules. Use when implementing or maintaining a Marketplacer marketplace behind any commerce platform (commercetools, Kibo, Scayle, etc.), any search engine, any PIM, OMS, or ERP. Triggers on Marketplacer, marketplace, multi-vendor, multi-seller, Advert, Seller, Invoice, Golden Product, MPay, Airwallex, Hyperwallet, Xero, RefundRequest, RemittanceAdvice, Remittance, Taxon, Prototype, Catalog Rule, marketplace commission, marketplace fees, marketplace operator, marketplace webhooks, paymentReferences. Consult this skill before writing code that talks to a Marketplacer instance, defines a Marketplacer webhook, or maps Marketplacer data into another system.4---56# Marketplacer Operator Integration78**Progressive loading — only load what you need:**910- Setting up auth, the GraphQL client, pagination, or IDs? Load [references/api-setup.md](references/api-setup.md)11- Modeling Sellers, Adverts, Variants, Orders, Invoices, or Golden Products? Load [references/data-model.md](references/data-model.md)12- Syncing catalog from a PIM, creating/updating listings, taxons, images? Load [references/catalog-management.md](references/catalog-management.md)13- Creating orders, splitting across sellers, shipments, refunds? Load [references/orders-fulfillment.md](references/orders-fulfillment.md)14- Implementing payments, payouts, commission, or MPay reconciliation? Load [references/payments-payouts.md](references/payments-payouts.md)15- Configuring webhooks, designing payload queries, handling retries/HMAC? Load [references/webhooks-events.md](references/webhooks-events.md)16- Integrating Marketplacer with the commerce platform, search, PIM, OMS, ERP, or storefront? Load [references/composable-integration.md](references/composable-integration.md)17- Reviewing or debugging existing code? Load [references/anti-patterns.md](references/anti-patterns.md)1819**Load the relevant reference file before writing Marketplacer integration code.** The Operator API has several non-obvious modeling decisions — per-seller Adverts, Order → Invoice splits, no `Order` webhook, deposit-and-reconcile payouts, `paymentReferences` as an array — that quietly break integrations written from intuition. Live schema and changelog stay authoritative for field-level details; this skill is the judgment layer that tells you which mutation to reach for and why.2021## CRITICAL Priority2223| Pattern | File | Impact |24|---------|------|--------|25| Use the GraphQL Operator API — never the Legacy REST API | [references/api-setup.md](references/api-setup.md) | Legacy REST is deprecated; new builds on it accrue rework, missing features, and an unsupported migration path |26| Adverts are per-seller; Golden Products are marketplace-level | [references/data-model.md](references/data-model.md) | Treating Adverts as canonical product records duplicates data per seller and breaks PIM sync |27| Orders split into per-seller Invoices — there is no `Order` webhook | [references/orders-fulfillment.md](references/orders-fulfillment.md) | Subscribing at the Order level produces zero events; status updates ship as Invoice events |28| `paymentReferences` is a plural array of `{paymentReference, amount}` — never a string | [references/payments-payouts.md](references/payments-payouts.md) | Wrong shape causes order creation to fail and rules out split tender (gift card + card) entirely |29| MPay is deposit-and-reconcile, not Stripe Connect | [references/payments-payouts.md](references/payments-payouts.md) | Designing for split payment at capture leads to a fundamentally wrong checkout — Marketplacer never touches the shopper's funds |30| Webhook 4xx auto-disables the subscription | [references/webhooks-events.md](references/webhooks-events.md) | One bad deploy can silently kill production event flow until manually re-enabled |31| HMAC-verify webhook bodies before trusting them | [references/webhooks-events.md](references/webhooks-events.md) | The endpoint is public; unsigned acceptance allows order/inventory tampering |32| One Marketplacer instance = one hostname = one currency | [references/api-setup.md](references/api-setup.md) | Multi-region storefronts need multiple instances; building "currency as a field" assumes a model that doesn't exist |3334## HIGH Priority3536| Pattern | File | Impact |37|---------|------|--------|38| API keys are scoped and one-time-reveal — missing scopes surface as `extensions.code: "MISSING_SCOPE"` | [references/api-setup.md](references/api-setup.md) | Wrong scope = silent permission failures masquerading as schema errors; lost keys must be regenerated, breaking dependents |39| Pagination is forward-only (`first` + `after`); cap page size at 500 | [references/api-setup.md](references/api-setup.md) | UIs designed around backward paging or large pages will silently break |40| IDs are opaque base64; use `legacyId` only for display | [references/api-setup.md](references/api-setup.md) | Decoded IDs can change shape; code that depends on the format breaks on schema evolution |41| Honour the `Retry-After` header on 429/503 (default 60 s when absent) | [references/api-setup.md](references/api-setup.md) | Generic exponential backoff misses the documented signal; thundering-herd retries can sustain the rate limit |42| `ExternalIds`, `CustomFields`, and `Metadata` are three different extension surfaces | [references/data-model.md](references/data-model.md) | Picking the wrong one means you either can't query later (`metadata`) or can't display it cleanly (`externalIds`) |43| Refund mutations: positive amounts on `refundRequestRefund` / `refundRequestApprove`, negative only on `invoiceAmendmentUpdate` | [references/payments-payouts.md](references/payments-payouts.md) | Wrong sign drifts the deposit reconciliation in the opposite direction |44| Remittance (per-Invoice) and RemittanceAdvice (per-Seller payout group) are distinct entities | [references/payments-payouts.md](references/payments-payouts.md) | ERP AP feeds that conflate them post duplicate or missing bills |45| Golden Product backfill via barcode is batch (~1 hr) | [references/catalog-management.md](references/catalog-management.md) | UI flows that expect immediate seller-Advert backfill will appear broken |46| Subscribe to Invoice + Shipment for fulfillment status | [references/orders-fulfillment.md](references/orders-fulfillment.md) | Polling burns rate-limit budget; the event matrix already covers every state transition |47| Webhook payloads are caller-shaped GraphQL queries | [references/webhooks-events.md](references/webhooks-events.md) | Default payloads are minimal — without a registered query the receiver gets just `{ id }` |48| Deduplication respects payload equality, not just event type | [references/webhooks-events.md](references/webhooks-events.md) | Including `updatedAt` in the query disables dedup; omitting it can hide real changes |49| Commission flips on refund | [references/payments-payouts.md](references/payments-payouts.md) | Reporting that doesn't model the reversal will over-state operator revenue |50| Map Marketplacer entities into the wider stack via `ExternalIds` | [references/composable-integration.md](references/composable-integration.md) | Without a consistent foreign-key strategy, sync drift becomes unrecoverable |5152## MEDIUM Priority5354| Pattern | File | Impact |55|---------|------|--------|56| Prototype-driven attributes (advert-level vs variant-level) | [references/catalog-management.md](references/catalog-management.md) | Wrong option-type level causes "missing required attribute" failures on publish |57| Image source URLs must resolve in <5 s | [references/catalog-management.md](references/catalog-management.md) | Slow CDNs silently drop images; surface validation early |58| Catalog Rules can mutate an Advert after the upsert returns | [references/catalog-management.md](references/catalog-management.md) | Code that trusts the submitted Taxon/state drifts from reality — read post-rule state from the webhook |59| Partial shipments are first-class; sum quantities ≤ ordered | [references/orders-fulfillment.md](references/orders-fulfillment.md) | Code that creates one shipment per invoice can't handle split-pack reality |60| RefundRequest has its own state machine separate from Invoice | [references/orders-fulfillment.md](references/orders-fulfillment.md) | Treating refund as an Invoice mutation produces stuck states |61| Additional Charges (return shipping, restocking) flow to the seller, not the operator | [references/payments-payouts.md](references/payments-payouts.md) | Operator-side accounting that captures these as operator revenue is wrong by design |62| Wholesale orders: cart owns price resolution; Marketplacer settles whatever `cost.amount` you submit | [references/orders-fulfillment.md](references/orders-fulfillment.md) | Code expecting Marketplacer to detect "wholesale" and adjust pricing/commission itself will be wrong on most instances |63| Pricing is whole-cent integer in lowest denomination | [references/api-setup.md](references/api-setup.md) | Floats and fractional cents round silently and break ledger reconciliation |64| High-volume mode purges delivered events | [references/webhooks-events.md](references/webhooks-events.md) | Cannot rely on Marketplacer as the replay source past 50k undelivered |65| Use search engine for catalog reads, not Operator API | [references/composable-integration.md](references/composable-integration.md) | GraphQL is for writes and admin reads; storefront listing pages should query the search index |66| Operator order webhook = Invoice; OMS owns the customer order | [references/composable-integration.md](references/composable-integration.md) | Avoids dual-source-of-truth conflicts on order state |6768## Common Anti-Patterns (Quick Reference)6970| Anti-Pattern | File | Consequence |71|--------------|------|-------------|72| Using the Legacy Seller REST API for new work | [references/anti-patterns.md](references/anti-patterns.md) | Building on deprecated surface; missing features and migration burden |73| Subscribing to an `Order` webhook event | [references/anti-patterns.md](references/anti-patterns.md) | Event never fires — Marketplacer emits Invoice events, not Order |74| Designing Stripe-Connect-style split payments | [references/anti-patterns.md](references/anti-patterns.md) | Architectural rewrite — Marketplacer is deposit-and-reconcile, not split-capture |75| Decoding base64 IDs to extract the integer | [references/anti-patterns.md](references/anti-patterns.md) | Format may change; use `legacyId` if you need the integer |76| Storing foreign-system keys in `metadata` | [references/anti-patterns.md](references/anti-patterns.md) | Cannot query by metadata — use `ExternalIds` for lookup |77| Returning HTTP 4xx from a webhook receiver | [references/anti-patterns.md](references/anti-patterns.md) | Auto-disables the webhook subscription |78| Treating Adverts as marketplace-wide product records | [references/anti-patterns.md](references/anti-patterns.md) | Per-seller duplication; PIM sync target should be Golden Products |79| Trusting webhook payloads without HMAC verification | [references/anti-patterns.md](references/anti-patterns.md) | Public endpoint accepts forged traffic |80| Polling for order status instead of subscribing | [references/anti-patterns.md](references/anti-patterns.md) | Burns rate-limit budget; lags real state |81| Designing UI around backward pagination | [references/anti-patterns.md](references/anti-patterns.md) | API supports forward-only cursors |82| Using fractional cents or floats for money | [references/anti-patterns.md](references/anti-patterns.md) | Silent rounding; reconciliation drift |83| Sanitizing HTML output server-side and assuming Marketplacer did it | [references/anti-patterns.md](references/anti-patterns.md) | Marketplacer does not sanitize — XSS risk on the storefront |8485## Live Documentation as Source of Truth8687This skill encodes the **patterns and judgment** for working with Marketplacer. It does not duplicate field-level schema documentation, which drifts. For the live schema, the live changelog, and any documented endpoint detail not covered here, defer to:8889| Need | Source |90|------|--------|91| Schema introspection (queries, mutations, types) | `https://<instance>/graph-doc/` (GraphDoc / Voyager / Spectaql per instance) |92| Operator API how-tos | [api.marketplacer.com/docs/operator-api/](https://api.marketplacer.com/docs/operator-api/) |93| Webhook event matrix and lifecycle docs | [api.marketplacer.com/docs/webhooks/](https://api.marketplacer.com/docs/webhooks/webhooksoverview/) |94| API changelog (breaking changes, deprecations) | [changelog.marketplacer.com](https://changelog.marketplacer.com/en) |95| Legacy REST (only for the small feature-gap list) | [api.marketplacer.com/docs/seller-api/feature_matrix/](https://api.marketplacer.com/docs/seller-api/feature_matrix/) |9697**Workflow:** Use this skill to understand the right pattern → look up exact field names in the live GraphDoc → write the code → verify against the changelog for any drift.9899## Related Skills100101- [commercetools-api](../commercetools-api/SKILL.md), [commercetools-data](../commercetools-data/SKILL.md) — when the commerce platform behind the marketplace is commercetools, those skills cover the cart/order/PIM-side patterns102- [akeneo](../akeneo/SKILL.md) — when the PIM feeding Golden Products is Akeneo103- [algolia](../algolia/SKILL.md) — when the search engine indexing Adverts is Algolia