skills/sales-snipcart/SKILL.md
Snipcart platform help — developer-first embeddable shopping cart for static/JAMstack/custom sites (Hugo, Gatsby, Next.js, Astro, WordPress): define products with data-item-* HTML attributes and Snipcart injects the cart/checkout, validating prices by crawling your product URLs. REST API (app.snipcart.com/api, Basic auth with the secret key as username), webhooks with token-callback validation, a JS SDK, and an official hosted MCP Server for Claude/Cursor. Use when checkout fails with product-crawling-failed or a price-mismatch error, cart items won't add because data-item-id/price/name/url attributes are missing, products on a JS-rendered or headless-CMS page can't be validated, verifying webhooks via the X-Snipcart-RequestToken callback, managing orders/discounts through the MCP server or REST API, or weighing the 2% transaction fee against the flat fee at low volume. Do NOT use for cart-platform selection or checkout strategy (use /sales-checkout) or widget-store platforms like Ecwid (use /sales-ecwid).
npx skillsauth add sales-skills/sales sales-snipcartInstall 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.
Snipcart is a developer-first embeddable cart: a JS snippet plus data-item-* buy-button attributes turn any static/JAMstack/custom site into a store. Its signature mechanic — and #1 error class — is price validation by crawling your product URLs. Automation runs through a REST API, webhooks with token-callback verification, a JS SDK, and an official hosted MCP server.
If references/learnings.md exists, read it first for accumulated platform knowledge.
Ask only what you can't infer from the user's prompt:
What are you trying to do?
product-crawling-failed, price mismatch, missing attributes)Is the product page server-rendered? JS-rendered pages break the price crawler — the fix differs (JSON crawling endpoint vs SSR).
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 (Snipcart vs Ecwid/Foxy/Shopify Buy Button/Stripe Checkout) | /sales-checkout {question} |
| Widget-store platforms (Ecwid) | /sales-ecwid {question} |
| Checkout-conversion strategy across tools | /sales-checkout {question} |
| Selling digital downloads strategy | /sales-digital-products {question} |
| Tax / Merchant-of-Record obligations | /sales-merchant-of-record {question} |
When routing, give the exact command: "This is a {domain} question — run: /sales-checkout {original question}"
Otherwise, answer Snipcart-specific questions directly using Step 3.
Read references/platform-guide.md for the full reference — capabilities & automation surface, pricing, data model (products live in your markup), and quick-start recipes (token-validated webhook listener, order pulls, the JSON-crawling-endpoint fix).
For raw auth detail, endpoint groups, webhook mechanics, and the MCP server, read references/snipcart-api-reference.md.
Answer using only the relevant section — don't dump the full reference.
product-crawling-failed as a crawler-visibility problem: check, in order — all four mandatory attributes present (data-item-id/price/name/url), the data-item-url reachable server-side with the exact same price, the domain in the allowed list, and no JS mutating attributes after render. JS-rendered/headless-CMS pages need a JSON crawling endpoint (Recipe 3).X-Snipcart-RequestToken, GET /api/requestvalidation/{token} — 200 means genuine. There's no HMAC and no documented auto-retry; keep a GET /api/orders reconciliation poll and use the dashboard's "Send this hook again" for redelivery.max($20/mo, 2% of sales) plus payment-gateway fees, and flag it best-effort — tell the user to verify at snipcart.com/pricing; at meaningful volume compare the 2% against flat-fee carts via /sales-checkout.snipcart-mcp.azurewebsites.net), authenticated with the private key in the X-Snipcart-Api-Key header; ~38 tools for orders/stock/discounts/refunds.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 pricing and MCP client support.
data-item-url — that's what stops DOM price-tampering. Every convenience that hides products from server-side fetching (SPA rendering, client-side price updates, blocked domains) breaks checkout.data-item-* attributes are mandatory (id, price, name, url) — items silently refuse to add without them./sales-checkout — Cart/checkout platform selection (Snipcart vs Ecwid vs Foxy vs Shopify Buy Button) and conversion strategy/sales-ecwid — Ecwid platform help (the widget-store alternative — hosted storefront UI instead of markup-defined products)/sales-foxy — Foxy platform help (the signed-links alternative — HMAC-signed cart links instead of crawler validation; hosted checkout pages)/sales-digital-products — Digital-product strategy (Snipcart delivers digital goods; pricing/launch live here)/sales-merchant-of-record — Tax/VAT handling (Snipcart automates tax calc but is not a Merchant of Record)/sales-subscription-billing — Recurring billing strategy across platforms/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: "Orders fail at payment with 'product-crawling-failed' — my products are in Storyblok and the site is client-rendered."
Skill does: Explains the crawler-based price validation (Snipcart fetches data-item-url server-side, so client-rendered attributes are invisible), and applies Recipe 3: serve a JSON crawling endpoint (static file or serverless function) with matching ids/prices, point data-item-url at it, confirm the domain is allowed, and stop mutating attributes with JS.
Result: The crawler validates against the JSON endpoint and checkout completes.
User says: "How do I trigger my fulfillment flow when a Snipcart order completes, and make sure the request is really from Snipcart?"
Skill does: Sets up the order.completed webhook, verifies each request by calling GET /api/requestvalidation/{X-Snipcart-RequestToken} with Basic auth (key as username), acts on the event content, returns 200 fast, and adds a paginated GET /api/orders reconciliation poll since retries aren't documented — using Recipe 1's Flask listener.
Result: Fulfillment fires only on genuine, verified events with a polling safety net.
User says: "I sell about $8k/month from my Astro site — what does Snipcart actually cost me?"
Skill does: Computes max($20, 2% × $8,000) = $160/mo plus gateway fees, flags pricing as best-effort with a pointer to snipcart.com/pricing, and notes the crossover logic — at rising volume a flat-fee cart may win, comparing via /sales-checkout.
Result: User sees the real monthly cost and the volume threshold where the model flips.
product-crawling-failed at checkoutSymptom: Payment step fails; dashboard shows a crawling error.
Cause: The crawler couldn't fetch the product at data-item-url, found a different price, hit a JS-rendered page, or the domain isn't allowed.
Solution: Verify the URL returns the product server-side (curl it), match prices exactly, add the domain to allowed domains, and for SPA/headless-CMS pages serve a JSON crawling endpoint (Recipe 3). Never update data-item-* values with client-side JS.
Symptom: Clicking the buy button does nothing or errors.
Cause: One of the mandatory attributes (data-item-id, data-item-price, data-item-name, data-item-url) is missing or malformed.
Solution: Add all four; check the browser console — Snipcart logs which attribute is missing. Keep ids stable across builds.
Symptom: REST calls rejected despite a valid key.
Cause: Key sent as a Bearer token instead of Basic-auth username, or a Test key used against Live data (or vice versa).
Solution: Send Authorization: Basic base64("{key}:") — the key is the username with an empty password (-u KEY: in cURL). Match key mode to the data mode you're querying.
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).