25+ modules. 427 source files. 565 tests. 67 API routes. 19 admin pages. One cartridge.config.ts file controls everything. Connects to Shopify, WooCommerce, or CSV. Deployed in under an hour.
Headless Next.js 16 frontend. Static site generation with incremental static regeneration (2-minute revalidation). Every product, collection, and page from your store rendered in a custom theme with sub-30ms page loads.
Press Cmd+K (Mac) or Ctrl+K (Windows) on any page. A Spotlight-style search modal opens instantly. Type to filter products and collections in real-time. Arrow keys to navigate, Enter to select, Escape to close. Results show product thumbnails, titles, prices, and vendors. Data fetched on first open and cached client-side. No API call per keystroke.
Hover the main product image on any product detail page. A 2.5x magnified view follows your cursor, showing fabric texture, stitching detail, and material quality. Desktop only. Mobile uses native pinch-to-zoom. "Hover to zoom" hint badge in the corner. Zero npm dependencies for zoom. CSS background-image positioning.
Hover any product card on any collection page and an eye icon appears in the top-right corner. Click it to open a modal with the product image, title, price, variant selector, and Add to Cart button without navigating away from the collection. Includes a "View full details" link. Built with Framer Motion spring physics.
Heart icons on every product card (top-left). Click to save, click again to remove. Persisted to localStorage, survives page reloads and browser sessions. Dedicated /wishlist page showing all saved items in a product grid. Heart badge with count in the site header. Works across all product grids: homepage, collections, recommendations, quick view.
On /collections/all, a horizontal scrollable filter chip bar appears above the product grid. Filter by product type (Signs, Rugs, Art, etc.) and price range (Under $100, $100-500, $500+). Client-side filtering. No API calls. Instant results. "Clear filters" button with product count. Filter labels configurable in cartridge.config.ts.
Numbers on the About page and landing pages count up from zero when scrolled into view. "30+" becomes 0, 1, 5, 12, 22, 30+ over 1.5 seconds with easeOut easing. Built with Framer Motion's useMotionValue + animate. Fires once (useInView with once: true). Suffix support: "+", "%", "K".
Share buttons on every product detail page, next to the price: Copy Link (with "Copied!" feedback for 2 seconds), Native Share (uses navigator.share on mobile, hidden on desktop if unsupported), and WhatsApp deep link. Share URL uses the canonical site URL from config.
On mobile viewports (<768px), when the main Add to Cart button scrolls out of view, a fixed bottom bar appears with the product title (truncated), price, and action button. Uses Framer Motion's useInView on the main CTA ref. Disappears when you scroll back up. For inquiry items, shows "Inquire" instead of "Add to Cart".
Below the Add to Cart button on every product page: three expandable accordion sections. Shipping, Returns, and Custom Orders. Content reads from brand.shipping config (free shipping threshold, flat rate, custom item note, return days, custom refundability, lead times). Animated expand/collapse with Framer Motion's AnimatePresence.
Every product detail page shows a colored availability badge above the price: * Ready to ship (priced + available), * Hand-crafted in 4-6 weeks ($0 / quote items), or * By consultation only (unavailable). Lead time reads from config.
Every product detail page has a "You Might Also Like" horizontal scroll strip below the description. Deterministic scoring algorithm: vendor match (+5), product type match (+4), shared tags (+2 each), similar price range (+2). Server-rendered with Suspense + shimmer loading skeleton. Snap-scroll on mobile. Shows up to 8 related products.
Claude Sonnet 4 via Vercel AI SDK v6 streaming. A chat assistant on every page that knows your entire product catalog, captures leads, handles custom order intake, remembers conversations, and tests prompt variants for statistical significance.
White circle button (bottom-right of every page). Expands to a 400x600px panel on desktop, full-screen sheet on mobile. "Ask our AI concierge" hint bubble appears after 8 seconds on first visit. Dark zinc theme matching the storefront aesthetic. Framer Motion spring animations for open/close.
The full product catalog (titles, handles, vendors, prices, types, tags, descriptions) is injected into the Claude system prompt on every chat request. Rebuilt from the product source every 5 minutes (in-memory cache). No RAG. No vector store. No database. The model sees everything.
searchProducts: Searches the product catalog by keyword with scored matching (title +3, vendor +2, type +2, tag +2, word match +1). Returns top 6 results with links and prices.
createQuoteRequest: When a customer provides their email and describes what they want, creates a HubSpot lead with full details (product interest, notes, contact info). Returns "Quote request submitted."
captureEmail: Lightweight email capture when a customer shares their email casually in conversation. Creates a HubSpot subscriber contact.
Uses Vercel AI SDK v6 streamText with Claude Sonnet 4. Responses stream in real-time. First token appears in <1 second. toUIMessageStreamResponse() consumed by useChat hook on the client. Three-dot typing indicator while waiting for first token.
Every chat session is persisted to KV with a 90-day TTL. Keyed by session ID. Stores up to 50 messages per conversation plus a generated summary. When a visitor returns, the AI can recall their previous questions and interests. Conversation records are linked to customer profiles after email identification.
When an anonymous visitor provides their email (via any capture tool), their session is linked to their customer profile. All prior conversation history, browse activity, and cart data merge into the identified profile. The AI gets customer context injected into the next system prompt: "This customer previously viewed X, asked about Y, spent $Z lifetime."
Deterministic variant assignment based on session hash. 50/50 split. Each variant gets its own conversion tracking (email captures from chat). Statistical significance calculated via two-proportion z-test with p<0.05 threshold and minimum 100 sessions per variant. Results visible in the admin AI analytics page. Swap prompt variants without code changes.
In-memory sliding window: 20 requests per minute per IP. Returns 429 with Retry-After header. Periodic cleanup of expired entries. Separate from the API key rate limiter used by the REST API.
A drag-and-drop canvas where merchants create "When X, Wait, If Y, Then Z" automation flows. No code required. No external automation tool needed. The entire workflow engine runs inside Cartridge.
The canvas supports 18 node types organized into four categories:
Visual graph editor with snap-to-grid positioning. Drag nodes from a sidebar palette onto the canvas. Connect them by drawing edges between output ports and input ports. Zoom, pan, and minimap for complex workflows. Each node has a configuration panel that opens on click. Color-coded by type (triggers are blue, conditions are yellow, actions are green, flow control is purple).
Workflows are stored as directed acyclic graphs (DAGs) and executed by a topological-sort engine. Condition nodes branch the flow based on runtime data. Delay nodes pause execution and resume via scheduled cron. Every execution is logged with: start time, each node visited, data at each step, and final outcome. Failed nodes retry 3 times with exponential backoff.
8 ready-to-use workflow templates: Abandoned cart recovery (trigger > wait 1h > check if purchased > send email > wait 24h > send follow-up), Lead nurturing (form submit > score lead > if high > notify owner, if low > drip sequence), Subscription renewal (renewal due > send reminder > wait > check payment > success/failure paths), and 5 more. One-click install. Customize any node.
Every node can read and write variables. Trigger nodes inject context variables: {{customer.name}}, {{order.total}}, {{cart.items}}. Action nodes use variables in templates: "Hi {{customer.name}}, you left {{cart.items.length}} items in your cart." Variables are type-safe and autocomplete in the node editor.
A Kanban board built into the admin where merchants see every customer relationship at a glance. Drag contacts between stages. Open any contact to see their full history.
Four columns: Subscriber, Lead, Opportunity, Customer. Each card shows contact name, email, deal value (if set), last activity timestamp, and lead score badge. Drag a card between columns to update their CRM stage. Drop zones highlight on hover. Card count per column. Sorted by most recent activity.
Click any card to open a slide-out drawer with the full contact record. Deal value input with currency formatting. Activity timeline showing every touchpoint: page views, chat conversations, email opens, form submissions, orders, and support interactions. Notes field for manual annotations. Tags for segmentation. Edit any field inline.
Above the Kanban board: stage conversion rates (what percentage of subscribers become leads, leads become opportunities, etc.). Average time in each stage. Total pipeline value. Comparison to previous period. Funnel visualization. Data feeds into the configurable analytics dashboard.
Chronological feed of every interaction for each contact: browsed product X (with timestamp), chatted with AI about Y (with conversation summary), opened email Z, submitted form W, placed order for $N. Each entry is linked to its source. The AI concierge reads this timeline to personalize conversations.
Assign deal values to opportunities. Weighted pipeline calculation: subscriber deals at 10%, leads at 25%, opportunities at 50%, customers at 100%. Total weighted pipeline value displayed on the dashboard. Won/lost deal tracking with reason codes.
A visual flow designer where merchants design guided conversation paths. The AI follows the flows as natural guidance -- not rigid scripts. Customers experience a natural conversation while the merchant controls the journey.
Node-based editor similar to the workflow builder but purpose-built for conversations. Message nodes display text to the customer. Question nodes capture responses and store them in variables. Branch nodes route the conversation based on customer answers. Action nodes trigger CRM updates, email sends, or webhook calls.
Define variables to capture during the conversation: {{name}}, {{email}}, {{product_interest}}, {{budget}}. Each question node maps the customer's response to a variable. Variables persist for the entire conversation and are available to all downstream nodes and actions.
The designed flows are injected into the Claude system prompt as natural guidance. The AI doesn't read the flow like a script -- it uses it as a roadmap for the conversation. If a customer goes off-script, the AI handles it naturally and steers back to the flow when appropriate. Best of both worlds: structured journeys with AI flexibility.
5 starter flows: Product Discovery (what are you looking for > budget > style preferences > recommendations), Quote Request (name > email > product interest > details > submit to CRM), Order Support (order number > lookup > status update), Gift Finder (who is it for > occasion > budget > curated picks), New Customer Welcome (introduce brand > learn preferences > suggest categories).
Per-flow metrics: completion rate (what percentage of customers finish the flow), drop-off points (where do they abandon), variable capture rates (how often do they provide their email), conversion to purchase (did the flow lead to a sale). Visible in the admin AI analytics page.
Merchants build their own analytics views from 18 data sources, 10 chart types, and 26 widget templates. No more staring at a dashboard someone else designed. Build exactly what you need to see.
Every module in Cartridge exposes its data: Revenue (orders, AOV, refunds), Traffic (page views, sessions, bounce rate), AI (chat volume, conversion, tool usage), Email (sends, opens, clicks, unsubscribes), CRM (pipeline stages, deal values, conversion rates), Partners (loads, clicks, orders, commission), Catalog (health scores, issues), Search (queries, results, clicks), Cart (abandonment, recovery, AOV), Subscriptions (active, churn, MRR), and 8 more.
SVG-rendered charts with no external dependencies: Bar (vertical/horizontal/stacked), Line (single/multi-series), Area (filled/stacked), Pie, Donut, Scatter, Funnel, Gauge, Heatmap, Sparkline. Responsive. Tooltips on hover. Legend toggles. Axis labels. Grid lines.
Pre-built widgets that snap together: Stat card (big number + trend arrow), Comparison card (this period vs. last), Table (sortable, filterable), Funnel (multi-stage conversion), Leaderboard (ranked list), Timeline (activity feed), Progress bar (goal tracking), and 19 more. Each widget is configurable: data source, time range, filters, and display options.
Every widget supports: Today, 7 days, 30 days, 90 days, custom range. Toggle comparison mode to overlay the previous period. Percentage change badges (green up, red down) on every metric. "Compared to last 30 days" annotations. Date range picker with calendar UI.
Widgets can be dragged to rearrange. Resizable: small (1/4 width), medium (1/2 width), large (full width). Multiple dashboard views with named tabs. Default "Morning Overview" dashboard pre-configured. Layouts saved per user.
Merchants build multi-step product wizards with conditional logic and dynamic pricing from the admin. Customers step through options and see their price update in real-time.
Define steps in the admin: Step 1 (choose size), Step 2 (choose material), Step 3 (choose color), Step 4 (add engraving). Each step can be a radio group, checkbox group, dropdown, text input, or image selector. Progress bar at the top. Back/forward navigation. Steps can be marked required or optional.
Steps show/hide based on previous selections. If the customer chooses "Premium Wood" in Step 2, Step 3 shows wood stain colors. If they choose "Metal," Step 3 shows powder coat options. Conditional rules defined in the admin with a visual rule builder: "Show Step 3b when Step 2 = Metal."
Each option has a price modifier: base price + size premium + material premium + color premium + engraving fee. Safe formula evaluator (no eval, no injection) calculates the total from modifier expressions. Live pricing sidebar shows the running total as the customer configures, with line-item breakdown.
Fixed sidebar on desktop (below wizard on mobile) showing: base price, each selected option with its price modifier, running total, and estimated delivery time. Updates instantly on every selection change. "Add to Cart" button with the configured product. Configuration saved as line item properties.
Visual wizard builder in the admin. Add/remove/reorder steps. Configure options per step with labels, images, and price modifiers. Set conditional visibility rules. Preview the wizard as a customer would see it. Assign wizards to specific products or product types.
Per-page SEO scoring, Google SERP preview, JSON-LD validation, keyword analysis, and technical audit. Everything you need to rank, in one place.
Every product, collection, and static page gets a 0-100 SEO score computed from: title tag length and keyword presence, meta description quality, heading hierarchy (H1 > H2 > H3), image alt text coverage, internal link density, content length, keyword density, URL structure, and page speed indicators. Actionable recommendations for each score factor.
Live preview of how each page will appear in Google search results: title (blue link), URL (green), description (gray). Character count indicators for title (max 60) and description (max 160). Warnings when truncation will occur. Edit title and description inline and see the preview update in real-time.
Validates Product, Organization, BreadcrumbList, and WebPage schema on every page. Checks for required properties (name, image, price, availability for Products), warns on missing optional properties (brand, review, aggregateRating), and validates against Google's Rich Results requirements. One-click test link to Google's Rich Results Test tool.
Analyzes your catalog for keyword gaps: which product categories have thin keyword coverage, which high-value keywords are missing from titles and descriptions, and which competitors rank for terms you don't cover. Keyword suggestions based on product type, vendor, and tag taxonomy. Bulk keyword assignment tool.
Crawls your entire site and reports: broken internal links, missing alt text (with image preview), thin content pages (under 300 words), duplicate meta descriptions, orphaned pages (no internal links pointing to them), redirect chains, missing canonical tags, and slow-loading pages. Issues prioritized by SEO impact.
Visual email editor with template gallery, audience segmentation, open/click tracking, and subject line A/B testing. Not just "send emails" -- build campaigns.
Pre-designed email templates: Welcome, Abandoned Cart, Order Confirmation, Shipping Notification, Review Request, Win-Back, Newsletter, Product Launch, Sale Announcement, Subscription Renewal, Birthday/Anniversary, Partner Announcement. Each template is dark-themed with inline CSS. One-click customization with brand colors, logo, and product images.
Tracking pixel for opens. Unique redirect URLs for click tracking. Per-link click analytics: which links in your email get clicked, how many unique clicks, click-through rate by position. Aggregate metrics: total sends, unique opens, open rate, click rate, unsubscribe rate. Data feeds into the analytics dashboard.
Rule builder for creating segments: Behavioral (viewed product X, added to cart, completed purchase), Purchase history (spent over $500, bought in last 30 days, never purchased), Browsing (visited 5+ times, viewed category Y), Chat (had AI conversation, asked about Z), Engagement (opened last 3 emails, clicked in last 7 days). Rules combine with AND/OR logic. Segments update in real-time.
Send variant A to 25% of the audience, variant B to 25%. Wait for statistical significance (minimum 100 opens per variant). Auto-winner selection: the winning subject line is automatically sent to the remaining 50%. Results visible in the campaign analytics with open rate comparison and confidence interval.
Automated multi-step flows: Welcome (4 steps), Abandoned cart (3 steps), Post-purchase (3 steps), Win-back (3 steps), Subscription renewal (2 steps). Steps are time-delayed and condition-gated. Each step checks its condition before sending. Connected to the workflow builder for custom sequences.
Self-signup for partners. Partner-facing dashboard. Commission tiers. Payout tracking. Marketing assets. Leaderboard. A full affiliate program built into Cartridge.
Public registration page at /partners/signup. Partners submit: name, email, website, social channels, and a brief description of their audience. Approval workflow: pending partners appear in the admin for review. Approve, reject, or request more info. Approved partners get a welcome email with their unique embed code and dashboard link.
Authenticated partner view showing their real-time performance: total impressions, clicks, orders, revenue, and commission earned. 7-day and 30-day trend charts. Top-performing products. Geographic breakdown (if regional filtering is used). Embed code generator with customization options (theme, columns, collection filter).
Four tiers: Bronze (default, 5% commission), Silver (10+ orders/month, 8%), Gold (25+ orders/month, 12%), Platinum (50+ orders/month, 15%). Tiers auto-upgrade based on trailing 30-day performance. Custom rates can be set per partner. Commission calculated on order subtotal (before tax and shipping).
Monthly payout summaries with line-item detail: each order, the commission rate at the time, the calculated commission. Payment status: pending, approved, paid. Export payouts as CSV for accounting. Minimum payout threshold ($50). Net-30 payment terms.
Asset library where merchants upload banners, logos, product images, and copy blocks for partners to use. Multiple sizes (leaderboard, medium rectangle, skyscraper). Download links and embed snippets. Partners can browse and grab assets from their dashboard.
Ranked list of top-performing partners by revenue, orders, or click-through rate. Anonymized for non-top-10 (shows rank but not partner name). Encourages competition. Visible to all partners on their dashboard. Monthly and all-time views.
Undo/redo. Responsive preview. Version history. Rich text editor. Everything a page builder should have, built into Cartridge.
Full undo/redo stack with keyboard shortcuts (Cmd+Z / Cmd+Shift+Z). Every action -- moving a section, editing text, changing an image, reordering components -- is recorded. Unlimited undo depth for the current editing session. Redo restores undone changes. Visual indicator showing undo/redo availability.
Three viewport buttons: Desktop (1280px), Tablet (768px), Mobile (375px). The live iframe preview resizes to show exactly how the page will look on each device. Edit in any viewport. Changes apply across all viewports (responsive CSS handles the layout). Device-specific content visibility toggle for advanced users.
Every save creates a timestamped version. Version list in a sidebar showing: date, time, and a description of changes. One-click rollback to any previous version. Diff view showing what changed between versions. Auto-save every 60 seconds during active editing.
WYSIWYG text editing with formatting toolbar: bold, italic, headings (H2-H4), links, lists (ordered/unordered), blockquotes, code blocks, and image insertion. Paste from Google Docs or Word without broken formatting. Markdown shortcut support (## for H2, ** for bold). Text content stored as sanitized HTML.
Drag-and-drop sections: Hero (gradient/image/split/minimal), Feature grid (2/3/4 columns), Product showcase, Testimonials, Stats counter, CTA banner, Image gallery, Video embed, FAQ accordion, Team grid, Timeline, Rich text block. Each section has configurable props. Reorder by dragging. Duplicate or delete sections.
Pixel-accurate text measurement for every rendering context. OG image generation. Email subject line device preview. Smart title rendering. The invisible engine that makes everything look polished.
Canvas-based text measurement engine that calculates exact pixel widths for any string in any font at any size. Used for: truncating product titles to fit card widths without ellipsis in the wrong place, sizing OG image text to fill the canvas properly, and determining line-break positions for email preheaders. Zero runtime dependencies.
Every product page and collection page gets a unique Open Graph image generated on-demand. Product OG images include: product photo, title (sized to fit), price, and brand logo. Collection OG images include: collection name, product count, and a grid of featured product thumbnails. Cached after first generation. Proper aspect ratio for social sharing (1200x630).
Before sending an email campaign, preview how the subject line renders on: iPhone Mail (41 chars visible), Android Gmail (43 chars), Desktop Gmail (70 chars), Outlook (73 chars). Character count with truncation indicator. Preheader text preview (the gray text after the subject). Helps merchants write subject lines that work on every device.
Intelligent title truncation that never breaks mid-word, never leaves a dangling preposition, and always includes the most important words. For product cards (short width), a $200 "Hand-Carved Walnut Wall Sign with Custom Engraving" becomes "Hand-Carved Walnut Wall Sign" -- not "Hand-Carved Walnut Wall Si..." or "Hand-Carved Walnut Wall Sign with C...".
Production-grade security built into every route and every form. Not an afterthought. Not a plugin. Baked into the platform.
Sliding window rate limiting stored in Vercel KV: 100 req/min per API key for the REST API, 20 req/min per IP for the AI chat, and configurable limits per route. Returns 429 Too Many Requests with Retry-After header. Atomic counter increments prevent race conditions under concurrent load.
Double-submit cookie pattern on all state-changing routes (POST, PUT, DELETE). CSRF token generated per session. Token validated on every form submission and API mutation. Transparent to the developer: middleware handles token generation, cookie setting, and validation automatically.
Strict CSP headers on every response: script-src 'self' (plus allowlisted domains for HubSpot, GA4, and Vercel Analytics), style-src 'self' 'unsafe-inline' (required for Tailwind), img-src 'self' data: https:, connect-src 'self' plus API endpoints. Blocks XSS injection from unknown script sources.
All user-submitted text (chat messages, form inputs, review content, partner descriptions, page editor content) is sanitized before storage and before rendering. HTML entities encoded. Script tags stripped. Event handlers removed. URL validation on href attributes. Defense in depth: sanitize on input AND on output.
Every admin login is logged to KV with: timestamp, IP address, user agent, geographic location (from IP), and success/failure status. Failed logins trigger progressive delays. 5 consecutive failures trigger a 15-minute account lockout. Admins can view their login history in the admin settings page.
After 5 failed login attempts in 15 minutes, the account is locked for 15 minutes. Lockout notification email sent to the account owner with IP address and timestamp. Unlock via email link or manual admin override. Brute-force attacks stopped at the door.
A brain that acts. Not a dashboard that waits. 46 actions run on cron schedules, processing data, making decisions, and taking action while you sleep.
AI-written summary delivered to your inbox at the time you configure: yesterday's revenue, new leads captured, carts recovered, partner performance, subscription renewals, top search terms, and one actionable recommendation. Written in plain English, not dashboard-speak. "Your Ferrari collection page is up 40% in views this week -- consider featuring it in Thursday's email."
Detects abandoned carts (items added, no purchase within 1 hour). Triggers the abandoned cart email sequence automatically. If the customer has a phone number, sends an SMS after 24 hours. Tracks recovery: how many carts were recovered, total revenue saved, which products are most frequently abandoned.
Recalculates lead scores every hour based on: page views (+1 per view, +3 for high-value pages), AI chat interactions (+5 per conversation), email engagement (+2 per open, +3 per click), cart activity (+4 for add-to-cart), time on site (+1 per 5 minutes). Score thresholds trigger CRM stage updates and notification emails to the merchant.
Identifies customers at risk of churning based on: declining visit frequency, email non-engagement, subscription payment failures, and comparison to historical churn patterns. Churn risk score (0-100) assigned to each customer. High-risk customers trigger win-back workflows and alert the merchant.
Claude generates product descriptions, meta titles, meta descriptions, and social captions for products with missing or thin content. Queued as suggestions in the admin catalog page. One-click approve or edit. Respects brand voice from config. Generates in batches (10 products per run) to manage API costs.
Catalog health checks. Partner commission calculations. Subscription renewal reminders. AI prompt A/B testing. Revenue attribution daily rollups. Dead product detection. SEO gap analysis. Customer lifecycle stage updates. RFM segment recalculation. Image quality scoring. Price anomaly detection. Duplicate product flagging. Win-back email triggers. Engagement scoring. Conversion funnel analysis. Search analytics compilation. All running on cron. No manual triggers. No supervision.
HubSpot integration that turns every form submission, email signup, and checkout attempt into a trackable CRM contact with lifecycle stage management.
The contact page form (name, email, interest, message) submits to /api/hubspot/contact. Creates or updates a HubSpot contact with lifecycle stage "lead", lead status "NEW", name split into first/last, and product interest property. After submission, pushes HubSpot identity for session stitching.
Email input in the site footer on every page. Submits to /api/hubspot/newsletter. Creates contact with lifecycle stage "subscriber" and source tag (e.g., "footer_signup"). Success state: "You're in. Welcome to the collector community."
When a customer clicks "Checkout" in the cart drawer, a modal asks for their email before redirecting to Shopify checkout. Creates contact with lifecycle stage "opportunity" and cart contents in notes. "Skip" button for immediate redirect. Shows only once per session (localStorage). Captures the lead even if they don't complete checkout.
Appears after 20 seconds on first visit. "Join the collector community, get early access to new pieces and exclusive offers." Email goes to HubSpot as a subscriber. Dismissed state persisted to localStorage so it never shows again. Framer Motion slide-up from bottom-right. Close button or backdrop click to dismiss.
instrumentation-client.ts exports onRouterTransitionStart which pushes setPath + trackPageView to HubSpot's tracking queue on every client-side navigation. Without this, HubSpot only sees the initial page load. Centralized tracking helpers in hubspot-tracking.ts.
Loaded on every page via Next.js <Script strategy="afterInteractive">. Non-blocking, loads after hydration. Tracks page views, sessions, and behavioral data. Portal ID from environment variable. Conditionally rendered: if no portal ID is set, no script is loaded.
A partner distribution system with token-authenticated embeds, commission tracking, click/order attribution, and admin management. Partners paste one iframe tag. Products show up on their site.
Partners paste one line: <iframe src="https://yourstore.com/embed/store?token=xxx">. Gets a fully functional product grid with images, prices, and "Order Now" buttons linking to checkout. Self-contained HTML page with no header/footer from the main site. No CSS conflicts with the partner's site.
Each partner gets a unique token (generated on registration). The token authenticates embed loads and attributes clicks and orders back to the partner. Partners are stored in KV with profile data: name, email, commission rate, allowed collections, creation date.
Partners have a configurable commission rate (0-100%). When an order comes through from a partner's embed, the system calculates commission based on order total. Partners see their performance: loads, clicks, orders, revenue, commission earned. All stored with daily and monthly rollups.
?theme=light or ?theme=dark. All colors, backgrounds, button styles, and text colors switch. ?cols=2|3|4 controls the product grid column count. Responsive on mobile regardless of setting.
?region=milwaukee. Filters products by Shopify tag matching the region name. If no region-specific products exist, falls back to showing all products. Each region gets its own URL, its own filtered view.
The embed page sends a postMessage to the parent window with the current document.body.scrollHeight on every resize. Partners add a small script to listen for the message and adjust the iframe height, eliminating the scrollbar. Uses ResizeObserver for efficient updates.
Cart page, email sequences, invoice generation, and pre-checkout conversion. Everything between "Add to Cart" and the platform checkout redirect.
Not a drawer. A dedicated /cart page with product images, titles, variant labels, per-item and per-line pricing, quantity controls (increment, decrement, remove), and a "Continue shopping" link back to the collection. Items link to their product detail pages.
Sticky sidebar on desktop with: subtotal, item count, shipping estimate (free if over threshold, flat rate otherwise, both from config), tax note, and a total. Below the total: the checkout button with trust signals (lock icon, "Secure checkout", "Powered by Shopify"). Below that: shipping and returns quick info.
If brand.shipping.freeAbove is set, the cart page shows a progress bar: "Add $X more for free shipping." The bar fills proportionally. When the threshold is met, the shipping estimate changes to "Free." Increases average order value.
Input field in the order summary that validates against the promo code in config. If the code matches, a green "Applied" badge appears. The actual discount is applied by the platform at checkout, but the validation gives confidence before the redirect.
An email input integrated into the order summary: "Enter your email for order updates." On submission, creates a HubSpot contact with lifecycle stage "opportunity" and the full cart contents in notes. Even if the customer abandons checkout, you have their email and know what they were about to buy.
Automated multi-step email flows triggered by customer actions. 3 built-in sequences:
Steps are time-delayed and condition-gated (has_cart, no_purchase, has_purchase, viewed_products). processAllPendingSteps() is called by cron. Each step checks its condition before sending.
Generates dark-themed HTML emails with inline CSS for email client compatibility. Brand colors, logo, product images, and CTAs baked into the template. No external stylesheets. No JavaScript. Works in Gmail, Outlook, Apple Mail, and every major client. Templates support variable interpolation for customer name, product details, and dynamic content.
Emails sent via the Resend API. Verified sender domain. Delivery tracking. Bounce handling. One environment variable: RESEND_API_KEY. If not set, emails log to console in development. No silent failures in production.
Generates print-ready HTML invoices with store branding from config. Sequential numbering via KV counter: INV-2026-0001, INV-2026-0002, etc. Year resets automatically. Includes line items with quantities and unit prices, subtotal, configurable tax rate, and total. Customer name, email, address, and phone fields. Notes field for special instructions.
Define forms in cartridge.config.ts with a slug, title, subtitle, and array of fields (text, email, tel, textarea, select). Each form renders at /custom/[slug]. Products with $0 price or unavailable status get smart "Request Quote" buttons that link to the appropriate custom form based on product title/type matching. No dead-end "Sold Out" buttons.
A ProductSource interface that abstracts product data. Swap your data source without changing downstream code. The AI, embeds, admin dashboard, and storefront all work the same regardless of where products come from.
A TypeScript interface defining two methods: getProducts(): Promise<Product[]> and getCollections(): Promise<Collection[]>. All downstream features consume this interface. Adding a new platform means implementing two methods.
Reads from Shopify's public JSON API. No API tokens. No OAuth. No Shopify Partner account. Just a domain name. Fetches /products.json and /collections.json from the public storefront endpoints. Handles pagination. Normalizes data into the ProductSource format.
Connects to WooCommerce REST API v3. Requires consumer key and consumer secret (generated in WooCommerce settings). Maps WooCommerce product fields (regular_price, sale_price, categories, images) to the standard Product type. Handles WooCommerce-specific quirks like nested category objects and separate image arrays.
Reads products from a CSV file (URL or local path). Configurable column mapping so you can use whatever headers your export has. Maps CSV rows to Product objects. Useful for businesses that manage inventory in spreadsheets or export from systems that don't have an API.
A full merchant command center built into every Cartridge deployment at /admin. Not a third-party integration. Not a separate tool. Built into the same Next.js app. 19 pages of analytics, catalog intelligence, workflow management, CRM pipeline, multi-store management, API documentation, and actionable recommendations.
The morning view. Five stat cards across the top: revenue today, new leads, AI chat sessions, embed widget loads, and total products. Below that, 7-day SVG sparkline charts for revenue, orders, and leads. Then two columns: an action items panel (prioritized list of things to fix, each linked to the resolution) and a live activity feed (recent orders, leads, form submissions, chat conversations with timestamps). A pipeline funnel visualization showing visitor-to-customer conversion.
Revenue broken down by source (direct, AI chat, embed widget, newsletter, event page) and by product in a sortable table with total revenue, order count, view count, and conversion rate. 7-day revenue trend sparkline. Average order value. ROI calculator that compares Cartridge costs against attributed revenue.
Pulls directly from HubSpot's read API. Visual funnel: subscribers, leads, opportunities, customers with counts at each stage. Below that, a table of recent contacts with email, name, lifecycle stage, product interest, and date created. Color-coded by stage. Surfaces stale leads that haven't been contacted.
A composite health score from 0 to 100, rendered as a circular SVG gauge. Issues categorized by severity: critical (products at $0 with no quote form, no images), warning (missing descriptions, low-res images, no SEO titles), and informational (unavailable products, duplicate titles). Every product listed in a health table with issue flags. Links to the catalog intelligence engine for detailed analysis.
Chat volume (today and 7-day). Lead captures from chat. Conversion rate (percentage of conversations resulting in email capture or quote request). Top search terms ranked by frequency. Tool usage breakdown: how often the AI searches products vs. creates quote requests vs. captures emails. A/B test results with variant performance and statistical significance indicators. Performance insight with prompt adjustment recommendations.
Table of partner domains with embed load counts. Tracks which external sites are loading your embed widget, how often, and with what parameters (region, theme). 7-day volume sparklines. Copy-paste embed code reference. Designed for businesses with 5 to 100+ partner sites.
Partner management interface. Create, edit, and deactivate partners. Set commission rates per partner. View partner-level stats: loads, clicks, orders, revenue, commission earned. Generate embed codes with partner tokens pre-filled. Export partner performance data.
Section drag-and-drop for homepage and landing page layout. Field editing for text content. Iframe preview showing changes in real-time. Saves to config. No code deployment needed for content changes.
Real-time stats. Cohort analysis (group visitors by first-visit date, track their progression). Funnel visualization (visit, search, view product, add to cart, checkout, purchase). Search analytics showing what customers look for and what they find. AI concierge metrics. CSV export for all data tables.
Visual workflow builder canvas. Create, edit, duplicate, and delete automation flows. Execution history with per-run logs showing every node visited and every action taken. Enable/disable workflows with a toggle. Template gallery for quick starts.
Kanban board for the visual CRM pipeline. Drag contacts between stages. Pipeline analytics. Deal value tracking. Activity timeline for each contact showing every touchpoint across all modules.
AI conversation designer canvas. Create and edit guided conversation flows. Preview flows as a customer would experience them. Per-flow analytics with completion rates and drop-off points.
SEO command center. Per-page scoring. SERP preview editor. JSON-LD validation. Technical audit results. Keyword coverage analysis with suggestions.
Product configurator builder. Create multi-step wizards. Set options, pricing modifiers, and conditional visibility rules. Preview as customer. Assign to products.
Email builder with template gallery. Campaign analytics (sends, opens, clicks). Audience segmentation rule builder. Subject line A/B test results. Sequence management.
Login audit trail with IP addresses and timestamps. Rate limit status. Failed login attempts. Account lockout history. CSP and CSRF configuration. Security score.
Agency dashboard for managing multiple merchant stores from one admin. StoreSwitcher dropdown in the header. ScopedStore transparently prefixes all KV keys per store. Store provisioning, health monitoring, cross-store analytics. One agency = 20-50 stores.
Interactive API documentation site at /docs. 25+ documented endpoints with "Try it" panels that make real API calls. Code examples in curl, JavaScript, Python. OpenAPI 3.1.0 spec with search and method badges.
Extend Cartridge with plugins, webhooks, and a REST API. Build integrations without forking the codebase.
A plugin registry with 6 lifecycle hooks:
Plugins are registered with a name, version, and hook implementations. The registry validates all hooks and prevents duplicate registration. executeHook() runs all registered handlers for a given event.
Sends GA4 events for product views, add-to-cart, checkout start, and order complete. Maps Cartridge events to GA4's enhanced ecommerce schema (view_item, add_to_cart, begin_checkout, purchase). Measurement ID from config.
Review collection and display system. Hooks into onProductView to show reviews and onOrderComplete to request reviews. Stores review data in KV.
Register webhooks with a URL, event filter, and optional HMAC secret. When events fire, Cartridge dispatches an HTTP POST with the event payload. 3x retry with exponential backoff on failure. HMAC-SHA256 signing with the webhook's secret key in the X-Cartridge-Signature header. Delivery logging with status codes and response bodies for debugging.
Five endpoints under /api/v1/:
GET /api/v1/products - Query products with filtersGET /api/v1/orders - List orders with attribution dataGET /api/v1/contacts - List CRM contactsGET /api/v1/analytics - Retrieve analytics dataGET /api/v1/partners - List partner performanceAPI keys use the format ctg_<32 hex chars>. Generated via the admin interface and stored in KV. Each key tracks: label, creation date, last used date, and total request count. Passed via Authorization: Bearer ctg_xxx header.
100 requests per minute per API key. Sliding window implementation. Returns 429 Too Many Requests with Retry-After header when exceeded. Separate from the AI chat rate limiter (20/min per IP).
784 lines of analysis logic. Scores your catalog on a 0-100 scale, finds problems, and tells you exactly what to fix and in what order.
A composite score from 0 to 100 computed from four dimensions: SEO health (meta titles, descriptions, URL handles), image quality (presence, resolution, aspect ratio, background consistency), pricing health (no $0 without forms, no statistical outliers), and content completeness (descriptions, tags, variants). Each dimension weighted and combined into the overall score.
Identifies products that are unpublished, unavailable, or have zero inventory but still appear in collections or search results. These waste page-load budget and confuse customers. Flagged as critical issues with a recommendation to either restock or hide.
Scans every product for: missing meta titles, missing meta descriptions, generic image filenames (e.g., "IMG_0001.jpg" instead of "hand-carved-walnut-sign.jpg"), missing alt text, and URL handles that don't contain keywords. Each gap is a missed search ranking opportunity.
Analyzes product images for: resolution (below 800px flagged), aspect ratio consistency across the catalog, number of images per product (ideally 3+), and background consistency (mixed white/lifestyle/transparent backgrounds hurt conversion). Generates a per-product image score.
Finds products priced at $0 without a quote form (dead end), products significantly above or below the catalog mean (statistical outliers using standard deviation), and products with inconsistent variant pricing. Each issue classified by severity.
Fuzzy title matching using Dice's coefficient on character bigrams. Products with similarity above 0.8 are flagged as potential duplicates. Catches "Oak Wall Sign" vs "Oak Wall Sign - Large" and "Custom Rug 8x10" vs "Custom Rug 8 x 10". Prevents catalog bloat and customer confusion.
For products with missing or thin descriptions, Claude generates 2-3 paragraph descriptions plus a meta title and meta description. Uses product title, vendor, type, tags, price, and existing images as context. Accessible via the admin catalog page at /api/admin/catalog/generate-description. One click per product.
Every issue gets an impact score (how much fixing it will help) and an effort score (how hard it is to fix). Recommendations are sorted by impact/effort ratio. "Add descriptions to your 5 highest-traffic products" ranks above "Fix image filenames on archived items." The admin catalog page presents these as an action plan.
Locale detection, currency formatting, exchange rates, and RTL support. Serve customers in their language and currency without maintaining separate stores.
Four-level priority chain: URL prefix (/es/products/...) > cookie (locale=es) > Accept-Language header (browser preference) > default locale from config. The first match wins. Supported locales are defined in the i18n config.
Define locale-specific overrides for any config value. The base config provides defaults. Locale overrides merge on top. A Spanish locale can override the hero headline, AI welcome message, navigation labels, and shipping policy text without duplicating the entire config.
Uses Intl.NumberFormat with locale and currency parameters. "$1,234.56" in en-US becomes "1.234,56 EUR" in de-DE. Handles symbol placement, decimal separators, and grouping separators automatically. No manual formatting code.
Fetches live exchange rates and caches in KV for 1 hour. Prices stored in the base currency (from your platform) and converted on display. If the exchange rate API is unavailable, falls back to the last cached rate. If no cached rate exists, displays in the base currency.
Detects right-to-left locales: Arabic (ar), Hebrew (he), Urdu (ur), Farsi (fa), Pashto (ps), Yiddish (yi), Sindhi (sd). Sets the dir="rtl" attribute on the HTML element. CSS logical properties handle layout mirroring automatically.
Middleware intercepts requests, detects the preferred locale, and rewrites the URL to include the locale prefix if it's missing. /products/oak-sign becomes /en/products/oak-sign for English visitors. Cookie is set for subsequent requests so detection doesn't repeat.
One <script> tag adds AI chat to ANY existing website. The Intercom-killer trojan horse. Merchants try the chat widget, then upgrade to the full platform.
Add <script src="https://yourstore.cartridge.dev/widget.js"> to any page. The widget loads asynchronously, creates an iframe-isolated chat bubble in the bottom-right corner, and connects to your Cartridge AI concierge. 11KB vanilla JavaScript, zero dependencies. No React, no framework, no build step required on the host site.
The chat panel renders inside an iframe, completely isolated from the host page's CSS and JavaScript. No style conflicts, no z-index battles, no CSS leaks. The widget's styles cannot affect the host page and vice versa. Communication between the widget and the host page happens via postMessage with origin validation.
The script exposes a global window.Cartridge object with a full programmatic API:
Works on Shopify, WooCommerce, Squarespace, Wix, WordPress, custom HTML, any site with a <script> tag. No platform-specific integration required. The widget auto-detects the page context and sends it to the AI concierge for context-aware conversations.
Every lead captured, email collected, and quote request created through the widget is attributed back to the host domain. Track which partner sites drive the most leads. Revenue attribution flows into the main analytics dashboard. The widget is a distribution channel with full funnel visibility.
Zero-friction product trial. No signup, no credit card, no email required. Try the full admin experience with seeded data.
Visit /demo/launch and immediately enter a fully functional Cartridge admin with seeded demo data. No registration form. No email verification. No credit card. No sales call. The fastest path from curiosity to experience in any SaaS product.
Every demo session comes pre-loaded with realistic data: 50 products across 5 collections, 200 customer profiles with browsing and purchase history, 30 days of revenue data, active email campaigns with open/click metrics, CRM pipeline with contacts at every stage, and partner embed performance data. The admin feels alive from the first click.
Tooltip-based walkthrough highlighting the most impressive features: 1) Morning briefing overview, 2) AI concierge live chat, 3) CRM Kanban pipeline, 4) Visual workflow builder, 5) Analytics dashboard builder, 6) One-click deploy. Each tooltip explains what the feature does and why it matters. Skip or replay at any time.
Demo sessions persist for 24 hours with unique session isolation. Each visitor gets their own sandboxed environment. Data changes in one demo session don't affect others. After 24 hours, the session is automatically cleaned up. No stale demo data accumulating.
A persistent "Ready to launch your own?" banner at the top of the demo admin links to the signup flow. The demo captures behavioral data (which pages they visited, which features they clicked) to personalize the follow-up experience if they choose to sign up.
Manage multiple merchant stores from one admin. Built for agencies and consultants running 20-50 Cartridge deployments.
Every KV key is transparently prefixed with the store ID: store_abc:customer:email@example.com. ScopedStore wraps the standard Store interface so all existing modules (CRM, analytics, email, AI) work without any code changes. Data isolation is guaranteed at the storage layer.
Dropdown in the admin header showing all stores the current user has access to. Switch between stores instantly -- the entire admin context updates: analytics, CRM pipeline, catalog, email campaigns, partner data. No logout/login required. Keyboard shortcut (Cmd+Shift+S) for power users.
Create new stores from the agency dashboard. Auto-config runs immediately on the new store's Shopify domain. Config generated, demo data seeded, deploy triggered. A new merchant store goes from "signed contract" to "live on their domain" in under 10 minutes.
Aggregate view across all stores: total revenue, total leads, total AI conversations, store-by-store performance comparison, top-performing stores, stores needing attention (declining metrics). The agency dashboard is the command center for the entire portfolio.
Automated health checks across all stores: deploy status, API uptime, KV connectivity, cron job execution, error rates. Red/yellow/green status indicators per store. Alert the agency when a store needs attention before the merchant notices.
One agency managing 20 stores at $49/store = $980/month in platform fees, $2,000-5,000/month billed to merchants. 50 stores = $2,450/month in fees, $5,000-12,500/month billed. The multi-store dashboard is how Cartridge scales through channel partners.
Morning briefings and real-time alerts delivered to the channels your team already uses. Brain insights in your pocket.
The same AI-written morning briefing that lands in your inbox also posts to a Slack channel of your choice. Rich Block Kit formatting with sections for revenue, leads, AI conversations, partner performance, and the daily recommendation. Delivered at the time you configure.
Slack messages use Block Kit with sections, dividers, context blocks, and action buttons. Revenue numbers in bold. Trend arrows (up/down). Direct links to admin pages for each section. "View in Dashboard" button. "Mark as Read" button. Not a wall of text -- a structured, scannable briefing.
Microsoft Teams integration uses Adaptive Card format with headers, fact sets, column layouts, and action buttons. Same data, same structure, native to the Teams experience. Works in channels and 1:1 chats.
Discord integration uses rich embed format with colored sidebar (cyan for briefings, green for wins, red for alerts), thumbnail, fields, and footer with timestamp. Perfect for smaller teams or solo merchants who live in Discord.
Route different alert types to different channels: morning briefings to #commerce-daily, high-value lead alerts to #sales, error alerts to #ops, partner performance to #partnerships. Each alert type is independently configurable. Mute channels without losing the data.
Beyond morning briefings, get instant notifications for: high-value orders (above threshold), new high-score leads, failed subscription renewals, partner embed spikes, security events (failed logins, rate limit hits), and churn risk alerts. Configurable thresholds. Don't miss the moments that matter.
Stripe-quality developer documentation at /docs. Interactive, searchable, always in sync with the actual API.
Every API route documented with: HTTP method and path, description, authentication requirements, request parameters (query/body), response schema with example JSON, error codes and their meanings. Organized by category: Products, Orders, Contacts, Analytics, Partners, Webhooks, AI, and Admin.
Each endpoint has a live "Try it" panel that lets developers make real API calls from the documentation page. Enter parameters, click "Send", see the actual response. Authentication handled via a session API key. No Postman needed. No curl copying. Test the API while reading about it.
Every endpoint includes copy-paste code examples in three languages: curl (for quick testing), JavaScript (fetch with async/await), and Python (requests library). Examples include authentication headers, request bodies, and response handling. Syntax highlighted. One-click copy.
The entire API is defined as an OpenAPI 3.1.0 specification generated from the actual route definitions (schema-as-code). The spec is always in sync with the codebase -- impossible to drift. Import into Postman, Insomnia, or any OpenAPI-compatible tool. Use it to generate client SDKs in any language.
Documentation sidebar with collapsible category sections, method badges (GET/POST/PUT/DELETE color-coded), and instant search. Type to filter endpoints by name, path, or description. Keyboard navigation. Deep-link URLs for sharing specific endpoint documentation.
Clear documentation of rate limits per endpoint category: 100 req/min for REST API, 20 req/min for AI chat, custom limits per route. Response header documentation (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset). Best practices for handling 429 responses.
A persistent storage abstraction that gives Cartridge memory. Customer profiles, server-side cart state, and revenue attribution survive deploys and server restarts.
A unified key-value interface with get/set/del, atomic counters (incr), lists (lpush/lrange), and hash maps (hset/hget/hgetall/hincrby/hdel). In development, it uses an in-memory Map (singleton pattern). In production, it uses Vercel KV (Redis-compatible). The interface is identical. Code that works in dev works in production without changes. TTL support for session data. Capped lists for activity feeds.
Every identified visitor gets a server-side profile tracking: first seen timestamp, last seen timestamp, total orders, total lifetime spend, last 20 viewed products, last 20 carted products, purchased product history, chat session count, and acquisition source. Profiles are keyed by email (after identification via any capture point). This data powers personalized AI conversations, product recommendations, and churn detection.
Client-side carts (localStorage) are mirrored to the server with a 30-day TTL, keyed by session ID. If a visitor returns on a different device, their cart is recoverable. Cart state feeds into abandoned cart detection and the abandoned cart email sequence.
Every order from Shopify webhooks is matched to its source: AI chat conversation, embed widget click, newsletter signup, popup capture, event page, or direct browse. Attribution data is stored persistently and rolled up into daily/weekly/monthly aggregations. The admin dashboard reads this data to show "Your AI concierge influenced $X in revenue this month."
CSS custom properties generated at build time from your config file. Real visual differentiation without forking the codebase or losing the upgrade path.
The theme engine reads your config and generates a complete set of design tokens: background colors, text colors (primary, secondary, muted, dim), border colors, accent color with RGB decomposition for alpha compositing, card backgrounds, input backgrounds, overlay colors. Dark and light palettes with full token sets. Injected as an inline <style> tag in the root layout.
Beyond colors, the config controls structural design decisions: font families (sans and mono), border radius (none, sm, md, lg, xl, full), card style (flat with no border, bordered with subtle ring, raised with shadow, glass with backdrop blur), button style (rounded, pill, square), hero style (gradient, image, split, minimal), product card style (contain, cover, square, portrait), header behavior (fixed, sticky, static). Each option generates different CSS custom property values.
The accent color from config is decomposed into RGB components at build time, enabling CSS constructions like rgba(var(--c-accent-rgb), 0.1) for subtle tinted backgrounds. Hover states, focus rings, badges, and gradient accents all derive from a single hex value. Change one line, every accent surface updates.
780 lines of analysis logic. Crawl any Shopify store and generate a complete Cartridge config automatically.
Give it a Shopify domain. The engine fetches all products and collections from the public JSON API. Analyzes product types, vendors, price distribution, tag taxonomy, collection structure, and product count. No authentication required.
Determines: primary product types and their frequency, vendor distribution, price range (min/median/max), most common tags, collection hierarchy, and whether the store is single-vendor or multi-vendor. This analysis drives navigation structure, filter configuration, and AI personality tuning.
Generates a complete cartridge.config.ts with: brand name derived from store name, navigation structure from collections, filter chips from product types, price range filters from actual price data, AI personality tuned to the product category, shipping policies from common patterns, and hero text suggestions. From store URL to working config in seconds.
Schema.org Product markup on every product page: name, description, images, brand, offers (price, currency, availability), URL. Schema.org Organization on every page: name, URL, description, founding date, founder. Validated against Google's Rich Results Test.
/sitemap.xml generated at build time with all products, collections, and static pages. Product URLs include lastModified from the platform's published date. Change frequency and priority set per page type. Base URL reads from config.
Four API routes ready for ChatGPT's custom GPT builder: GET /api/gpt/products (search with query, collection, vendor, price filters), GET /api/gpt/collections (list all), POST /api/gpt/quote-request (create lead), GET /api/gpt/openapi.json (OpenAPI 3.1.0 schema). CORS headers included. Create a "Chat with [Your Brand]" GPT in minutes.
Define events in config with slug, name, tagline, and location. Each generates a page at /event/[slug]. Centered layout with event branding, name+email capture form, and quick links to key product categories. Any unknown slug gets a generic branded fallback. Print a QR code pointing to the URL. Every email captured is tagged in HubSpot with the event name for post-event follow-up segmentation.
Allows all crawlers, disallows /api/ and /admin/. Points to sitemap URL from config.
Comprehensive automated testing with Vitest. 35 test files. Coverage thresholds enforced on every build.
Every core library module has a dedicated test file:
Enforced minimums: 85% line coverage, 80% function coverage, 75% statement coverage, 65% branch coverage. Current coverage exceeds all thresholds. External API modules (Shopify live API, HubSpot live API, browser-only analytics) are excluded from coverage but tested for graceful fallback behavior.
Unit tests for logic. Integration tests for data flow. Graceful degradation tests for external services. Every module that can run without a network connection is tested in isolation. Every module that depends on an external service is tested for its "not configured" path. The full suite runs in under a second.
The jump from 461 to 565 tests came from a comprehensive quality audit that also hardened the entire platform:
One file controls everything. Fully typed with TypeScript. IDE autocomplete for every field.
App Router, server components, static generation with ISR (2-min revalidation), streaming, dynamic routes, middleware.
Server + client components, Suspense boundaries, streaming SSR.
Strict mode. Full type coverage on API responses, config schema, plugin interfaces, and component props.
Utility-first styling with @tailwindcss/typography for product descriptions.
Page transitions, scroll animations, modal springs, accordion expand/collapse, counter tweens.
useChat hook, streamText, tool calling with Zod schemas, UIMessage streaming.
AI concierge chat. Catalog description generation. Streaming responses. 3 callable tools.
Zero-auth product and collection data. No API tokens, no OAuth, no Partner account.
Consumer key/secret auth. Product and category sync. Variant and image normalization.
Contact create/update via Private App token. Read API for pipeline data. Create-first pattern (1 API call happy path).
Transactional email delivery. Email sequence sending. Verified domain. Delivery tracking.
Redis-compatible key-value store. Customer profiles, cart persistence, conversation memory, analytics, partner data.
Deployment target. Global edge CDN, automatic SSL, preview deployments, serverless functions, cron jobs.
Test runner. 35 test files, 565 tests, coverage thresholds enforced. Sub-second execution.
Stop fighting platform templates. Get a storefront that matches the quality of what you sell.