Changelog
Release notes for the Shop Canvas kit.
Marketplace update — 10 October 2026
- Your store connection stays on your device. The saved store, market and Storefront token are kept in this browser under the project, so collaborators never see them. Open the plugin and connect once per device; nothing else is lost. Two other things are saved with the project and are shared: whether it shows demo or live products, and the sync's record of editorial choices.
- Linking sends less. Connect this project sends only the random link id. The hashes of the script and the store token that earlier versions also sent are gone.
- No request to your published site. Show published site gives you the link; you open it yourself and look for the script in the page source.
- Clearer failures. Each write to your Framer project reports whether anything changed and how to recover.
Marketplace update — 9 October 2026
Changes in the plugin version uploaded to the Framer Marketplace on 9 October, and on shopcanvas.ai. The Marketplace listing itself shows as unavailable right now; see Release status.
- Linking your own Shopify app moved to the website. If you made your own app for the store, link it at shopcanvas.ai/account/link-store with its Client ID and secret, or an older Admin API access token. Shop Canvas checks them with Shopify, keeps the store’s Admin access encrypted and never shows what you entered again. The plugin no longer asks for a secret or an Admin token.
- Link a store with a public token and a one-time code. In the plugin, open Link store to your account, paste the store’s public Storefront token and select Get my code. Add the code to Shopify Settings → Brand → Slogan, save, then select Verify and link store. Only someone who manages the store can do this, which is how Shop Canvas knows the store is yours.
- A random id instead of your Framer project id. Connect this project now sends only a random link id, kept on this device, not the Framer project id or name. A project linked by an older plugin shows as not linked until you choose Connect this project once.
- Cart & checkout is pasted by hand. The plugin no longer installs the script. In Store → Cart & checkout setup, copy the snippet, paste it into Framer Custom Code and choose I pasted this into Custom Code. After publishing, Show published site gives you a link to open your published page yourself, where you can look for the script in the page source. The plugin never loads your site. An older script saved by a previous plugin version keeps working; the plugin does not change or remove it.
- Configuration checks run in the plugin. Check configuration on the account screen runs on your device. Nothing from your Framer project is uploaded.
- More reliable sync engine. The sync engine is now bundled with the plugin as ordinary code, and its Shopify request sits in one place. Download review (local file) replaces Export review: it saves a file on your computer, sends nothing and contains less project content.
- Permission checks per action. Each action that changes your project checks your Framer permission first. When it is missing, the button is disabled and says why.
Marketplace update — 29 September 2026
Live on the Framer Marketplace for everyone who opens the plugin.
- Shopify descriptions are cleaned before they reach your CMS. Product descriptions and rich-text metafields pass through an allowlist before sync writes them to a Formatted Text field. Paragraphs, headings, lists, quotes, bold, italic, underline and links stay. Scripts, styles, forms, embeds and images inside the description are removed, as are inline event handlers and
javascript:,data:andvbscript:links. A link that opens a new tab getsrel="noopener noreferrer"if it has norelof its own. Product photos are not affected; they sync as images, not as description HTML. - Drafting absent products asks once more. When a sync would set products that are no longer in the selected Shopify catalog to draft, the plugin shows how many CMS items change and lists them, with Cancel or Draft absent products. Nothing is deleted from Shopify, and nothing changes on your live site until you publish.
- Stay signed in. The plugin refreshes your sign-in before it expires, instead of signing you out about a minute after you sign in (session refresh on Connect and after Clerk refresh).
- Woven emblem and wordmark in the plugin header and as the plugin icon, matching shopcanvas.ai.
- Kit file naming so Back up and replace works for every component after Framer stores imports as
control_helpers.ts. - Help sits bottom-left, clear of the Ask ShopCanvas launcher at the minimum panel width.
Marketplace release — 26 September 2026
Shop Canvas went live on the Framer Marketplace, free to install.
- Pricing: one Standard plan, $29 per production store per month with a 14-day free trial, billed through Stripe. Development and staging stores are free. The earlier one-time $99 kit offer is retired.
- Sign in and Connect Shopify inside the plugin. Approve Shop Canvas in Shopify and the domain, public Storefront token and market fill in on their own. Typing the three values still works without an account.
- Agency console at shopcanvas.ai/admin/agency: every client store in one table with its status, Framer project, last sync and billing; mark each store production or development; manage the subscription.
- Framer Marketplace review fixes: emptying the cart asks Cancel or Confirm inside the component instead of a browser dialog, and the plugin checks Framer permissions before it saves settings, installs the cart or syncs, and explains how to recover when a permission is missing.
- Runtime 2.1.5: products can be looked up by ID, and a variant without its own data falls back to its product. This is what lets the demo store run on sample data.
- Demo store: add a product section with bundled sample products before connecting a store.
- Components: loading skeletons, a purchase bar, a CMS swatch palette and image swatches, Stack and Strip gallery layouts, and a single pass over every property panel.
- Email support reaches a person: mail to contact@shopcanvas.ai is forwarded to the team's inbox.
Before the Marketplace release — after 0.1.0-rc.2
-
Runtime source: 2.1.4, targeting Shopify Storefront API 2026-07.
- The catalogue query carries each variant's image, so a card can switch its photo the moment a colour is picked instead of fetching per click. The product cache now records the shape it was written with, so an older cache is refetched rather than read as a catalogue with no variant photos.
- Storage adoption now covers every pre-rename prefix, so a site moving from the original Odeem-branded build keeps the shopper's cart, country, pending handoff and favorites instead of dropping the bag at the swap. Each prefix carries its own flag, so adopting one never marks another as done.
- A cart saved by the earlier ShopKit-named runtime is adopted once, and never over a newer Shop Canvas cart or after that cart has expired.
- A restored cart whose market differs from the page's market is repriced through Shopify instead of being replaced.
- A failed add to cart no longer discards the shopper's bag; only a complete lookup that reports the cart as gone can replace it.
-
Sync writes a Formatted Price field so native Framer text can show the price in the selected market's currency. Numeric Price bindings are unchanged.
-
New: Card swatches and Card image — colour circles on a catalogue card, and a card photo that follows the chosen colour. Behaviour only: the card stays a Framer design, and the pair is bound by Product ID. Quick Add is the existing Add to Cart with a design slot, revealed by a Framer hover variant.
-
Cart modal: a Cart Design whose rows area is a Fill stack no longer collapses to its header. The drawer stretches the design to the panel rather than leaving it to size itself, so the lines, subtotal and checkout button are visible again after adding to cart.
-
Ask ShopCanvas: in-product help across the website, the plugin and the support service, with one shared UI so the three cannot drift. The privacy notice ships with it, naming what leaves the browser and where it goes.
- Which documentation a question is answered from can now be chosen by asking rather than by counting keyword overlap. Off unless enabled. The keyword ranking had the plugin guide pinned to first place for every question, so one of four context slots went to the wrong document every time; the ranked version scores each page against the question and says the documentation does not cover it rather than answering from the best of a bad set.
- When ranking is on, the question — the latest one only, not the conversation — is sent to TypeSafe alongside each page's title and opening. The privacy notice names it. Switched off or unavailable, ranking is by keyword and nothing is sent.
- The Ask ShopCanvas widget in the plugin was still green after the site was recoloured; both copies are regenerated from one source now, and a stale copy fails the build instead of shipping.
-
Related products can show a product's colourways as a row of dots under each card, read from the option named in the panel. Additive and off by default, so an instance placed before this change renders byte-identical markup. The catalogue payload already carries the variants, so the row costs no extra request.
- Fixed a crash that emptied the related-products section on a live product page. A hook sat below two early returns, so the hook count differed between renders and React tore the component down. A static guard now fails on the exact text that shipped.
-
Quantity minus and plus buttons have a tap-target floor. They were sized by padding alone and rendered 10×15 CSS pixels, well under the 24 WCAG 2.2 asks for. The floor is a number in pixels, 0 by default so nothing shifts on an existing site, and applied last so it also lifts a smaller supplied design.
-
Card image works on runtimes older than 2.1.4, which is every site that has not re-pasted the snippet. Variant photos only entered the catalogue query in 2.1.4, so before this a colour looked like it had no photo and the card ignored the click; it now falls back to a per-colour lookup those runtimes already expose. Clicking back to a colour also left the previous colour's photo on the card, because the fetched URL was cached as a "do not fetch twice" marker rather than as a value.
-
Sync encodes a variant's option values from
selectedOptionsrather than from its title. Shopify omits an option whose value does not vary across a product, so a product declaring Colour × Size but stocking one colour titles its variants "Small", not "Red / Small" — which wrote one value under a two-option header and left every Size pill resolving to no variant. -
Sync keeps an existing product's colour-to-photo map whenever it keeps that product's photos. With Keep existing Framer photos on, the photos stayed but the map was rebuilt from Shopify, which orders photos its own way and allows one per variant, so a colour could point at the wrong photo or lose its second one. The map names photo slots, so it now stays with the photos it names; new products still get Shopify's photos and map together.
-
Sync no longer erases a colour-to-photo map it cannot rebuild. A store that assigns no variant images in Shopify computes an empty map, and because every field is written on every run that empty value replaced the map the CMS held, leaving every gallery unable to follow a colour. An existing value now survives an empty computed one, while a real map still overwrites. The preview reports how many were preserved.
-
Framer catalogue readback and per-item sync history were fixed.
-
In the plugin's Store tab, "Set up cart & checkout" reaches the cart and checkout screen again. It had been wired to the page it was already on, so the fifth step of the six-step setup looped: clicking it could not install the runtime, and the re-read returned the same card.
-
The Store tab opens with one prioritised next action instead of four checklist rows. Unavailable evidence is never read as success — unknown project or cart state shows "Checking…" rather than "Not installed".
-
The privacy notice was written from an audit of the live site rather than from a template. At the time (13 September) the site set no cookies, ran no analytics, kept nothing in browser storage, and every request on the home page went to shopcanvas.ai and nowhere else. Clerk sign-in and the Calendly booking frame were added later; the privacy notice describes them. Demo requests are kept for no longer than 24 months and then deleted, earlier on request, and the notice says that the mail provider keeps its own copy for about 30 days.
0.1.0-rc.2 — internal release candidate
Not approved for customer sales.
- Runtime source: 2.1.0, targeting Shopify Storefront API 2026-07.
- Plugin rebuilt from current source and packed with Framer's official tool.
- Shared sync uses Product ID identity and restricted legacy slug adoption.
- The agent recipe includes saved configuration and preserves images by default.
- Plugin and CLI previews display reported slug conflicts.
- The skill's bundled sync engine must match the canonical engine byte for byte.
- Added the approved founding offer terms: one storefront for the starter, lifetime kit updates, 30-day email setup support, and a 14-day refund window. Existing open-source notices are preserved.
Checks recorded for this candidate: plugin production build and official ZIP packaging succeeded. The 24 offline sync checks passed. Those checks include source-presence assertions and mock collection APIs; they are not a fresh installation or a real checkout test.
See Release status for what is still open.