skills/sales-drupal-commerce/SKILL.md
Drupal Commerce platform help — the open-source (GPL) commerce framework built on Drupal/PHP (drupalcommerce.org, by Centarro): stores, products/variations, orders, carts, checkout, payments, and promotions as Drupal entities, exposed headlessly through core JSON:API (UUID-addressed, page[offset]/page[limit] paging) plus the Commerce Cart API module (cart tokens, add/update items, checkout, Commerce-Current-Store header, order-transition webhooks). Auth via Simple OAuth (Bearer), Basic, or JWT. Use when building a headless/decoupled Drupal Commerce storefront, fixing add-to-cart failing over JSON:API without granting anonymous users admin-store permission, authenticating with Simple OAuth, wiring orders into a CRM or warehouse, reacting to an order state transition, or choosing Drupal Commerce vs Shopify/Magento/WooCommerce for a content-heavy store. Do NOT use for cross-cart checkout strategy (use /sales-checkout) or picking a Merchant of Record for global tax (use /sales-merchant-of-record).
npx skillsauth add sales-skills/sales sales-drupal-commerceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Drupal Commerce (drupalcommerce.org, maintained by Centarro since 2010) is an open-source (GPL) commerce framework built on Drupal/PHP — everything (stores, products/variations, orders, carts, promotions, customer profiles) is a Drupal entity, so commerce and content share one system. Its sweet spot is content-heavy, custom-catalog, or unusual-checkout stores that a developer/agency builds. It's headless-capable via Drupal core JSON:API plus the Commerce Cart API module. It's free/self-hosted (you own hosting + dev), and not a Merchant of Record. Most integration friction is Drupal's permission model and its entity/JSON:API structure, not a vendor limit.
If references/learnings.md exists, read it first for accumulated platform knowledge.
Ask only what you can't infer from the user's prompt:
Skip-ahead rule: if the user's prompt already has enough context, go straight to Step 2.
| If the user's question is about… | Route to |
|---|---|
| Which cart/commerce platform to pick, or checkout-conversion strategy (Drupal Commerce vs Shopify/Magento/WooCommerce; bumps, upsells, cart abandonment) | /sales-checkout {question} |
| The headless-vs-monolith / composable architecture decision itself | /sales-checkout {question} |
| Digital-product pricing, validation, launch strategy | /sales-digital-products {question} |
| Choosing a hosted Merchant of Record so someone else owns global VAT/GST (Drupal Commerce is NOT one) | /sales-merchant-of-record {question} |
| Migrating a store's catalog/customers/orders into or out of Drupal Commerce | /sales-store-migration {question} |
When routing, give the exact command: "This is a {domain} question — run: /sales-checkout {original question}"
Otherwise, answer Drupal Commerce-specific questions directly using Step 3.
Read references/platform-guide.md for the full reference — capabilities & automation surface
(what's JSON:API-, Cart-API-, webhook-, event-subscriber-accessible vs Drupal-admin-only), the
free/self-host cost model, data model (UUID-addressed entities, commerce_product /
commerce_order / commerce_order_item shapes), and quick-start recipes (Simple OAuth token +
JSON:API read, headless add-to-cart with a cart token, order-event outbound integration).
For raw endpoint detail, the JSON:API conventions, auth flows, pagination, and the Commerce Cart API
endpoints/webhooks, read references/drupal-commerce-api-reference.md.
Answer using only the relevant section — don't dump the full reference.
Commerce-Current-Store
header in multi-store setups.POST /oauth/token (password or
client_credentials grant); send Authorization: Bearer …. A 401 means missing/invalid
credentials; a 403 means authenticated but the Drupal role/permission doesn't allow that
entity/operation (Drupal access control is per-permission) — fix the role, don't over-grant. Basic
auth (basic_auth) and JWT are alternatives. Whenever you explain auth, also state the JSON:API
request conventions the call must follow — resources at /jsonapi/{entity_type}/{bundle},
items addressed by UUID, and the Accept: application/vnd.api+json header — and, for a
browser/decoupled client, that CORS must be enabled (add the front-end origin to cors.config
in services.yml) or the token-authenticated request still fails in the browser./jsonapi/{entity_type}/{bundle} (e.g. /jsonapi/commerce_product/default,
/jsonapi/commerce_order/default); individual items are addressed by UUID, headers are
application/vnd.api+json, and there is no PUT (use PATCH). Filter with ?filter[…], embed
relations with ?include=, trim fields with ?fields[…], and paginate with
?page[offset]= + ?page[limit]= (JSON:API default limit ~50). IDs are UUIDs in URLs even
though entities also have an internal integer id.GET /jsonapi/commerce_order/default/{uuid} (with your
Bearer token) before you act on it — provision, charge, or push to the CRM only from the re-fetched
order, and dedupe on the order UUID so retries are idempotent. If a webhook doesn't fit, react in code
to Drupal Commerce events (e.g. the order place/fulfill transition, OrderEvents) or
hook_ENTITY_TYPE_insert, or use the contrib Webhooks/Rules module. Because a delivery can be
missed, also pair any webhook with a nightly paginated /jsonapi/commerce_order/default
(page[offset]/page[limit]) reconciliation pull./sales-checkout.If you discover a gotcha or tip not in references/learnings.md, append it there with today's date.
Best-effort from research (2026-07) — review these, especially module names and the permission behaviors, which vary across Drupal/Commerce versions.
application/vnd.api+json, and has no PUT (PATCH
to update). There's no /jsonapi/{entity_type} collision endpoint — always include the bundle.Commerce-Current-Store header on Cart API calls, or operations hit the
wrong/undefined store./sales-checkout — Checkout-conversion strategy and cart/commerce-platform selection (Drupal Commerce vs Shopify/Magento/WooCommerce; the headless-vs-monolith decision)/sales-merchant-of-record — Choosing a Merchant of Record for global tax (Drupal Commerce is not one)/sales-store-migration — Migrating a store's catalog, customers, and orders between platforms/sales-woocommerce — WooCommerce platform help (the other CMS-plugin commerce, on WordPress)/sales-shopware — Shopware platform help (the PHP/Symfony mid-market/B2B alternative)/sales-saleor — Saleor platform help (a GraphQL-native headless alternative)/sales-do — Not sure which skill to use? The router matches any sales objective to the right skill. Install: npx skills add sales-skills/sales --skill sales-do -a claude-codeUser says: "My decoupled front end can't add products to the cart via the Drupal Commerce API — it only works if I let anonymous users administer stores, which feels wrong."
Skill does: Confirms granting administer stores to anonymous is a security hole and not the fix;
installs the Commerce Cart API module, obtains a cart token for the anonymous shopper, and
uses the Cart API endpoints (get cart → add item → checkout) with the Commerce-Current-Store
header, authenticating reads/writes via Simple OAuth Bearer where needed — keeping store-admin
permissions off the anonymous role.
Result: Anonymous shoppers build carts through the Cart API without any over-permissioning.
User says: "How do I push every placed Drupal Commerce order into my CRM reliably?"
Skill does: Enables the Commerce API order state-transition webhook to a tokenized HTTPS
endpoint (or a Drupal event subscriber on the order place transition), re-fetches the order via
GET /jsonapi/commerce_order/default/{uuid} (Simple OAuth Bearer) before writing, dedupes on the
order UUID, and adds a nightly page[offset]/page[limit] paginated reconciliation pull as a
backstop in case a delivery is missed.
Result: CRM stays in sync with verified order data even if a webhook is dropped.
User says: "We run a big editorial site and want to add a store with unusual product attributes — is Drupal Commerce right, or should we use Shopify?"
Skill does: Frames Drupal Commerce's edge — commerce and content as one Drupal entity system, deep
custom attributes and checkout flows — against its cost: it's a developer build (Drupal/PHP + hosting),
free/GPL but not turnkey. Notes it's not a Merchant of Record, and routes the cross-platform tradeoff to
/sales-checkout for a turnkey (Shopify) comparison.
Result: The team chooses based on dev capacity and content-commerce fit, not feature lists.
Symptom: POST to add an order item over JSON:API 403s unless anonymous users can administer stores.
Cause: Raw JSON:API writes to commerce_order/commerce_order_item require broad entity
permissions; exposing them to anonymous users is unsafe. The cart flow is meant to go through the Cart API.
Solution: Install the Commerce Cart API module, request a cart token for the shopper, and
use its cart endpoints (add/update/remove items, checkout) with the Commerce-Current-Store header —
leave administer stores off the anonymous role.
Symptom: Requests fail with 401 or 403.
Cause: 401 = missing/invalid token (or Simple OAuth not set up); 403 = authenticated but the
Drupal role/permission doesn't allow that entity/operation; sometimes CORS blocks a browser consumer.
Solution: Get a Bearer token from POST /oauth/token (Simple OAuth) and send it; for 403, grant the
specific permission to the API user's role (not a blanket admin role); configure CORS for browser clients.
Symptom: There's no webhook-URL screen in core Drupal.
Cause: Core Drupal has no outbound webhook UI; event delivery lives in the Commerce API module or in code.
Solution: Use the Commerce API module's order state-transition webhook, or write a Drupal
event subscriber on the order transition (OrderEvents / commerce_order.place.post_transition) /
hook_ENTITY_TYPE_insert that POSTs out, or the contrib Webhooks/Rules module. Add a polling
reconciliation pull as a safety net and dedupe on order UUID.
tools
Wizlogo (wizlogo.com) platform help — a budget online logo maker (template/style-variation, marketed as "AI") plus a hub of FREE branding tools (business-name, blog-name and slogan generators, business-card maker, invoice generator, color converter, domain search). The pricing traps: the FREE logo is PERSONAL-USE-ONLY; the two cheap paid tiers are RASTER PNG/JPG only — Single (~€39.99 one-time) and Unlimited (~€3.99 per WEEK, recurring) — and VECTOR (SVG/PDF/EPS) is gated to the ~€299.99 Enterprise tier, which also bundles human designer edits and a social kit. Transparent PNG is on all paid plans. Use when making a Wizlogo logo, understanding free-vs-paid or personal-vs-commercial use, which tier unlocks vector/SVG for print, the weekly-subscription billing trap, its free name/slogan generators, or whether it has an API (UI-only — no public API, webhooks, Zapier or MCP). Do NOT use to just generate the business name (use /sales-namelix) or to compare/validate branding tools (use /sales-idea-validation).
tools
VistaPrint platform help (vistaprint.com, a Cimpress company) — the small-business design + print + digital-marketing platform: a free AI Logomaker (4 generations, 60 more after free sign-up) exporting SVG/PNG/PDF at 4000x4000 with no watermark, a free Brand Kit, business cards/flyers/signage/apparel/promo print, and a website builder. THE RIGHTS TRAP: VistaPrint states NO intellectual-property rights transfer on an AI-generated logo — you get usage rights but CANNOT register it for trademark or copyright; only its human designer service transfers full IP. Use when making a VistaPrint logo, asking if you own or can trademark it, running out of AI logo credits, printed colors not matching the screen, bleed/DPI/font file-prep rejections, or asking whether VistaPrint has an API (the consumer site does not — automation runs through the parent Cimpress Open partner-fulfilment API). Do NOT use for Vista Social scheduling (use /sales-vistasocial) or comparing logo tools market-wide (use /sales-idea-validation).
tools
Turbologo (turbologo.com) platform help — a budget AI/DIY logo maker: enter a business name + industry, pick icons and colors, and it proposes logo concepts you refine in an in-browser editor, then pay a one-time fee to download (designing is free, previews are watermarked, downloading is the paywall). Vector SVG/PDF is gated to the mid tier and up; the top tier adds a brand kit (business cards, letterheads, email signatures, social assets). Use when generating a logo in Turbologo, choosing which download tier to buy, vector SVG vs raster PNG, removing the free watermark, the time-limited edit-after-purchase window, pay-to-download pricing questions, whether an AI logo is yours to trademark, or whether Turbologo has an API to bulk-generate logos (it is UI-only — no public API, webhooks, Zapier, or MCP). Do NOT use to generate the business name (use /sales-namelix), compare or validate branding tools across the market (use /sales-idea-validation), or build wider marketing creative (use /sales-canva).
tools
Online Logo Maker (onlinelogomaker.com) platform help — a long-standing free/freemium DIY logo maker: build the mark yourself from icons, shapes, text, and fonts — MANUAL/template-based, NOT enter-a-name-get-AI-concepts. The free pack downloads a LOW-RES 300px PNG with a background; vector SVG, transparent PNG, and 2000px high-res are gated to a one-time lifetime Premium pack (not a subscription). The free tier's commercial-use rights are disputed by reviewers — clean ownership effectively needs Premium, and a shared-icon mark can be non-distinctive. Use for building/editing a logo here, free download vs Premium, vector SVG or transparent PNG, one-time pricing, commercial-use/trademark terms, near-namesake confusion (NOT LogoMaker.com / LogoMakr / Logomakerr.ai), or whether it has an API (UI-only — no API, webhooks, Zapier, MCP). Do NOT use to generate the business name (use /sales-namelix), compare branding tools across the market (use /sales-idea-validation), or build wider creative (use /sales-canva).