Skip to content
Custom Launch: Get 2 custom integrations free when you migrate to Cartly →
Cartly
CHANGELOG

What's new in Cartly.

Product updates, improvements, and fixes shipped to the Cartly platform.

v1.37.0ADDEDOctober 7, 2026

PayPal for apps, safer refunds, and better webhooks

For merchants

  • Pay for apps with PayPal. Paid App Store apps, one-time or monthly, can be bought with PayPal where PayPal is available for your store. You approve the payment at PayPal first, and the app turns on once the payment arrives. See Paying for apps with PayPal.
  • Fix a failed card payment for an app. If the last card payment for an app subscription failed, Update payment method on the app page opens the Stripe billing portal for that subscription.
  • App refunds in Billing. Billing → Refunds lists app payments that are being returned to you and their status: in progress, refunded or settled.
  • Collect the balance on an edited order. When an edit raises an order total, the order shows Balance due and a Collect balance button that records a payment you took outside the checkout, such as cash or a bank transfer. When an edit lowers the total, the order shows Refund due. An edit never charges or refunds the customer by itself. See Collecting the balance on an edited order.
  • Refunds the payment provider did not confirm. If a provider gives no answer to a refund, the order shows it with Confirm refund and Reject. Check the transaction in the provider dashboard first. Confirming sends the customer email and runs the other follow-ups; rejecting makes the amount refundable again. See Confirming or rejecting an unconfirmed refund.
  • Customer groups are per store. A customer who shops at several stores can be in a different group at each one, and a group's discount and tax exemption apply only in the store that owns it. See Customer groups.
  • View-only pages for staff. Pages that only the owner or an admin can change, such as Settings, Taxes, Currencies, Locations, Inventory, Customer groups and Gift cards, now open for staff as read-only pages with a notice instead of failing with an error. See Team members.
  • A fresh code for sensitive actions. If two-step verification is on for your account, creating an API key and giving someone the Admin role (by role change or invitation) ask for a current code. A code stays valid for 5 minutes.
  • Webhooks in the admin. Settings → Webhooks shows each subscription as Active, Failing or Disabled with its last error, has a Send test button that also turns a disabled subscription back on, and lists failed deliveries with Retry and Discard. See Managing webhooks in your admin.
  • Store ID in Settings. Settings → Store Information shows your Store ID with a copy button. See General settings.
  • Old store address keeps working. When a store address is renamed, the old <slug>.mycartly.pro address redirects to the new one (301, path and query kept) for 90 days, and no other store can take it during that time.
  • Uninstalling an app cuts its access. Uninstalling an app, including Zapier and Make, revokes its access to your store and stops its webhooks right away.

For developers

  • GraphQL Storefront API. X-Shop-ID (or the shop_id query parameter) accepts the Store ID (the shop UUID), the store slug, or <slug>.mycartly.pro. A malformed value returns 400 and an unknown store slug or host returns 404, each with a message that says what to send. The examples in the GraphQL guide now match the schema: products(page, limit) returns edges and a pageInfo with total, page, limit, pages, hasNextPage and hasPreviousPage.
  • Webhook headers. Every delivery carries X-Cartly-Event-Id, the same on every retry of an event, so dedupe on it. A normal delivery, a retry from the failed-delivery queue and Send test send the same headers and signatures. Verify X-Cartly-Signature-V2. X-Cartly-Shop-Domain carries <slug>.mycartly.pro.
  • Delivery rules. Each event is sent once per subscription with a 10 second timeout. Redirects are not followed, so a 3xx response is a failed delivery. Failed deliveries go to the store's retry queue. A subscription is disabled after 5 failures in a row that span at least an hour, and a successful Send test or retry turns it back on. See the Webhooks guide.
  • App uninstall. When a store uninstalls your app, its tokens are revoked and its webhook subscriptions stop at once. A subscription to app/uninstalled still receives that one event and is then removed. This includes REST hooks created by Zapier and Make.
v1.36.0ADDEDSeptember 10, 2026

Google Analytics traffic insights in your admin

Added

  • Connect a Google Analytics 4 property to see sessions, active users, new users, top channels, and top landing pages right inside your analytics dashboard.
  • Your Google Analytics numbers sit beside Cartly's own orders and funnel as a clearly-labeled second lens — the two are never silently merged, so each stays trustworthy in its own right.
  • Setup is low-friction: add one Cartly service account as a Viewer on your property and paste your numeric Property ID — no developer work required.
  • Data refreshes automatically in the background and pairs with Agent Commerce for a complete "understand and reach your audience" picture.
v1.35.0ADDEDSeptember 5, 2026

Atrium — a new furniture & interior theme

A theme built for furniture and objects

Atrium is a new light-mode storefront theme in the Theme Store, built for stores where the measurements sell the product.

  • Dimension annotation everywhere — a width / depth / height strip on every product card, a 1:20 plan-view drawing and a key-spec band on the product page, plus full grouped spec tables.
  • Spec-forward shopping — filter by width, seat height, material, finish and lead time; switch between grid and list, compare objects side by side, and quick-view without leaving the page.
  • Passwordless sign-in — a one-time code or a single-use sign-in link, no password to remember.
  • Multilingual & multi-currency — English and German built in, with a language and currency picker in the header.
  • Made for mobile — a bottom tab bar and a slide-out menu on phones.

Atrium pairs naturally with Agent Commerce (so AI shopping agents can read your catalogue) and Loyalty Points. Install it from the Theme Store.

v1.34.0ADDEDSeptember 1, 2026

Loyalty Points — reward your repeat customers

Loyalty Points

Reward repeat customers with a built-in points program — a free first-party app you turn on from the App Store, with no third-party service to connect.

  • Earn on every paid order — signed-in customers automatically earn points when they pay for an order, at a rate you set (points per $1 of the item subtotal). Points are clawed back proportionally if an order is refunded or cancelled.
  • Redeem for a discount — from their account, customers turn points into a one-time, personal discount code that only they can use and that expires after the number of days you choose. You set the redemption rate and the minimum points needed to redeem.
  • Set your own economics — because the earn rate and the redeem rate are independent, you decide the effective reward (earn 10, redeem 100 = 10% back). Configure everything from Apps → Loyalty Points.
  • Storefront widget & manual adjustments — add a balance widget to the customer account page so shoppers always see their points, and adjust a customer's balance by hand for support or goodwill — every change is recorded in your audit log.
v1.33.0ADDEDSeptember 1, 2026

Agent Commerce — AI-ready storefronts

Agent Commerce

Your storefront is now ready for AI shopping agents — the fast-growing channel where shoppers ask an assistant to find, compare, and buy.

  • Discovery — every store publishes a machine-readable manifest at /.well-known/agent-commerce.json and an /llms.txt, with explicit robots.txt rules for AI crawlers (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Google-Extended, ClaudeBot).
  • Rich structured data — product pages emit a complete Product JSON-LD node (per-variant SKU and GTIN, price, availability, ratings); collections emit an ItemList and pages emit a BreadcrumbList — better for agents and search engines alike.
  • Anonymous catalog API — a market-aware REST endpoint returns your products, prices in the visitor's market currency, availability, and variants, keyset-paginated with no authentication. See the Agent Commerce API guide.
  • You stay in control — a new Settings → Agent Commerce toggle (on by default) lets you opt out any time; your SEO and Google indexing are unaffected.
v1.32.0ADDEDAugust 29, 2026

Business SSO, a Faster Variant Editor, and the Balm Theme

Business single sign-on (SSO)

  • Business customers can sign in to your storefront through your company identity provider using OpenID Connect — one login for the whole team, managed by you.
  • Set it up per company from the admin; a "Sign in with SSO" option appears on the storefront login of every theme.

A faster product variant editor

  • Bulk-edit price and apply an SKU prefix across every variant at once.
  • Drag to reorder options and values, rename a value in place (variants keep their price, SKU and inventory), and give each variant its own image.
  • Optional ASCII-only SKUs keep barcodes scanner-friendly.

Cart personalization & free samples

  • Add custom fields to the cart (gift notes, engraving and more) and let shoppers choose free samples — both are carried onto the order.

New theme: Balm

  • A warm, apothecary-style storefront theme for skincare and beauty brands, with a ritual builder, ingredient and actives tables, refills and a journal. Browse it in the Theme Store.
v1.31.0ADDEDAugust 25, 2026

Marketing Integrations and Product Reviews

Email & SMS marketing integrations

  • Connect Klaviyo, Mailchimp, Brevo, Omnisend, or Bird (formerly MessageBird) to your store from the App Store.
  • New customers and newsletter sign-ups sync automatically to the audience or list you choose.
  • Paid orders can trigger flows and automations in your marketing platform, so post-purchase, win-back, and abandoned-cart campaigns run on real store data.

Product reviews from Judge.me

  • Connect your Judge.me account and import your existing product reviews — star ratings, photos, and verified badges — onto your Cartly storefront.
  • Reviews are matched to your products automatically and re-sync on a schedule to stay up to date.
v1.30.0ADDEDAugust 20, 2026

New Payment Options and Multi-Carrier Shipping

More ways to get paid

  • Adyen — accept credit and debit cards through Adyen's on-page payment form, with 3D Secure handled automatically. Card details are collected securely and never touch your store.
  • Klarna — let shoppers Pay in 3, Pay Later or Pay Now, right on your checkout with no redirect.
  • Paddle — sell as Merchant of Record so sales tax and VAT are calculated and remitted for you.

Multi-carrier shipping

  • Live carrier rates at checkout — quote real rates from multiple carriers so shoppers pick the option that suits them (ShipEngine and Shippo).
  • Buy and print labels — purchase and void shipping labels from the order page, with tracking numbers written back automatically.

Automated order tracking

  • AfterShip — tracking updates flow in automatically as parcels move, with a branded tracking page and delivery checkpoints shown on the customer's order.
v1.29.0ADDEDAugust 12, 2026

Multilingual Admin Panel & Stronger Account Security

Your Admin Panel, Now in Your Language

  • Six languages — The entire merchant admin is now available in English, German, Spanish, French, Ukrainian, and Russian, covering every screen from Dashboard and Orders to Products, Discounts, and Settings.
  • One-click switching — Pick your language from the switcher at the bottom of the admin sidebar; your choice is saved to your account and applies everywhere you sign in.
  • Locale-aware formatting — Numbers, plurals, and interface text follow the conventions of the language you choose.

Stronger Account & Checkout Security

  • Password resets follow the account — A reset or verification link is always sent to the address on the account it belongs to, never to an address supplied by the request.
  • Smarter login rate-limiting — Sign-in attempts are now limited by failure and per account rather than per network, so shared offices and mobile networks are no longer locked out by unrelated traffic.
  • Uniform sign-in responses — Login, magic-link, and registration flows return identical responses whether or not an account exists, closing account-enumeration and timing side channels.
  • Gift-card protection — Closed a balance-checking side channel so gift-card codes can no longer be probed for validity.

Smaller Improvements

  • Orders — A canonical, consistent set of payment-method labels across the admin, plus a compact line-item preview on mobile order lists.
  • App Store — The "Top rated" sort now orders apps by rating as expected.
  • Dashboard — Fixed a charting warning on first render for a cleaner load.

Full changelog v1.29.0 →

v1.28.0ADDEDAugust 5, 2026

eBay Sales Channel, Accounting & CRM Sync, Email/SMS Apps & Merchant Stripe

Added

  • Sell on eBay. A new eBay sales channel publishes your Cartly catalog to eBay — scoped by collection or tag — using your saved fulfillment, payment, and return policies. Stock stays in sync in both directions, eBay orders import into Cartly automatically, and tracking numbers push back to eBay the moment you fulfill.
  • Accounting & CRM connectors. Native QuickBooks Online, Xero, and Salesforce connectors export every paid order automatically — as a Sales Receipt in QuickBooks, an invoice in Xero, or a Contact/Lead plus a closed-won Opportunity in Salesforce — including orders marked paid by hand (bank transfer, cash on delivery).
  • SendGrid and Twilio apps. Two first-party apps let transactional order messages and campaigns go out through your own account: SendGrid for email, Twilio for SMS order confirmations and new-sale alerts, both with editable templates.
  • Payments on your own Stripe account. Card checkout now settles directly to your own connected Stripe account instead of a shared platform account, with a hardened per-shop reconciliation job that closes out orders even when a payment webhook is delayed or missed.
v1.27.0ADDEDJuly 24, 2026

Two-Way ERP Order Sync, Cart Recovery Drip, Account Verification & Theme Refresh

Added

  • Two-way ERP / accounting sync. Connect an OData-based ERP or accounting system for scheduled catalog import — products, variants, prices, multi-warehouse stock, and images — with mapping controls for price type, warehouse, product attributes, and characteristics. Paid orders export back as documents with per-buyer counterparty resolution and, optionally, discounts, tax, and delivery reflected on the document lines. When a manager changes an order's state in the connected system, Cartly moves the order along its own fulfillment lifecycle automatically (payment statuses are protected). Orders placed before the connector was finished can be re-exported manually, and connectors are managed and removable from Admin → Integrations.
  • Account verification. Merchants can upload verification documents directly from the admin. A graduated account lifecycle communicates state clearly — active, checkout paused, frozen, and restricted — with matching storefront and admin messaging while the platform reviews submitted documents.

Improved

  • Abandoned Cart Recovery. The first-party app now sends a 3-step automated email drip with a real, gated discount incentive on the final message. Drip gating and dedup keep a shopper from being over-messaged, and a redeemed code shows a "Used up" status on the Discounts page once its usage limit is exhausted.
  • Storefront theme refresh. The Clarity, Linen, and Mono themes received a systemic design-system polish — refined typography and spacing, unified UI components (buttons, cards, pagination, color swatches), and editable homepage content blocks.
v1.26.0ADDEDJuly 13, 2026

Carrier Delivery, Redesigned Orders & Cross-Border Storefronts

Added

  • Carrier delivery with pickup points. Connect a delivery carrier to show live shipping rates at checkout, let shoppers choose a nearby pickup point or parcel locker instead of door delivery, and control which delivery options appear.
  • One-click shipments & waybills. Create a shipment and print its waybill directly from the order page; delivery status flows back automatically through webhooks.
  • Cross-border storefronts. A "Ship to" market selector in the storefront lets shoppers switch market and currency, with prices resolving to the selected market.

Improved

  • Redesigned Orders workspace. Global search across email, order number, customer name, phone, and tracking; inline customer names and item previews; payment and delivery status badges; clickable rows with a quick-actions menu; and customizable columns.
  • Richer order details. The order page now shows the tax breakdown, shipping method, shipping labels, item weight and barcode, discount type, and a dedicated billing-address card.
  • Required checkout phone. A contact phone is now required on the shipping address for every buyer, reducing failed deliveries.
v1.25.0ADDEDJuly 6, 2026

Options Builder, Variant Cost Tracking & Advanced Catalog Integrations

Options Builder — Product Variants, Rebuilt

  • Define options, get the full variant matrix — the product edit page now has an Options Builder: add up to 3 options (e.g. Color, Size), add each option's values as chips, and Cartly automatically generates every combination as a variant. No more manual variant creation.
  • Clean grid editing — Price, SKU, Barcode, and the new Cost field are edited per variant in a single grid. Option names are fully flexible, including multilingual option names.
  • Safe value removal — removing an option value removes exactly the variants generated from it; unrelated variants are left untouched.
  • Stock stays in Inventory — stock levels are managed per location in the Inventory block. The variants grid no longer edits stock, so saving product details never disturbs your location stock levels.

Cost Tracking Per Variant (COGS)

  • Every variant now has a Cost field for recording cost of goods sold — enter it manually, or let a connected catalog integration fill it in automatically on import. This is the foundation for upcoming margin and profit reporting.

Storefront — Better Multi-Option Variant Support

  • Products with multiple options now render correctly across every marketplace theme (Clarity, Linen, Mono, Minimal).
  • Option pickers handle any option naming, and partial or sparse variant sets no longer break option selection or add-to-cart.
  • Out-of-stock combinations are now shown accurately at the option level.

Advanced Catalog & Inventory-System Integrations

  • Two-way catalog sync — connect an external ERP or inventory-management system and keep your Cartly catalog in sync: products, stock, prices, images, and product options grouped into proper variants.
  • Granular field control — choose exactly which fields sync (name, description, images, SKU/barcode, weight, custom attributes).
  • Price list & attribute mapping — map the source system's price lists to Cartly's Price, Compare-at price, and Cost, and map custom product attributes to Cartly metafields.
  • Flexible product matching — control how existing products are matched on first import, by SKU and/or barcode.
  • Orders flow back out — placed and paid orders export to your external system automatically, with tax passed through.
  • Real-time with a safety net — updates arrive via webhooks in real time, backed by a scheduled sync so nothing is ever missed.

Also Improved

  • Admin login rate-limiting is now scoped to the login endpoint only, so it no longer affects merchants with active admin sessions.
v1.24.0ADDEDJune 27, 2026

Social Login, AI Resilience, In-Store Support & Smarter Onboarding

Social Login for Store Admins

  • Sign in with Google or GitHub — the admin login page now shows "Continue with Google" and "Continue with GitHub" buttons alongside email and password. Available on shards where third-party sign-in is not restricted by local regulation.
  • Link-only, never create — social sign-in links to an existing Cartly account whose email matches the provider verified email. Unknown emails are redirected to registration. Two-factor accounts continue to use password sign-in.
  • Platform operator setup — configure OAuth client ID and secret per provider at Platform → Settings → Auth Providers. Each provider has an enable toggle and is off by default. The OAuth callback lives on the platform domain; the session is handed off to the store subdomain via the cross-domain token handoff.

AI Resilience — Multi-Provider Fallback & Semantic Cache

  • Provider chain with automatic fallback — the admin AI assistant (Command) and all AI features run against an ordered provider chain. When the primary provider returns an error or rate-limit response, the platform transparently retries with the next configured provider (OpenAI, Groq, or any configured alternate).
  • Retry with backoff — transient 5xx and rate-limit responses trigger exponential-backoff retry before advancing to the fallback provider.
  • Semantic cache — a pgvector-backed similarity cache stores recent AI responses. Semantically equivalent questions return a cached answer instantly, reducing cost and latency.
  • Platform operator controls — configure providers, fallback order, and cache settings at Platform → AI. Includes per-provider connection test, cache statistics, and a clear-cache action.

Support Tickets — In-Store Help Desk

  • Open and track tickets from Command — merchants create support tickets, add replies, and check status without leaving the admin panel, through the Command AI assistant. Full conversation thread is displayed inline.
  • Human-friendly ticket numbers — tickets are identified by sequential numbers (e.g. #1042) in addition to internal IDs. Priority is derived automatically from the store plan tier (SLA), not chosen by the merchant.
  • Email notifications — the platform receives email on new tickets and merchant replies; merchants receive email when the platform responds.
  • Platform support desk — platform operators manage all tickets at Platform → Support: list view, per-ticket chat, reply, close, and an open-count badge in the nav.

Smarter Onboarding — New Stores Start Non-Empty

  • Ready-to-browse storefront from day one — self-serve sign-ups now automatically provision a Clarity storefront with sample products, collections, and starter pages (Shipping and Returns policy). Currency is selected from the store country.
  • Backfill tool for existing stores — the seed-onboarding-shop command lets platform operators provision demo content for any existing store without affecting live data.

Also Improved

  • Markets — searchable pickers — country selection is now a searchable list with country names and ISO codes instead of a free-text field. Currency and language pickers are also searchable, with a single source of truth per field.
  • Complimentary / trial plans — platform operators can grant any store a paid plan tier for a set number of months at no cost, with automatic expiry. Managed at Platform → Shops → Plan.
  • Regional payment gateway expansion — stores on regional shards gain access to additional payment gateways suited to their shard payment ecosystem. The app marketplace catalog reflects the store shard so only compatible apps and gateways are shown.
v1.23.0ADDEDJune 14, 2026

Metaobjects Editor, Section Blocks Panel, and Bring Your Own Email

Added

  • Metaobjects Editor — full custom-content CMS: The admin Metaobjects editor now covers the complete content lifecycle. Entries list supports status tabs (Active/Draft/Archived), full-text search, multi-column sort, pagination, and timestamps. Bulk select enables mass delete or status change. Each entry form provides purpose-built widgets: Tiptap rich_text WYSIWYG, media/file picker, product and collection reference pickers, CMS page picker, and metaobject reference picker scoped to a chosen definition. Array fields (list.<base>) support dynamic add/remove rows. Field definitions support choices and metaobject_type validations. Definition field order can be changed via drag-to-reorder. Row actions include Duplicate entry (handle gets -copy suffix), JSON view dialog, and Storefront usage scanner that shows which Liquid templates reference an entry. Entries can be exported as JSON or CSV.
  • Theme Editor — Section Blocks Panel: The visual editor right panel now includes a collapsible accordion below section settings, one row per block in block_order. Expanding a row reveals the block's settings fields for live editing. The editor dispatches a cartly:block:select postMessage to the preview iframe when a row is expanded; the theme bridge scrolls to and highlights the matching block with a CSS pulse animation. Lazy mounting ensures only the expanded row exists in DOM. Nested blocks (blocks-within-blocks) are not supported and now log a console.warn during theme development.
  • Bring Your Own Email (BYOE): Merchants can configure a custom email provider (SMTP, SendGrid, Resend, Mailgun, SES) at Settings → Email. Transactional and order emails then send from the merchant's own domain. The platform Resend account is the fallback when no custom provider is configured. Includes registration verify-email flow and guest-order claim-by-email. Outgoing emails now include standard Date and Message-ID headers for improved deliverability.

Improved

  • Multi-Currency UX: The currencies list collapses to enabled rows only, with an Add Currency dropdown to keep the UI manageable for shops with many currencies. A base-currency validation guard prevents accidental removal of the shop's base currency. The storefront header currency and locale switchers now always render when markets are configured, regardless of theme variant.
  • Country Coverage: Full ISO 3166-1 alpha-2 country list is now used everywhere — shipping zone multi-select, B2B company location, order address forms, and customer checkout address forms. Previously missing countries (e.g. Georgia/GE, Guadeloupe/GP) are now selectable in all contexts.

Fixed

  • Checkout shipping step now shows a "No shipping options available for this address" message instead of an infinite spinner when no shipping zone matches the customer's address.
  • Storefront price filter URL contract corrected to Shopify-compatible dollar amounts (not cents). Price range facets from Typesense now parse correctly.
  • Guest checkout POST /checkout/place no longer returns 401 for SSR-proxied requests. The handler now trusts the X-Shop-ID header for internal calls, removing the incorrect auth gate on guest orders.
v1.15.0ADDEDJune 5, 2026

Theme Fork-on-Write — Code Editor Overhaul

Theme architecture

  • Layered resolver — sections, snippets, layouts, assets, and locales now live in the platform embed FS by default. Merchants only acquire a DB row when they explicitly edit a file. Platform deploys flow into stock files automatically.
  • Lazy install — fresh shops carry only their page graph and design tokens in the DB. Existing shops thinned — 14 installs migrated.

Code editor

  • Custom / New / Synced badges in the file tree, plus filter chips (All / Modified / Synced) with live counts.
  • Fork-on-edit — stock files open read-only; click "Edit file" (or ⌘E) to confirm the fork.
  • Compare with original — inline Monaco diff editor with hide-unchanged-regions.
  • Upstream updated banner — amber banner with View diff / Sync upstream when the platform ships a new version of a section you forked.
  • Preview button in the toolbar — opens the storefront in a new tab via signed token.
  • Sync All upstream — bulk revert any forked files where upstream has changed.
  • Smart "Create new section" — modal generates a working scaffold with HTML, five typed settings, and a preset.

Visual editor

  • + Add panel aggregates stock embed sections without copying their files into your shop. Forks happen only when you edit code.
  • Open in Visual Editor action on templates/*.json from the code editor.

Public site polish

  • Working /blog category filters, Category dropdown in admin, unified hero/card layout with rotating gradients.
  • Functional /developers sidebar search.
  • apps.cartly.pro logo cross-domain link.

Read the Theme Development guide →

v1.22.0ADDEDMay 27, 2026

Conversion Tracking + Site-Wide Custom Scripts

Custom Script Injection

  • Site-wide scripts (/admin/settings → Custom Scripts) — head + body injection on every Liquid storefront page. Intended for GTM, GA4, chat widgets. Stored in analytics_config.custom_head_script / custom_body_script.
  • Order Confirmation scripts (/admin/preferences → Checkout Scripts) — head + body injection scoped exclusively to the Thank You page. Intended for Google Ads conversion events, Facebook Pixel Purchase, TikTok purchase events. Fires only when (!error && order) — the error branch never triggers, preventing inflated conversion counts. Stored in analytics_config.order_status_head_script / order_status_body_script.
  • Disjoint JSONB keys — site-wide and order-status scripts now live in separate keys. The previous collision (last save wins) is fixed.
  • CSP nonce auto-injection — injectScriptNonce() in the Liquid render service patches every <script> tag with the per-request nonce; merchants do not add nonces manually.
  • Multi-script support — paste a Google Ads snippet with two <script> tags; both execute via document.createElement('script').
  • Platform governance — super-admin can disable custom scripts globally via PATCH /platform/analytics. Merchant editor shows a clear hint when disabled.

Admin Polish

  • Dashboard default analytics window flipped from 7d to 30d for a more stable baseline on low-traffic shops.
  • /admin/settings removed duplicate Payment + Domain blocks — those surfaces live on their dedicated pages now.
  • /admin/markets tax_inclusive checkbox renamed "Tax Inclusive (VAT-style)" with inline two-branch numeric explainer.
v1.21.0ADDEDMay 26, 2026

Markets — Country-Specific Storefronts

Markets

  • Primary Market guarantee — every shop has exactly one primary market at all times, enforced at three independent layers: DB partial unique index, Ent mutation hooks, and a service-layer atomic PromoteToPrimary transaction. Cannot be deleted or deactivated.
  • Per-market locales — default_locale + available_locales[] chip selector in admin. The primary market's default_locale drives the platform translation source language.
  • Tax & duty modes — tax_inclusive (VAT-style vs sales-tax-style) and duty_mode (DDP vs DDU) per market, with inline explainer text in the admin showing concrete numeric examples for both branches.
  • Language switcher in Minimal theme — endonym names (русский, Deutsch, ქართული) sourced from internal/markets/endonym.go (19 entries, region-variant fallback). Fixed the previous bug where the dropdown rendered empty for every shop.
  • Orphan locale handling — visitor cookie referencing an inactive market locale is cleared via Set-Cookie: Max-Age=0; storefront falls back to default_locale.
  • Promote-to-primary workflow — admin confirm dialog explains translation-source impact. Atomic DB transaction prevents a shop from being left without a primary market.

Migration

  • cmd/migrate-shop-locale-to-primary reconciled legacy shop.locale across all existing shops (idempotent; ran on prod, all 7 shops already aligned).
v1.20.0ADDEDMay 26, 2026

Multi-Currency Storefronts

Multi-Currency

  • Automatic exchange rates from OpenExchangeRates, refreshed every 6 hours via Temporal cron. Manual force-refresh button available in the admin at /admin/settings/currencies.
  • Per-currency mode — auto (live feed) or manual (merchant-entered rate). Mixable per currency.
  • Markup & rounding — per-currency markup percentage (0–25%) applied after rate conversion, plus four rounding strategies: none, nearest .99, nearest .95, nearest whole. The per-currency row can override the shop default (explicit "no rounding" is honoured even when the shop default is .99).
  • Zero-decimal currencies — JPY, KRW, HUF, ISK, CLP, VND, BIF, RWF, XAF, XOF skip the cents-math rounding step. A ¥3,714 price stays ¥3,714.
  • Storefront cookie — cartly_currency persists the visitor's display currency across pages and sessions. Secure; SameSite=Lax on HTTPS.
  • Stale-rate banner — visible on the storefront when the display rate is older than 24 hours.
  • Liquid fx_context — shop.fx_context bundle available in every Liquid template (including inside {% render %} snippets via engine globals).
  • Storefront JS — window.cartlyFX (boilerplate/assets/fx-converter.js) for client-side currency conversion and pickers.

Hardening

  • Cross-tenant scoping on manual refresh — one merchant cannot trigger rate updates for other shops.
  • ISO 4217 validation on supported_currencies input; XSS hardening on Liquid currency-option attributes.
  • cartly_currency and cartly_locale cookies now carry the Secure attribute on HTTPS storefronts.
v1.19.0ADDEDMay 19, 2026

Clarity Theme + Customer Account on Liquid Across 7 Themes

Clarity

  • New marketplace theme — editorial premium aesthetic with warm-gold accent and Playfair Display headings. Featured on AppStore themes home as the default catalogue entry for new shops.
  • Filter-rail PLP — sidebar facets (Typesense-backed), sort dropdown, active-filter chips, mobile filter-sheet drawer, and pagination.
  • Sticky-info PDP — media gallery stays above the fold while product info scrolls; bundle, reviews, and recently-viewed sections ship out of the box.
  • AJAX Quick-Add — product cards include a Quick-Add button that opens a variant drawer without navigating away from the collection page.
  • Wishlist with auth-gate — heart buttons trigger a login-required modal for guests; authenticated customers save to their account wishlist.
  • Polymorphic article/blog templates — articles include structured data, share buttons, and a related-articles band. Blog listing supports category filtering.
  • Themed 404 — two-column hero with a help band; lost visitors see branded content instead of a blank error screen.
  • Full i18n — all customer-facing strings use the | t filter. Seven locales: en, de, es, fr, ru, uk, he.

Customer Account on Liquid

  • /account/* routes served by Go Liquid renderer — every marketplace theme now renders the customer dashboard, auth screens, order history, and account settings in its own design language.
  • 7 themes ported: Clarity, Mono, TechPro, Minimal, Crafter, Vogue, Linen — all 28 customer template files in the platform embed FS under backend/internal/theme/embed/customers/.
  • 11 POST handlers — /customer/account/* forms use POST-Redirect-Get (303 PRG) with Redis flash messages for success/error feedback.
  • Session bridge — __Host-cartly_customer_token JWT alongside legacy _customer_session cookie; existing sessions are not broken.
  • Merchants can fork and customise any customers/*.liquid template in the code editor.

Team Invitations

  • Invite teammates to the merchant admin via email. New ShopInvitation entity with create/list/revoke/resend/accept lifecycle.
  • Public accept page at /_site/accept-invite/:token; login and register honour ?next= for seamless post-accept redirect.
  • Admin → Settings → Team shows a Pending Invitations section with per-invite revoke and resend actions.

Multi-Currency Store Credit

  • store_credit_transaction gained original_amount_cents + original_currency — cross-border refunds now preserve the amount and currency paid, instead of silently converting via shop currency.
  • Hybrid currency validator warns on mismatched credits without blocking checkout (Strict mode tracked separately).
  • Admin customer detail shows Store Credit balance with FX equivalent, transaction history, and original_amount per row.
  • Refund-to-credit preview block on order detail.

Customer-Facing Returns

  • Customers can now create return requests from /account/returns — closes the self-serve RMA loop that was previously merchant-only via /admin/returns.

Admin & Storefront Hardening

  • Admin UX: page-based edit routes for Metafields definitions, Metaobjects definitions and entries, shipping zones, and company locations. Sales channels admin with list/create/rotate/revoke tokens. Gift card soft-archive, media alt-text editing, settings quick-links.
  • Security: audit waves 5 and 6 closed 66 issues — JWT revocation, OriginCheck same-host fallback for custom domains, webhook v2 signature with timestamp, WASM memory cap, OAuth state binding. No merchant action required.