dist/cursor/bigcommerce-commerce/skills/bc-checkout/SKILL.md
Customize BigCommerce checkout — Checkout SDK, embedded checkout, server-side checkout API, custom checkout UI, and checkout extensions. Use when modifying the checkout experience or building headless checkout flows.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins bc-checkoutInstall 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.
Fetch live docs:
https://developer.bigcommerce.com/docs/storefront/cart-checkout/checkout-sdk for Checkout SDKsite:developer.bigcommerce.com checkout api for Checkout API referencebigcommerce embedded checkout headless for embedded checkout patterns| Approach | Where | Use Case | |----------|-------|----------| | Native Checkout | BigCommerce storefront | Default — customize via SDK or theme | | Embedded Checkout | External site (iframe) | Headless with BigCommerce-hosted checkout | | Custom Checkout | Your own frontend | Fully custom using Checkout/Payments API |
A JavaScript SDK for customizing the native BigCommerce checkout:
@bigcommerce/checkout-sdk npm packagenpm install @bigcommerce/checkout-sdk
import { createCheckoutService } from '@bigcommerce/checkout-sdk';
const service = createCheckoutService();
// Load checkout
await service.loadCheckout(checkoutId);
// Get current state
const state = service.getState();
const checkout = state.data.getCheckout();
// Update shipping address
await service.updateShippingAddress(address);
// Select shipping option
await service.selectShippingOption(optionId);
// Apply coupon
await service.applyCoupon(code);
// Submit order
await service.submitOrder(orderPayload);
The state object provides selectors:
getCheckout() — full checkout datagetCart() — cart items and totalsgetCustomer() — customer infogetShippingAddress() — shipping addressgetBillingAddress() — billing addressgetShippingOptions() — available shipping methodsgetPaymentMethods() — available payment methodsgetOrder() — completed orderSubscribe to state changes:
service.subscribe(state => {
const checkout = state.data.getCheckout();
// React to checkout state changes
});
Embed BigCommerce's checkout in an external site via iframe:
redirect_urls.checkout_url)postMessage events from the iframeInclude the Embedded Checkout script:
import { embedCheckout } from '@bigcommerce/checkout-sdk';
embedCheckout({
url: checkoutUrl,
containerId: 'checkout-container',
onComplete: () => { /* order placed */ },
onError: (error) => { /* handle error */ },
onFrameLoad: () => { /* checkout loaded */ },
});
X-Frame-Options and CSP headers to allow embeddingPOST /v3/carts with line itemsPOST /v3/checkouts/{id}/billing-addressPOST /v3/checkouts/{id}/consignmentsPUT /v3/checkouts/{id}/consignments/{consignmentId}POST /v3/checkouts/{id}/ordersPOST /v3/payments (via Payments API)| Endpoint | Method | Purpose |
|----------|--------|---------|
| /v3/carts | POST | Create cart |
| /v3/carts/{id}/items | POST, PUT, DELETE | Manage cart items |
| /v3/carts/{id}/redirect_urls | POST | Get checkout URL |
| /v3/checkouts/{id} | GET | Get checkout state |
| /v3/checkouts/{id}/billing-address | POST, PUT | Set billing address |
| /v3/checkouts/{id}/consignments | POST | Add shipping info |
| /v3/checkouts/{id}/coupons | POST, DELETE | Apply/remove coupons |
| /v3/checkouts/{id}/orders | POST | Create order from checkout |
Checkout uses templates/pages/checkout.html with special handling:
empty layout (minimal wrapper)Override checkout JavaScript for UI modifications:
github.com/bigcommerce/checkout-jsFetch the Checkout SDK docs and BigCommerce Checkout API reference for exact method signatures, state structure, and configuration options before implementing.
development
Build with Spree's headless Next.js storefront — the official `spree/storefront` repo (Next.js 16 App Router with Server Actions and Turbopack, React 19 Server Components, Tailwind CSS 4, TypeScript 5, `@spree/sdk`, Sentry), server-only auth (httpOnly JWT cookies + publishable key), MeiliSearch faceted catalog, one-page checkout with Apple/Google Pay/Klarna/Affirm/SEPA, multi-region market routing, GA4 + JSON-LD SEO, and Vercel/Docker deployment. Use when forking or customizing the storefront, or evaluating headless adoption.
tools
Build Spree extensions as Rails engines — gem scaffolding, `bin/rails g spree:extension`, mounting routes/migrations/assets, the modern `prepend` decorator pattern (`*_decorator.rb` with `self.prepended(base)`), generators (`spree:model_decorator`, `spree:controller_decorator`), the four customization surfaces in preference order (Events > Webhooks > Dependencies > Decorators), Spree::Dependencies for swapping service objects, gem release/versioning, and the deprecated Deface engine. Use when building a reusable Spree extension or adding non-trivial customization to an app.
development
Build with Spree's event bus and Webhooks 2.0 — `Spree::Events` publication, `Spree::Subscriber` DSL with `subscribes_to` and `on`, wildcard matching, lifecycle events (`{model}.created/.updated/.deleted` via `publishes_lifecycle_events`), the canonical event catalog (order.*, payment.*, shipment.*, product.*), Webhooks 2.0 endpoints, HMAC-SHA256 signing (`X-Spree-Webhook-Signature`), exponential-backoff retries, and Sidekiq job orchestration. Use when wiring event-driven business logic, building webhook consumers, or replacing ActiveSupport callback chains.
tools
Cross-cutting Spree development patterns — the customization preference hierarchy (Events > Webhooks > Dependencies > Decorators), `Spree::Dependencies` service-object swapping, the `_decorator.rb` + `prepend` + `self.prepended` idiom, idempotent subscribers and webhook receivers, multi-store scoping discipline, prefixed IDs, calculator polymorphism (shipping/promotion/tax share the base), service-object composition with `dry-monads` or simple results, why to avoid `class_eval` reopening and Deface, and Spree-on-Rails idioms (Hotwire/Turbo Stimulus, ActiveStorage, Action Cable, Sidekiq). Use when designing the architecture of a Spree extension or solving cross-cutting concerns.