# @blade-and-brawn/commerce Printful and Webflow API clients, plus the `ProductSyncer` that keeps Webflow CMS products/SKUs in sync with Printful's catalog. ## Exports - `PrintfulClient` — `new PrintfulClient({ storeId, token, webhookSecret })`; products, webhooks. - `WebflowClient` — `new WebflowClient({ siteId, collectionIds: { products, skus }, token, webhookSecret })`; CMS products/SKUs, webhooks. - `ProductSyncer` — `new ProductSyncer(printful, webflow)`; `syncApparel(options)` pulls Printful products and upserts them into the Webflow collections, respecting the naming conventions below. - Shared `Printful`/`Webflow` request/response types (`util/types.ts`) and misc helpers (`util/misc.ts`, e.g. `formatSlug`). ## Printful product naming conventions - "Color-grouped" products follow the format `Product Name [color]`. Constraints: 1. A color-grouped product should have no more than *one* Printful color variant. 2. That single color-grouped product's variant should match `[color]`. 3. Printful product names should be unique. See `apps/api/src/scripts/register-webhooks.ts` for how webhooks are registered against the API's domain, and `apps/api/src/services/commerce.ts` for how `ProductSyncer` is invoked.