logo

Changelog

What's new in Storify

New updates and improvements to Storify.

2.4.0

majorBig Update
September 29, 2026

Furniture Theme, Central Media Management, Performance & Security

Features
  • Added the Furniture Theme — a complete fourth storefront template for home goods sold by the room, with a large hero for room photography, room categories captioned under the picture instead of over it, and a starter home page with a two-panel materials story and "Shop the room" sets that add a whole setting to the cart in one click
  • Added a Furniture demo store — 36 products, 8 categories, 2 collections, 3 sliders, and 3 blog posts, with its own home page, header, and footer — imported by the installer or with pnpm db:seed --template=furniture
  • Dressed Furniture in its own colours and type — a warm oatmeal page with amber accents and Manrope headings over DM Sans — which Online Store → Themes → Use this theme applies to an existing store, and Theme settings → Colors can change or clear
  • Added Central Media Management — the product editor's Media box opens the media library, as Shopify's does, so you search it, filter it to images, videos, or 3D models, tick several files, and add them in one go
  • Opened the media library to everyone who builds products — admins see every file in the store, vendors see only their own uploads, and staff who may create or edit products see the store's library unless they are limited to a vendor, location, or region
  • Added an Upload button and Add video from URL inside the media library, where a new upload arrives already ticked, and an Add a YouTube or Vimeo video button on the Media box, while drag and drop and paste still upload straight away
  • Added a private storage bucket for vendor identity documents, digital products, and expense receipts, set under Settings → Storage → Private bucket, with Test connection checking it and pnpm db:migrate private-storage moving the files already stored
  • Added the Footer Studio — build the footer visually from rows, columns, and items, as the Header Studio does, with drag and drop, a property sidebar, and undo and redo, starting from the footer your store already has
  • Added Language and Currency items to the Header Studio, a Home page only switch for any header row, and padding and space-below controls for header rows and the announcement bar
  • Rebuilt the slider editor around where each slider really appears — it finds every cell that uses a slider and opens on that cell's real size at desktop, tablet, and phone — with a Big tile size for half-width cells, text and button styling in the property sidebar, and an Own gradient over a background picture
  • Moved the brand colours into Online Store → Themes → Theme settings → Colors, beside the colour roles that use them, and added a storefront scrollbar setting under Layout — Thin, Standard, or Hidden, with its own colours
  • Added Settings → Products, which switches physical products, digital products and services, pre-orders, and price on request on or off in every product editor — admin, staff, and vendor — without changing a product already live
  • Added store credit — refund to store credit instead of the card, give credit as goodwill from a customer's page, and let shoppers spend it at checkout and follow their balance under Account → Store credit
  • Added final sale for products, variants, or whole collections, shown on the product page and in the cart before the shopper pays, with each order line keeping the mark it was sold with
  • Added return windows per collection or per product, or no time limit at all, counted from each parcel or from the order's last one, with every order keeping the return rules it was sold under
  • Added exchanges, where a return pays for a new order of other items and the shopper pays any difference through a payment link
  • Added returns the store or a seller opens for the shopper, a "Changed my mind" reason, return instructions the shopper can mark as posted with tracking, return label uploads, restocking in steps, and declining a return with a reason
  • Added Committed and Unavailable stock to Inventory, so On hand is what a shelf count finds — including units sold but not yet shipped, and returned units that came back damaged, which you can put back on sale or write off
  • Added Spend per loyalty point under Settings → Orders, so points follow your currency and one order in a small-unit currency no longer makes a customer Platinum
Performance
  • Served the home page and every product page from the cache instead of drawing them again for each visit — a product page answers in about 3 ms instead of 12, one store process serves about five times as many product pages a second, and an edit you save still reaches the next visitor
  • Cut the database round trips an order waits on at checkout from 31 to 15, so a cash-on-delivery order with the database 85 ms away is placed in 2.7 s instead of 5.4 s
  • Cut reading the cart, which every page does, from 7 database round trips to 3 for a signed-in shopper and from 5 to 2 for a guest, and read the store's settings once per page, where the home page had read them six times
  • Drew the product page on the server and loaded only the controls a shopper works as code — 38 KB less JavaScript, and product data a third of its old size
  • Sent checkout and account wording, the country list, and confirmation dialogs only to the pages that use them, and the AI assistant only while it is switched on — most storefront pages load 15 KB less compressed JavaScript, and the home page's HTML is 11 KB smaller
  • Loaded only the parts of the form validation library in use, toasts only when needed, and the phone-number library only for stores that take a phone number at checkout — the login page loads 81 KB less compressed JavaScript, checkout 104 KB less, and every page 14 KB less
  • Compiled translations when the store is built and gave storefront pages a stylesheet without the dashboards' styles — 9 KB less JavaScript and 10 KB (16%) less CSS on every storefront page
  • Turned off the React Compiler, which took a third of the build's CPU — a build on a 10-core machine dropped from 21 to 15 seconds, and storefront pages load 19–30 KB less compressed JavaScript
  • Prefetched a link when the shopper points at, touches, or focuses it, instead of every link in view — which had sent 18–51 server renders per page view — and showed a thin progress bar the moment a link is tapped
  • Brought Back and Forward to the page the shopper just left, as a browser does, instead of fetching the whole page again — about 360 KB for the home page — unless it is more than 30 seconds old
  • Refreshed the storefront in the background after a sale, a restock, or a new review, so the next visitor no longer waits on a fresh render — the live demo's home page had taken 7 s at such a moment
  • Re-rendered only the product card that was tapped on add to cart, where every card on the page had re-rendered twice, and only the search box while typing in the header search
  • Made the account pages keep what they have read, so moving between them no longer reloads each one behind a spinner
  • Resized pictures from a custom CDN domain through the image optimizer once STORAGE_PUBLIC_URL is set, where they had been served at upload size — a 110 KB product photo now reaches a phone's card as 19 KB
  • Kept cached pages in memory, 50 MB by default, and capped optimized images at 1 GB of disk, so a crawler going through every product in every language can't fill the server's disk — PAGE_CACHE_MEMORY_MB and IMAGE_CACHE_DISK_MB change the limits
Security
  • Required INSTALL_TOKEN before the installer creates a new store's first admin, so nobody who finds a fresh deployment before you do can claim it — an installed store needs nothing
  • Kept the demo logins to demo deployments, and made the seeders and the reset refuse a real store's database unless you say otherwise
  • Counted each visitor by the address your proxy or Cloudflare actually saw, so rate limits, the login lockout, and the maintenance allow-list can't be sidestepped with a made-up header — list any other CDN's ranges in TRUSTED_PROXIES
  • Refused every scheduled job while CRON_SECRET is still the .env.example placeholder or shorter than 16 characters, and compared it in constant time — set a long random value before you upgrade
  • Signed other devices out on a password change, a password reset, or Sign out other devices, which had removed no sessions at all
  • Stopped the email verification link signing an account in, and asked for a sign-in from the last ten minutes before a login email, a first password, or a seller's payout bank account can be changed
  • Changed administrators only on the Team page, under its owner and last-administrator rules, and signed a banned or suspended account out at once
  • Held a vendor's staff to what the vendor itself may do — no changing a shopper's login email, deleting customers, creating orders marked paid, or touching other sellers' parcels
  • Kept staff limited to a vendor or a location inside it — the reviews, customers, returns, and alerts they see are their scope's alone, and the shared global variants and the whole site's traffic analytics are out of their reach
  • Kept your cost prices, commenters' email addresses, your internal notes about shoppers, and a guest cart's contact details out of everything the storefront sends
  • Made password-protected blog posts private, since the option had never protected them, and stopped the blog API sending a post's password
  • Attached a guest's orders, quotes, and points only to an account whose email is confirmed, never by phone number, and kept each sales-assistant chat with the shopper who had it
  • Printed what people type as plain text in your store's emails, and built payment return, checkout recovery, and subscription confirmation links from your store's own address, never from what a request claims
  • Applied request limits to admins, vendors, and staff too — at twenty times a shopper's — and to guests by address, where a fresh cart cookie had skipped them
  • Made a password-reset link work once, a download limit hold when requests arrive together, and password reset stop revealing which emails have an account
  • Let only the admin delete stored files — from the Media Library, media only, with each deletion in the audit log — and gave uploaded files unguessable names
  • Limited shopper uploads to photos — JPEG, PNG, GIF, WebP, AVIF, or HEIC, 10 MB each, four at a time — signed the file type into direct-upload links, and never store an uploaded SVG raw by accident
  • Stopped the image optimizer, the 3D model preview, the AI studio, and the invoice logo following redirects away from your storage, and served 3D previews only as .glb, .gltf, or .usdz models
  • Escaped a vendor's own text in their store page's structured data, stopped other sites framing your store, and sent nosniff, a stricter referrer policy, and HSTS in production
  • Answered unexpected server errors with "Something went wrong on our side" and a reference in the log, instead of a raw error naming your database host, bucket, or file paths
  • Settled cash the store's courier collects only by the courier's update or an admin, required a register card sale to use the payment its own register took, and closed downloads on a line refunded in full
  • Marked the guest cart cookie Secure over HTTPS, kept reset and recovery tokens out of analytics, and kept a guest checkout away from an account's saved cards
  • Updated Next.js to 16.3.6 for CVE-2026-94545 and email to Nodemailer 10, and removed an unused AI endpoint that let any signed-in shopper spend your OpenAI key
Improvements
  • Opened Settings inside the dashboard, where the sidebar swaps to the settings menu — with search, Unsaved and needs-attention markers, and Back to Dashboard — and kept one settings page's unsaved edits when another page is saved
  • Asked before leaving unsaved changes on Vendors → Configuration, Branding, and live chat, as the rest of Settings already did
  • Picked one Store Currency under Settings → General from every ISO 4217 currency, and removed settings that nothing read — the time zone, the POS language, and the vendor auto-approve and free-trial-length fields
  • Made dashboard preferences — light or dark, contrast, right to left, and the sidebar — each person's own, where an admin switching to dark mode had turned the storefront dark for every shopper
  • Translated the settings screens and the admin, vendor, and staff menus into all 18 languages — about 5,500 strings added and 2,500 replaced — naming each language in its own script and each currency in the dashboard's language
  • Extended the product page editor to the whole page — show or hide the section tabs, a pinned buy bar that follows your button settings, delivery-info styling, and tabs only for sections the page shows — and removed the placeholder FAQ row
  • Defaulted product thumbnails to 160 px with their own background and fit, kept the Carousel gallery above the buy box at every width, let product cards outline their image, and gave every admin colour field the same picker
  • Let shoppers who share an address — a mobile carrier, an office, a school — keep browsing and buying, with browsing limits raised from 100 to 1,000 requests per 15 minutes and a checkout limit per shopper, and told a refused visitor how many minutes to wait, in their language
  • Answered 404 for a product, category, collection, brand, or seller page that isn't there, where it had answered 200 with a not-found page
  • Kept admins, vendors, and staff out of the Customers list and its totals, which had counted the team's own test orders as customer spend
  • Let barcode scanners add to the POS cart wherever focus is, refused a scan while a dialog is open, and stopped a scan into a product's Barcode or SKU field saving the half-filled product
  • Rebuilt Orders → Quotes like the Orders list — stats, tabs by stage, search, filters, pagination, and a side sheet with the full request, its price history, and your team's note
  • Redrew the boost position ladder as a booking calendar with each booking on a dated track, and gave admins and vendors one three-step booking dialog
  • Added list and card views, drag-to-reorder, and a Vendor view preview to Vendor Plans, with Delete saying why a plan in use can't be removed
  • Added a stats strip above the admin and vendor returns lists — needs review, on the way back, refund due, and refunded in the last 30 days
  • Made pnpm build run on Windows as well as macOS and Linux, with no memory settings to tune and no database connection needed while building
  • Added one hourly job, /api/cron/store-credit, and two migrations only some stores need — private-storage once you add a private bucket, and store-credit-indexes with MONGODB_AUTO_INDEX=false — see the upgrade guide
Fixes
  • Fixed switching back to the store's default language doing nothing once a visitor had picked another language
  • Fixed the collection and brand pages' sort dropdowns changing their label but not the order
  • Fixed a dropped database connection failing every query until the store was restarted — it now reconnects
  • Fixed a database blip, or a build without a database, caching the default store — named Storify, in USD — in place of your store's own data
  • Fixed a paused or re-dated coupon's banner lingering on the storefront, and a reinstall on a running server keeping the previous store's catalogue, menus, sliders, and coupons
  • Fixed a fresh demo store's countdown offers having already ended, which left its home page without the deals panel — they now start from the day of the import
  • Fixed a slide image picked from the media library breaking within the hour on a bucket with no public URL, and a custom storage domain typed without https:// breaking every new upload's address
  • Fixed a recovery email the outbox was still retrying being marked failed, and recovery emails to shoppers without an account going out without a working unsubscribe link
  • Fixed an expired order's payment link still taking payment after the same cart was bought another way
  • Fixed signed-in shoppers never hearing that a payment failed, a pay link paid while signed out sending no confirmation, and a pay link opened both signed out and signed in failing with a Stripe error
  • Fixed Razorpay's payment window being impossible to click or type in from the vendor's boost, plan renewal, and commission dialogs
  • Fixed a card the gateway account won't take, such as a foreign card on a domestic Razorpay account, counting toward a gateway outage alert — the shopper is now told to try another card
  • Fixed the refund dialog opening on "Refundable: $0.00" for a fully refunded order, and offering refunds the server then refused
  • Fixed a refund above what a split cash-on-delivery order collected, a seller-collected cash-on-delivery refund booked as the store's, and a cancellation whose refund failed without anyone being told
  • Fixed staff scoped to a vendor seeing 0 on every order counter while the list below showed their orders
  • Fixed a full refund with restock putting a return's damaged units back on sale, and an edit to Available being dropped on save or writing the store-wide figure into the selected location
  • Fixed opening the size guide, or picking a variant whose pre-orders are full, blanking the whole product section while that part loaded
  • Fixed demo sliders drawing every size 27% too large, artwork scaled past 100% not growing, and a long word in a narrow slide running off its edge
  • Fixed a full-bleed hero stopping ten pixels short of the window beside the scrollbar, and category tiles stretching on full-width rows with no tile width to hold them
  • Fixed Korean being offered with no translation, Dutch being impossible to switch on, and menu labels that meant something else in Afrikaans, German, Igbo, Yoruba, Xhosa, and Zulu

2.3.0

major
September 25, 2026

Address Holds, Payment Recovery & Marketing Consent

Features
  • Added Address Holds — an order a courier can't deliver to pauses its shipping and emails the customer a secure link to correct or confirm the address, with reminders and a deadline you set under Settings → Shipping & Delivery → Undeliverable addresses
  • Added address checks for stores with a carrier connected — a "Did you mean…" suggestion at checkout, and a check of each new order's address before anyone buys a label
  • Added per-parcel tracking, so an order shipped in several packages shows each parcel's carrier, tracking number, and scan history on the tracking page and in the customer's account
  • Added a scheduled payment check, run by a new /api/cron/checkout-expiry job, that asks each gateway about checkouts the shopper never finished — paid ones are completed, and the rest are marked expired instead of staying pending forever
  • Added payment links, so a customer whose payment failed can pay the same order by card or PayPal, or have the mobile-money prompt sent again — emailed automatically, valid for seven days, and sent by staff from the order page with Send payment link
  • Added a record of every refused payment with the gateway's reason, under Finance → Transactions, on the order, and on the abandoned checkout's timeline, while shoppers see a plain explanation instead of the gateway's own message
  • Added card-testing protection — after repeated card refusals the checkout asks for a Cloudflare Turnstile check, then pauses for half an hour, set up under Settings → Payment Settings → Card-testing check
  • Added an alert when a payment gateway refuses almost every payment for an hour, so an outage is not first reported by the shoppers who gave up
  • Added a marketing consent record for email and SMS — its state, when and where it was given, and its history — with an Email subscription column, filter, and working CSV export under Customers
  • Added double opt-in, and an unsubscribe link in every marketing email that works without an account, including the inbox's own one-click unsubscribe button
  • Added one "Email or mobile phone number" field to checkout, a separate "Text me with news and offers" consent, and a choice of where the marketing box arrives pre-ticked — never, everywhere, in countries you pick, or only where the shopper's country allows it
  • Added up to three abandoned-checkout reminder emails on a schedule you set under Online Store → Checkout, which stop once the shopper buys or unsubscribes
  • Added one delivery choice for a cart from several sellers — lowest price or fastest — with each shipment still adjustable underneath
  • Added a searchable state and region picker to checkout that also matches ISO codes, so typing "FL" finds Florida
  • Added clean URLs for your default language — a one-language store shows no /en/ anywhere, old /en/ links redirect permanently, and every other language keeps its prefix
  • Added a booking page for each boost in the admin, with what is owed, the payment attempts behind it, and its delivery record, plus a Credit owed tab, sorting, and search by product or store
  • Added unpaid bills and repeating expenses to Finance → Expenses — mark a bill paid on the day it was paid, end a repeating series, record the currency an expense was paid in, and keep receipts private
  • Added return controls — approve fewer items than requested, count what actually arrived and its condition, put sellable units back in stock on their own, and let shoppers cancel a return before it is approved
  • Added option captions to cart lines, such as "Color: White" and "Size: M"
Improvements
  • Offered each payment gateway only in the currencies it can settle, and made PayPal work in JPY, HUF, and TWD, which it takes in whole units
  • Refused saving a payment gateway switched on without its keys, naming the fields that are missing
  • Showed cash-on-delivery limits at checkout, greying the option out with the reason in your currency
  • Held a mobile-money order's stock from the moment the payment prompt is sent, and locked the order against edits, cancellation, and restocking while the prompt is live
  • Reused the pending order and its payment page when a shopper retries Razorpay, PayPal, Paystack, or Pesapal from the same cart, instead of creating another pending order
  • Re-priced pre-order lines at checkout from the live product — price, deposit, and release date — so a changed pre-order stops checkout the way any price change does
  • Kept checkouts abandoned at a payment gateway out of the dashboard, analytics, finance reports, and the vendor's order list, so they no longer count as sales
  • Made Finance → Overview share a gateway or chargeback fee between your own book and the marketplace by what each collected, flag product sales recorded without a cost, and say which day a past period's balances are as of
  • Made the AI switch in Settings hide every AI button across the dashboard, and said that it covers authoring only — the storefront sales assistant has its own switch
  • Stopped hidden and empty sections from flashing a loading skeleton on the home and product pages
  • Made a store that sells into one country fill in and lock that country everywhere it is asked, the vendor application included, while product origin and ship-from stay free to choose
  • Asked for a postcode only where checkout requires one or a carrier is connected, in manual orders and address corrections too
  • Showed vendors why fulfilment actions are unavailable on unpaid orders, and put the reason for any disabled menu action on its own line
  • Cut three requests from every storefront visit that the server had already answered — the avatar lookup, the AI assistant's settings fetch, and an uncached web manifest
  • Renamed the Women Fashion template to Fashion in the template gallery, and removed the unusable Luxe placeholder card
  • Added three upgrade migrations — marketing-consent (required), order-address-indexes (when MONGODB_AUTO_INDEX=false), and return-refund-payer (when vendors collect cash on delivery) — see the upgrade guide
Fixes
  • Fixed a refunded order being marked paid again, with its stock taken a second time, when its payment page was reloaded
  • Fixed the same goods being refundable twice — from the order and again through a return — and a refunded return being reopened
  • Fixed a return refunding each line at a seller-wide coupon share, and a POS return at a whole-sale markdown, instead of the line's own discount
  • Fixed a refund on a method no gateway can refund, such as a bank transfer, failing with an error — it is now recorded as a refund to send by hand
  • Fixed admin-created orders being treated as the vendor's cash, which billed vendors commission on money they never received and never paid them out
  • Fixed POS card sales taken through your Stripe account being refunded by hand instead of through Stripe, so the customer received nothing
  • Fixed POS card and bank sales being booked as cash in hand, and commission a vendor paid by hand as a gateway balance — a report script works out the adjustment for past entries
  • Fixed zero-decimal currencies such as JPY getting fractions in coupons, POS totals, deposits, delivery shares, and import duty
  • Fixed import duties printed below the total instead of with the other charges on the checkout, the invoice PDF, and the confirmation email
  • Fixed Save this address doing nothing on a card checkout, and a suspended vendor still selling through card payments
  • Fixed pressing Enter in the coupon box placing the order at full price
  • Fixed a shopper's second abandoned checkout never getting a recovery email
  • Fixed the checkout marketing box being lost on completed orders and when a guest later created an account
  • Fixed a Google or Facebook account being able to skip two-factor authentication through a direct token sign-in
  • Fixed password changes from the account page skipping the store's password policy
  • Fixed the abandoned-checkout email printing the name typed at checkout as HTML
  • Fixed a product with several variants and no options being added to the cart with its first variant silently chosen
  • Fixed a product whose name contains a dash showing part of its name as a variant in the cart
  • Fixed pre-order balance reminders being swallowed by the first payment-due notice, a paid pre-order being cancelled when stock came back, and a double submit creating two pay-later orders
  • Fixed a vendor's pre-order cancel confirmation promising to refund other sellers' goods
  • Fixed shipping labels being voided twice, test-mode labels being booked as real costs, and carrier refunds left pending after a void
  • Fixed boost credits that could never be marked refunded, a re-priced position keeping its old currency, and the position ladder overstating impressions
  • Fixed dialogs and the cart drawer rendering narrower than designed, a custom thumbnail width overflowing the gallery row, and the checkout summary scrolling sideways

2.2.0

major
September 17, 2026

Women Fashion, Configurable Checkout & Stock Transfers

Features
  • Added a configurable checkout under Online Store → Checkout — contact by email, phone, or both, rename or hide address fields, custom fields, an order note, guest checkout on or off, and account creation during checkout
  • Added abandoned checkout tracking with optional automatic recovery emails after a delay you choose, run by a new /api/cron/abandoned-checkouts job
  • Added Women Fashion as a complete third template, with its own demo store (55 products, 6 brands) offered by the installer and by pnpm db:seed --template=women-fashion
  • Added stock transfers that ship from one location and are received at another, with partial receipts, editable drafts, and a transfer page for vendors
  • Added a product import dialog for CSV and JSON, with sample files and import limits
  • Added Duplicate to every section in the Customize builder, including header and footer groups
  • Added pre-order self-service — customers and guests can manage, cancel, or re-address a pre-order, and join a waitlist for a sold-out one
  • Added automatic pre-order balance collection with a saved card or PayPal, including for guest orders
  • Added chargeback tracking from Stripe, Razorpay, Paystack, and PayPal, and cancelling one seller's consignment without touching the others
  • Added a monthly token budget for the AI sales assistant, which answers from the catalogue when the budget runs out or the model is unavailable
Improvements
  • Made every template offer every feature — filters, featured products, pagination, category headers, and cart delivery dates now work under Electronics, Classic, and Women Fashion
  • Switched Razorpay to redirect-mode checkout, so FPX bank payments return to the store instead of leaving the order pending
  • Made the AI sales assistant check each search hit against the product itself, so it no longer says you don't carry something you do, and answers "outside your budget" with the nearest prices
  • Rebuilt the create transfer table with pagination, stock at both locations, and a Max shortcut
  • Added the slider studio and block editor panels, and a plain pre-order shelf page whose link hides while it is empty
  • Moved customer notifications into the middle of the storefront's mobile bottom bar
Fixes
  • Fixed money gaps across orders, refunds, vendor payouts, coupons, and POS, including bounced payouts and free-shipping coupons on split orders
  • Fixed checkout charging the store's flat legacy shipping fee instead of the seller's own rate
  • Fixed Send to courier on split orders and on orders without a customs snapshot, and a parcel being booked twice
  • Fixed products being assigned to parent categories, where they were hidden from branch listings — products now go on leaf categories only
  • Fixed the card form resetting on a background refresh
  • Fixed the MTN number field showing a number from the wrong country
  • Fixed auth pages missing the store header and footer, and the mobile hero sitting under a floating header
  • Fixed the storage settings sidebar reading the wrong provider's status, and buttons losing the pointer cursor

2.1.0

minor
September 11, 2026

SMS Notifications, Smarter Search & Priced Quotes

Features
  • Added text-message notifications through your own Twilio account, so the events Storify already emails — new orders, order status changes, pre-order updates, returns, payments, low stock, and vendor applications — can also be texted, with an SMS column beside In-app, Email, and Push for every event under Settings → Notifications
  • Added Settings → SMS (Twilio), taking a Messaging Service or a From number or alphanumeric sender ID, a default country for numbers saved without a country code, an optional order or tracking link, and a Send test SMS that goes through the same outbox real notifications use — with nothing texted until an admin switches SMS on, because Twilio bills every message
  • Added an SMS delivery log showing each message's status, its segment count, and the carrier's reason for any refusal, with passing failures retried after 1, 5, 30, and 120 minutes by the existing email-deliveries job — no new cron entry — a Retry button for permanent ones, and signed Twilio delivery receipts on stores served over https
  • Added phone numbers read in their own country — the order's shipping country, or the store's default — so 01712-345678 and +880 1712-345678 reach the same phone, while a number that does not parse as a real one is skipped rather than billed and read by a stranger
  • Added a Text Messages switch under Account → Preferences that appears only once a store actually texts customers, alongside STOP replies, which Twilio honours on the store's behalf
  • Rebuilt product search around one index-backed engine that matches what a product is actually called — name, SKU and barcode, tags, product type, option values, attributes, and variant names — plus category and brand names resolved at search time, so "apple watch" finds a watch filed under Watches by Apple even when its own name says neither
  • Added typo forgiveness to search, where a word that matches nothing in the catalogue is corrected to its nearest real word — "ipone" finds iPhones, "samsng" finds Samsung — and the page says it is showing results for the corrected word, while a real word is never corrected into a different one and short words and product codes are left alone
  • Added a Best match sort that search results now open on — an exact name first, then names starting with the phrase, then names containing it — where results used to open by popularity and put a one-word match with more reviews above an exact name
  • Added Search insights for admins and for staff with the analytics permission, listing the searches that found nothing over the last 7, 30, or 90 days, most frequent first — each one something shoppers came for and did not get, and a tag or a product away from answering
  • Added Send price to quote requests, so a price-on-request product can finally be sold: the customer is emailed and notified, sees the price on the product page while signed in with the address they asked from, and buys it through the ordinary cart and checkout
  • Added an Account → Quotes page and quoted prices that are bound to the exact quantity quoted, expire after 7 days by default or never, are spent by the order they are placed on, and come back if that order is cancelled — with a request sent while signed out joining the account the moment its sender signs in with the same email
  • Added a streaming AI sales assistant, where product cards appear the moment its catalogue search finishes and the reply is written out as the model produces it, instead of the whole answer arriving at once after a wait
  • Added post-delivery review prompts — a Rate your purchases card on the account overview where tapping a star opens the review with that rating already chosen, a prompt on the order page and beside each delivered line, and a delivered email and notification that ask for a rating
  • Added a clock to pre-orders: a daily sweep reminds signed-in shoppers of an owed balance seven days and one day before release, expires what is still unpaid once a grace period has passed, and reports overdue releases, where before nothing moved a pre-order but a person and an abandoned reservation held its quota for ever
  • Added pre-order guard rails for marketplaces — a master switch, optional admin approval per vendor with its own queue, a maximum lead time, a deposit ceiling, an expiry grace period, and a rolling payout reserve against late disputes — all shipping permissive, so a store already selling pre-orders keeps selling them the day it updates
  • Added a place for vendors to request pre-order access, shown only where a store actually reviews vendors, with its pending state read from the server so a vendor who asked yesterday is not offered the button again
  • Added Record balance received for a deposit taken on a gateway that cannot be charged a second time, fixed at the full balance so a part payment can never mark the order paid
  • Added a merchant-set return window, where the window's length was the one return rule nobody had chosen — 30 days for perishables and furniture alike — now read by the admin form, the eligibility check, and the product page from one policy, with 30 kept as the fallback so nothing changes for a store that never opens the screen
  • Added an unread-message count to the Inbox entry of the admin, vendor, and staff sidebars, which drops the moment a conversation is opened and costs no payload while the count has not changed
  • Added the header's logo controls to the footer builder — the store's logo or a custom one with its own dark-mode version, the header logo's size by default, and an Auto choice that picks the artwork by the footer's own background
  • Added a preview to the storefront chat button, so the new-conversation pane shows which seller the message will reach and the product it is about before the first message is sent
  • Added a searchable category scope to the header search bar, where suggestions follow the category Enter would search and the bar on the products listing mirrors the URL's search and category, so a reload or a category link no longer leaves it blank
Improvements
  • Routed every notification through one dispatcher — in-app and push, then email, then text — so a new channel reaches every event at once, and an event that fires twice, such as a courier webhook racing a manual "mark shipped", sends one email and one text rather than two
  • Stopped images fading in after hydration, which had hidden every server-rendered image until JavaScript ran — on a throttled phone profile, largest contentful paint fell from 7.6 s to 2.2 s on the home page, from 5.1 s to 2.2 s on listings, and from 4.9 s to 2.1 s on product pages
  • Stopped every sale — every register sale included — expiring the whole catalogue cache and the home and listing pages in all 18 locales; a stock movement now refreshes only the product it touched, and the catalogue only when something crosses between in stock and sold out
  • Shared in-flight catalogue visibility reads across a page's nested caches, cutting the database queries a cold home page makes from 92 to 80
  • Confirmed orders faster by sending the order email and notifications after the response, so no gateway holds the success page on "Verifying payment" while an invoice PDF renders and the mail server connects, and by asking Stripe once per poll instead of twice
  • Offered a gateway at checkout only when it can actually take the payment — its credentials resolve and, for the per-country wallets, it settles the store currency — with the admin payment screen reading the same rule and saying why a switched-on gateway is hidden
  • Let a build complete without a database: the sitemap, the one page the build prerendered from MongoDB, now falls back to the hub pages when the database cannot be reached, and the first revalidation after boot replaces it with the full catalogue — so CI and Docker builds no longer need database access
  • Decided review eligibility per consignment rather than by the order's status, so one seller's delivered parcel can be reviewed while another is still shipping, a cancelled seller's items can no longer be reviewed at all, and the product page says already reviewed instead of taking a review the server then refuses
  • Made the theme's button and input radius reach the whole storefront — chips, tabs, pagination, native selects, checkout fields, the country picker, and the filter sheet — where most controls had ignored it, and rendered storefront errors inside the themed store layout
  • Offered deposit and pay-later pre-orders only where a gateway on the store can collect the rest, with the product editor disabling those modes and saying why, instead of a refusal arriving weeks later at checkout in front of a shopper, about a choice the vendor had long forgotten
  • Made the product page tell a pre-order shopper what governs their money until dispatch — the deposit figure, a full refund, or nothing yet to refund — and count the delivery window from the day it ships, instead of promising a 30-day return and 4–7 day delivery beneath a release date two months out
  • Made the admin pre-order screens say what happens to the money: both cancel confirmations name the refund, a refund the gateway would not take comes back as a warning, and a bulk cancel names the orders that still need one by hand rather than counting them
  • Removed the match-anywhere search setting in favour of the one engine, which falls back to descriptions only when nothing matches by name, code, or tag, so the two kinds of match are never mixed
  • Made the admin quote requests table respond to its own width rather than the viewport's, so it fits beside an open sidebar — each request becomes a card below 56 rem, and long names and emails wrap instead of running into the next column
  • Added a Browse Website shortcut to the staff header, and showed the shipping and billing phones on the admin order's customer card
  • Added db:migrate product-search, required once after upgrading, which indexes the catalogue a store already has — until it runs, search answers with an unindexed match over names, codes, and tags and logs a reminder; stores with MONGODB_AUTO_INDEX=false also run quote-offer-indexes, notification-delivery-indexes, and omnichannel
  • Documented MONGODB_AUTO_INDEX=false for installed production stores, where Mongoose otherwise sends about 370 index commands on every boot, while the first visitors after a deploy wait behind them
  • Kept the product page's chat controls in one place — beside the Sold by row on the minimal design, unless the store placed the chat row itself — and renamed Chat with vendor to Chat with Seller
Fixes
  • Fixed every order confirmation carrying the invoice PDF failing to send, because the attachment came back from the email queue in a form the mailer rejects — each one was retried and ended as failed in the email log
  • Fixed guest shoppers never hearing that their order had shipped, been delivered, or been cancelled, because those updates were keyed to the order's customer, which on a guest order is the shopper's cart — they now get the email, and the text if enabled, at the address and phone on the order
  • Fixed a repeated event re-sending its email every time, since only the in-app notification was ever de-duplicated — and a guest, who has no in-app notification, could be mailed any number of times
  • Fixed Complete order doing nothing when the saved address had no name, because checkout required a surname in a field the collapsed saved-address view does not render — a nameless address now goes to the account holder, and an invalid submit reopens the delivery fields and focuses the one that failed
  • Fixed the cash-on-delivery amount handed to couriers and printed on shipping labels leaving out tax and ignoring coupons, so a courier could collect the wrong sum at the door — it is now exactly what the shopper owes for that consignment, Shiprocket included, which collects its own total
  • Fixed a vendor's order detail returning the whole order on a split order, other sellers' lines and costs included — it now returns the vendor's own consignment and a finance block with the charge, commission, and earnings the payout uses
  • Fixed the vendor dashboard and the vendor Orders page disagreeing on the same order — revenue now counts money actually collected, with unpaid orders shown as awaiting payment, order counts match the list's tabs, and a cancelled consignment no longer counts toward sales (the vendor analytics endpoint changed shape; see the upgrade guide)
  • Fixed the vendor orders list and dashboard cards showing face-value earnings rather than what the payout will pay, a split order's payment status taken from the whole order rather than the vendor's own consignment, and a cash-on-delivery order labelled as a card payment
  • Fixed the customer and admin order totals leaving out the import duty collected at checkout, so the lines above the total did not add up to it, and the customer order page printing the raw payment method code
  • Fixed a signed-in shopper checking out online receiving both the order confirmation and a generic Order Pending email, and the confirmation's View Order Details button pointing at the order number, which the order page cannot open
  • Fixed password resets, staff invitations, the contact form, and quote emails never sending on a store configured through SMTP environment variables alone, and boost emails having the opposite problem
  • Fixed a customer's Order updates email switch and a vendor's Low stock alerts switch being saved and never read
  • Fixed new-order alerts skipping admins whose admin role sat in their list of roles and printing every total with a dollar sign, and a pre-order's balance payment or a vendor's repeat application failing to reach the admins
  • Fixed a deposit pre-order being accepted on any gateway when only card payments can be charged a second time, which took the deposit and left the balance uncollectable for good — guest orders had the same hole, since the balance page authenticates against an account they do not have
  • Fixed cancelling a paid pre-order restoring the stock and leaving the shopper's deposit in the platform's account with nothing on screen saying so — cancelling now refunds, whoever cancels, and staff who may cancel but not refund can no longer cancel a paid pre-order
  • Fixed releasing a pre-order writing across every consignment on the order, which dragged a sibling the shopper already held back to processing and turned a cancelled consignment payable again
  • Fixed the pre-order list running newest-first, so an operator allocating a short intake down the page served whoever committed first last
  • Fixed an order whose pre-order balance was already settled being sent back round to payment due, because the bulk route read too few fields to see the payment
  • Fixed a balance payment the store had to refund showing the shopper a success, and a balance attempt that could no longer be paid blocking every later one as already in progress, for good
  • Fixed guests hearing nothing about their pre-order's progress, because updates were filed against their cart instead of mailed to the address on the order
  • Fixed a multi-vendor pre-order sticking on partially ready once one of its consignments had shipped or been cancelled
  • Fixed the admin Quotes page failing to render its list, because the table read the paginated response as though it were the array of rows
  • Fixed the admin payment screen counting eight gateways active while checkout offered cash on delivery alone
  • Fixed checkout quoting delivery for the pre-filled default country and answering "not available" before the shopper had typed an address, and a shipping zone saved as "USA" never claiming the "United States" the checkout picker sends
  • Fixed the checkout skeleton flashing before the success page, and the submit button stopping its spinner before the success page had taken over
  • Fixed the storefront footer keeping the light logo in dark mode — dark artwork on a dark footer — because the footer builder saved a copy of the light logo as its own, and drawing it in a fixed 128 × 32 px box whatever size the header used
  • Fixed category pills past the edge of a narrow POS product panel being unreachable, now that the strip scrolls on its own with edge arrows
  • Fixed the sign-in card blending into the page on store themes that switch card shadows off
  • Fixed live chat disappearing from the product page when a seller had no saved messaging settings
  • Fixed three storefront surfaces that ignored the dark theme — the search bar's category list opening light with unreadable options, brand logos drawn in dark ink vanishing into a dark page, and the deals panel's product cards turning into dark holes in a bright panel
  • Fixed an aborted search suggestion blanking the rows the next one was about to replace

2.0.0

majorStable
September 8, 2026

Header Studio, Guest Checkout & the Performance Pass

Features
  • Added the Header Studio — the header is now a canvas of rows and columns with a live preview, an item drawer, and a property panel for whatever is selected, where the five layouts become ordinary starting points a merchant can take apart rather than fixed templates
  • Added a collections menu item that drops the store's own published collections as a thumbnail grid, where nothing in the panel is authored — a collection published this morning is in the header this morning — plus the same grid option for any nav link's dropdown, with list still the default so no existing storefront changes appearance
  • Added a structured About Us page at /about — hero, live numbers, how it works, values, story, team, reviews, contact, and a closing call to action — where each optional section hides itself when its content is empty, so a fresh install shows the defaults and never an empty box
  • Added a numbers strip on About Us counted live from approved sellers, visible products, delivered orders, and customers, hiding any figure under ten rather than advertising it
  • Added guest customer records on the Shopify model, so a guest checkout leaves an email-keyed customer profile instead of vanishing, claimed by the matching account the moment that email signs in, with a Guest tab in the admin list, a vendor customers page, and order tracking and invoices that work off the guest email
  • Added an admin Team page carrying several administrators and exactly one protected Owner, guarded against demotion, suspension, and removal
  • Added an explicit ownership line on every staff profile, so scoping a platform staff member's data access to a vendor no longer hands that person to the vendor's dashboard — vendor scope is scope, not ownership
  • Added Orange Money Web Payment for mobile-money wallets across francophone West and Central Africa, a region none of the existing gateways reached, covering storefront checkout, the vendor-to-platform rail, and refunds recorded out of band
  • Added MTN Mobile Money over the Collections API as a push gateway — the shopper enters a wallet number at checkout and approves a PIN prompt on their own phone, with no redirect and no return URL — verified against the live sandbox rather than the documentation alone
  • Added a 15-minute reconciliation job for both mobile-money gateways, because Orange's retry policy is undocumented and MTN's callback is delivered exactly once, so a shopper who closes the tab after paying would otherwise leave an order pending forever with the money already gone
  • Added price on request for wholesale, made-to-order, and configured goods, where the storefront prints "Price on request" wherever a price would go and offers a quote dialog instead of an add-to-cart button, the cart and the register refuse the product outright rather than pricing it at zero, and the structured data drops its offer instead of advertising a free product
  • Added a quote request queue worked from the admin, notified the way an order is
  • Added "Deliver to" as a real delivery address — filled from the browser's own position and named through OpenStreetMap, so it reads as a place rather than "Near me" — which follows the shopper into checkout, pre-fills the city, and orders collection points nearest-first
  • Added a balance payment for deposit pre-orders, where the "payment due" notice used to ask for money the shopper had nowhere to pay: one payment intent for exactly the balance, tagged so the webhook never mistakes it for a checkout, and settled idempotently by whichever of the webhook and the shopper's confirmation arrives first
  • Added a platform-wide out-of-stock rule — show in place, move to the end, or hide from listings — as one tri-state rather than two switches that can contradict each other, paged without a computed sort so a listing never scans the whole catalogue to order by availability
  • Added an indexed product search mode behind a General setting, so a large catalogue can send each word to the product text index instead of running 23 unanchored regular expressions per token and again on the count
  • Added a stale-save guard on settings, where each section publishes a fingerprint of exactly what the browser was shown and a save whose section moved in between answers with a conflict and offers reload or overwrite, instead of two admins silently overwriting each other
  • Added a rejection reason and a resubmission path for vendor applicants, where a rejection used to be a permanent dead end only an admin deleting the record could unstick, and told the applicant nothing
  • Added free trials to paid vendor plans, where trial days had only ever been accepted on free plans and meant nothing there — a trial vendor is never asked for a payment method, the clock starts at approval rather than at application, and a lapsed trial closes the store into the ordinary subscription payment screen with plan, products, and orders untouched
  • Added one pnpm db:migrate runner over a single registry in place of 86 near-identical package scripts, with a listing, a uniform dry run on every migration, and one command to run the whole set in documented upgrade order
  • Added a catalog snapshot per storefront template, so seeding one theme no longer produces rails advertising categories the store does not sell, with an export audit that refuses to write a snapshot it cannot vouch for
  • Added storefront-wide quick view from a single provider in the store layout, so it works on home sections instead of only where a section happened to mount its own modal
  • Added a cart page the Electronics theme wears over the same behaviour, by moving the cart's state into a hook a second skin can render from
  • Added searchable brand and storage region pickers, the region list going from seven entries to every commercial region plus the GovCloud and China partitions
Improvements
  • Cut what a storefront page ships to the translations it actually uses — 286 KB down to 69 KB, where 43% of a product page's HTML had been translation data — with a contract test that fails when storefront code reaches for a key the subset does not carry
  • Split the buy box, review thread, cart page, slider runtime, and the header's drawers behind client-side lazy boundaries, so a page stops shipping scripts for components it never renders; every storefront route had shared one 1.79 MB initial set
  • Deferred analytics to idle time, the sign-in drawer to the moment a guest opens it, and moved product description sanitizing to the server, taking roughly 700 KB off every route's first load
  • Trimmed every product card to the fields a card renders and gave settings a cached read, so a warm storefront page now issues no database queries at all
  • Cut the production build from 59 to 31 seconds and the server output from 327 MB to 137 MB, by dropping the prerender of every page in all 18 locales — 3,729 render tasks that all fell back to dynamic anyway — and shipping without server source maps unless they are asked for
  • Self-hosted the two interface fonts, so a firewalled or offline machine can build, and bundled the invoice PDF's fonts, so generating an invoice no longer needs the server to have internet
  • Batched the repeated lookups an audit of 1,748 query sites turned up and added the two indexes the query planner showed missing
  • Moved the 216 modules that had accumulated at the root of lib into domain folders, broke nine of the ten import cycles, and removed 22 dead files, 563 unused exports, and 6 unused packages from the source buyers receive
  • Cleared every lint and React warning — 422 down to none — including 120 cases of setting state in an effect, rewritten to adjust it during render
  • Settled every captured gateway payment through one finalize pipeline, where eight copies of it had been drifting apart
  • Made one section registry the single authority for the settings allow-list, the sanitiser, and the secret markers, replacing four separate lists that had to agree with each other
  • Made every numeric field one control that keeps what you type until you leave it, replacing 50 inputs that parsed and clamped on each keystroke — which made it impossible to clear a field, or to type 1 on the way to 10
  • Gave every Online Store screen a layout skeleton that streams the moment a link is clicked, mirroring that screen's own wrapper, sticky bar, and card rhythm, so the arriving page settles into the same boxes instead of reflowing
  • Derived the dark header from the merchant's own dark scheme at render time rather than asking them to paint a second layout, with ink picked by surface tone so text never lands on a same-tone fill
  • Made the Header Studio's preview draw the storefront's real controls — the shopper's locale, the live currency, the header's own compare and category glyphs — instead of a sketch of them
  • Moved the out-of-stock rule onto the Product card studio, where one save covers the card and the catalogue policy together, and retired the Settings → Catalog tab
  • Rebuilt the staff detail page on the same tab shell the vendor page uses, so the screen an admin opens most often stopped being a thousand-line form with delete a few pixels from save
  • Rebuilt the deals panel for a phone around a hero deal and one swipe rail, where it had run 1,524 px on a 390 px screen, while every width from small up keeps the published composition unchanged
  • Rebuilt the reviews thread around a sticky summary rail and gave review bodies a reading measure, so a review stops running the full width of the column
  • Gave the blog article its own reading column, where the copy had inherited the theme's full container width and the byline wrapped into a ragged second row
  • Replaced the cart drawer's bare number field with the minus and plus stepper the rest of the store uses, announced to screen readers after each tap
  • Told shoppers the delivery window and return terms the store actually has, priced through the same resolver checkout uses, instead of hardcoded copy promising 2-5 days and a full refund on every product of every store
  • Upgraded to Next.js 16.3.4 and React 19.2.8, and raised the minimum Node version to 22.12
Fixes
  • Fixed a captured payment answering with an error and never sending its confirmation email, because emptying the cart after the order was written hit a version conflict — the money had been taken and the order existed, and the response said it had failed
  • Fixed the same failure shape in the Stripe finalizers and the guest fallback, where any database hiccup while clearing the cart still threw after the payment had gone through
  • Fixed the gateway fee never reaching the charge row, so the payments dashboard reported net equal to gross however much the gateway had kept
  • Fixed Orange Money shipping with none of its eight settlement currencies in the catalogue, which made it impossible to switch on end to end, and added a registry test so the next gateway cannot land half-registered
  • Fixed Orange Money being missing from the vendor application fee, the settings warning badge, and the vendor payment labels — each one a hand-written copy of the gateway list that was never updated
  • Fixed rounding to the penny landing below the tie, so 1.005 became 1.00, across orders, returns, discounts, earnings, and change given at the register
  • Fixed every content page editor reporting a successful save over an unchanged document, because the new section registry knew only custom pages and dropped About, Terms, Privacy, Returns, Cookies, Accessibility, Contact, and FAQ on the way in
  • Fixed audit rows recording a settings change leaking MTN's subscription key, Orange's merchant key, and Pesapal's consumer key in clear, by redacting on the declared credential paths instead of guessing at key names
  • Fixed every settings read being an upsert bound to the primary, and a schema validation failure reaching the admin as an internal server error rather than naming the field that failed
  • Fixed the footer's About Us link landing on the store's 404 page in every locale, which it had done since the default footer was written
  • Fixed the header presets sending "Become a Vendor" to the login-gated dashboard instead of the application form, and a coupon banner configured with a lower-case code never matching the upper-cased code checkout redeems
  • Fixed a multi-file upload keeping only the last image, because parallel completions landing in the same tick each built on the same pre-upload list
  • Fixed menu thumbnails being served at 56 pixels and then enlarged on every denser screen, when a square tile cropping a 2:1 banner needs about four times that
  • Fixed the cart and wishlist counters covering the icon they count, and loading skeletons pulsing in the store's brand colour, which read as content rather than as absence
  • Fixed theme tokens stopping at the storefront wrapper, so the cart drawer, the mobile menu, and every dropdown rendered with the default radius, accent, and button shape while the page behind them wore the active theme
  • Fixed the hero slider's category rail lining up only by luck, where a short hero sliced the last department in half and a full-height one left a dead pocket under the list
  • Fixed an empty bordered strip on products with no options, where the minimal buy box kept a group's hairline and padding around a row that rendered nothing
  • Fixed an administrator opening their own orders tab from the team list getting a 404, because the lookup recognised only staff roles
  • Fixed the register-access figure counting staff who had since been promoted to administrator, and vendor staff counts inflated by platform staff merely scoped to that vendor
  • Fixed a brief network stall surfacing as a 30-second connect timeout on a render that only ever waited five, with the stalled attempt keeping its connection slot pinned
  • Fixed two admin location routes answering with a server error when a field arrived as something other than text
  • Fixed the Electronics storefront on phones — filters and sort on one row, thumb-sized tap targets, a cart header that stops truncating names — and the product page's two identical Description headings

2.0.0Beta

Big Update
August 29, 2026

Theme Engine, Block CMS & the Electronics Template

Features
  • Added a theme engine that replaces the fixed home page configuration with 30+ schema-driven section types, where one field schema generates the admin inspector, the save-time validation, and the normalize-on-read — so content is theme-agnostic and survives a theme switch intact
  • Added a visual block builder with a searchable categorized section picker, illustrated preview thumbnails drawn for every section type, generated inspectors, drag-sortable blocks, autosaved drafts, an embedded live preview with click-to-select, a saved-sections library, and restorable version history
  • Added draft, published, and history on one document with an atomic publish, so a merchant rearranges the whole storefront without a shopper seeing any of it until they publish, and a concurrent autosave can never silently revert what was published
  • Added the Electronics template — a complete second storefront design built to an approved Figma specification, with its own home, product page, category and all-products listings, showcase hero row, dark category rail, gradient headings, split promo grid, deals panel, and shipped artwork
  • Added templates for every storefront surface — home, product, products listing, category, collection, and cart — where the built-in design renders until a first publish, so every page becomes arrangeable with no migration and no loss of what was already there
  • Added header and footer as section groups, so a merchant decides what renders around the chrome as well as inside it, with an announcement bar above the header and a trending-tags row below it
  • Added five header layouts — classic, centered, search-below, minimal, and compact — picked from illustrated preset cards, plus a transparent glass header, a category scope inside the search pill, and a configurable action group with a contact shortcut
  • Added a slider studio with layered slides carrying a tagline, heading, description, call to action, countdown, and a price bound to a real product rather than typed, with 9-way alignment, mobile background overrides, and fade transitions
  • Added saved sliders with their own admin manager, reusable across sections, and rebuilt the slideshow as a hero slider grid that accepts a saved slider, images, or a category rail
  • Added a product card configurator in the admin, so the card's badges, out-of-stock treatment, and every other part are designed once and rendered from that configuration across the whole storefront
  • Added a promotion banner that is an inline slider with the full slider editor embedded in the page builder, a tall-pair promotion grid layout, and a gap spacer block
  • Added six product gallery arrangements — bottom, left, grid, carousel, vertical, and full — where the last two rearrange the page rather than only the gallery, plus a product specification section a merchant can place, reorder, or drop
  • Added landing pages served from the same section engine at their own URL handle, taking precedence over the legacy custom pages they replace
  • Added a constrained checkout editor covering a store or focused chrome mode, a trust message, a secure badge, a support line, and up to six policy links, with the checkout flow itself deliberately left locked
  • Added a themes gallery showing real bundled storefront screenshots, and an activation dialog that offers an explicit choice — keep the current layout and change design only, or load the theme's starter into the home draft, where Discard restores it in one click
  • Added an install wizard that stands a store up in four steps — preflight checks, store basics, media storage with a live connection test, and template choice — with every page redirecting to it until an admin exists and the whole surface returning 404 the moment one does
  • Added a Navigation hub where footer link columns source their links from a menu instead of being hand-entered, alongside a dedicated header menu links editor
  • Added product comparison — a compare toggle on every product card, a tray that collects them, and a shareable comparison table for up to four products with their attribute sets aligned into shared rows
  • Added offline point of sale, so a register keeps selling through a network outage — sales queue in the browser behind an idempotency key, scanning and search fall back to a local catalogue snapshot, a provisional receipt number is printed and stored, the terminal survives a reload, and the queue drains on reconnect
  • Added oversell handling for offline sales that replay after the stock has gone, where the sale commits and the shortfall is measured, stamped on the order, and raised as an alert naming the products to recount, rather than the record being lost
  • Added per-register POS counters so each machine picks the branch it sells from, remembered per browser with its own held sales, a guarded switch that revalidates the cart against the target counter first, and the counter printed on the receipt, the confirmation, and the order
  • Added a per-location till flag so warehouses and pickup points stop appearing as registers a cashier could open, enforced in the picker and in every POS route's location resolution
  • Added a rebuilt vendor access system of four derived layers — marketplace policy, plan entitlement, per-vendor grants, and lifecycle — with capability packs grouping 48 permissions into 11 human decisions, overrides carrying an author and a reason, a locked page that names the denying layer, and an admin queue for access requests
  • Added a store return policy covering delivery refunds by fault, a restocking fee, a return shipping fee, and a platform administration fee, where every default reproduces existing behaviour so a store that never opens the screen sees no change to a single figure
  • Added a refund estimate shoppers see before submitting a return, quoted by the same planner that prices the real submission, plus a refund destination for cash-on-delivery returns and a merchant fault override that records what inspection actually found
  • Added per-consignment refund allocation stored on every refund, so payouts, vendor statements, and commission invoices deduct a refund from the vendor it names instead of spreading it across every seller on a split order
  • Added refund reconciliation for every gateway — Stripe, Paystack, and Razorpay refund events plus a new PayPal webhook route — so a refund pressed in a provider dashboard reaches the order, the books, and the payout, and one that fails after acceptance is reversed rather than left recorded as paid
  • Added carrier scans everywhere a parcel is shown — the signed-in order page, a tracking button in the shipped email, and the admin and vendor parcel lists — with failed deliveries quoting the courier's own words and admin-configurable tracking links for hand-entered tracking numbers
  • Added a rebuilt mega menu builder around a canvas that draws the flyout at the shape the storefront renders it, with frame-shaped promo image slots, a sync screen that shows the diff before anything is written, and a configurable category trigger button
  • Added append-only ledger adjustments with a required reason and audit trail, anomaly detection that names an impossible balance, a month-close preview showing exactly what would be frozen, and payout records carrying where the money was paid from
  • Added background job monitoring that records every run and raises an admin notification for a job that has never run or has gone quiet past its own cadence, closing the last silent failure in a deployment
Improvements
  • Replaced both server-sent event streams with focus-aware client polling, so hidden tabs stop entirely, returning to a tab or recovering the network refetches at once, and web push wakes an open tab — freshness that an interval on the server could never provide, without billing a running invocation for an idle dashboard
  • Replaced the jsdom-based HTML sanitizer with a pure-JavaScript one, which fixes every rich-text content page returning an error on serverless hosts and drops roughly 30MB from the server bundle
  • Made buyer builds survive on modest servers by sizing the build for Node's heap and moving type checking out of the production build, where it was the slowest and hungriest phase
  • Reworked the finance overview to group figures by the question they answer, choose a currency instead of stacking them, and list stock on hand as an asset held rather than as part of cash
  • Made every finance figure say which days it covers, with periods living in the URL, named spans that stay relative, a preset rail beside the calendar, and an off-by-a-day fix that stopped reports quietly dropping their final day's takings
  • Stopped the balance sheet filtering by book, since one bank account, one gateway, and one till sit behind both businesses of a marketplace, while profit and loss still splits where two businesses genuinely earned differently
  • Recorded inventory purchases as an asset instead of an operating expense, and stored the debited account on each expense row so a correction reverses what was actually posted
  • Showed each payout order's vendor share and earnings after commission, so a page whose whole job is being checked stops looking like an arithmetic error
  • Made the register offer the counters this machine has actually used, ranked counter search so a name match outranks an area match, kept number-key selection at any count, and stopped auto-focusing search so a tablet stops throwing its keyboard over the cards
  • Rolled products up the category tree so a parent category shows its whole branch instead of an empty grid, capped nesting at the three levels the storefront draws, and greyed out invalid parents in the picker
  • Hid builder fields a design ignores instead of leaving live controls that changed nothing, and made a section that went silently missing say why in the admin preview while staying silent on the storefront
  • Moved the template demos onto real stores on their own subdomains with their own databases, cross-linked from the themes gallery, the templates page, and a floating demo pill
  • Backfilled 650 translation keys across all 17 locales for the template surface, add-only so existing human translations are never overwritten
  • Replaced the seed script with snapshot-based seeding that exports a live catalogue and imports it, and tightened admin and vendor dashboard density so loading frames stop jumping when real content lands
  • Added dry-run migrations for store page identity, refund allocations, vendor access packs, retired permissions, notification indexes, and stranded vendor owner roles, with a ledger backfill that repairs only the rows that recorded nothing
Fixes
  • Fixed a second refund reversing what the first already gave back, which charged a vendor more than their whole share and let a completely untouched sale quietly pay the difference — refunds now prorate over what is left of the sale
  • Fixed a refund arriving while a payout sat scheduled being deducted from nobody, so a vendor kept the money for goods that had already come back
  • Fixed a full refund handing back delivery the carrier already has, and the delivery fee only being withheld once an order was delivered when the money actually leaves at dispatch
  • Fixed a failed refund leaving the shopper short their loyalty points and its return still claiming it had been refunded, which blocked the admin from retrying money the shopper never received
  • Fixed two concurrent refunds on one order both claiming the same unreversed share, and a refund reversal prorating over the whole sale instead of over what the refund was built from
  • Fixed merchant-fault returns still charging the restocking and return-shipping fees, and a late parcel being filed as a change of mind, both of which took money from a shopper for something that was not their doing
  • Fixed vendor return requests being invisible to the admin, so the only party who could refund was the only party who could not see the request, and made refunds admin-only since they spend the platform's gateway money
  • Fixed the offline outbox only draining when the browser's connectivity flag flipped, which it never does in the outage this feature exists for — a shift's takings could sit queued until somebody happened to reload
  • Fixed every offline replay reporting a false oversell alert from a query that never fetched the stock fields it measured, and one failed request pinning a register offline for the rest of the shift
  • Fixed a proxy error page being read as a network outage, which printed a receipt for a sale the server may well have committed, and bounded the offline queue so a full one refuses with an explanation instead of the till silently failing at a customer
  • Fixed the cached POS shell surviving a sign-out, so on a shared counter tablet one tenant's catalogue could be served to the next signed-in user offline, and added the staff area to the pages the service worker refuses to keep on disk
  • Fixed picking a POS location marking the whole catalogue out of stock for products that keep their units in aggregate stock alone, and the location being trusted straight off the query string
  • Fixed the counter list clipping at the fifth branch with no way to scroll, the sell-from-shared-stock answer being forgotten and re-asked on every load, and the counter-unavailable warning never appearing when an admin closed a branch
  • Fixed the boost ladder being able to sell reach on a sponsored rail the published page does not render, on both the home and product templates
  • Fixed a category's side promo banner being spent as its icon, which blanked every mega-menu side banner set from the admin, and bottom promo cards that showed in the builder preview and vanished on the storefront
  • Fixed the wishlist heart painting filled over server HTML that said empty, by rehydrating the persisted store after mount instead of during hydration
  • Fixed a store reactivated from the billing side leaving its owner locked out of the vendor dashboard while the storefront kept selling their products, with a migration for accounts already stranded
  • Fixed the vendor access request queue always reading empty on the admin side, and denials on Boosts and Discounts redirecting to a bare forbidden page instead of the reason-carrying gate
  • Fixed a refused session polling forever with a toast every 30 seconds, an inbox losing filtered threads on a busy day, and two empty inboxes sharing a cache signature across a sign-out
  • Fixed a sub-category being unable to move back to the root, header menu links being stranded at the end of the utility row, and the header logo disagreeing between the storefront bar and the studio preview

1.5.0

majorBig Update
August 18, 2026

Finance Ledger, Product Boosting & Automated Shipping

Features
  • Added a Finance section built on a double-entry ledger, so profit and loss, cash position, and vendor balances are all groupings of the same entries and no two screens can disagree about the same sale
  • Added expenses with fixed categories, receipts, and recurring templates that create each copy when it falls due, where a correction posts a reversal rather than editing history
  • Added two separate books for a marketplace — the store's own trading and what it earns as an agent — never added together, and no total summed across currencies
  • Added a receivables screen showing what the platform holds for each vendor beside what that vendor owes, netted into the figure a settlement actually pays
  • Added a vendor Finance section with an overview, a bank-statement-style ledger, expenses, payouts, what they owe the platform, and CSV export of both statement and costs
  • Added month-end closing and a tax summary report, where closing redirects late entries into the open month instead of moving a figure already filed
  • Added commission invoices so a platform can collect what it is owed on cash and COD sales the vendor collected at their own counter
  • Added product boosting as a ladder of numbered sponsored positions priced per day, where a vendor books one rung for a range of days and position N always renders at slot N
  • Added boost self-service for vendors, per-rung occupancy and impressions for the admin, and automatic release with credit when a product or vendor stops rendering
  • Added automated shipping carriers through Shippo and Shiprocket — rate shopping, label purchase, AWB printing, and tracking sync, run manually or automatically once an order is paid
  • Added vendor-owned carrier accounts, saved package presets, and a packing engine that picks the smallest fitting box
  • Added order-backed loyalty points that award on payment, reverse on refund, and derive a Bronze, Silver, Gold, or Platinum tier from the balance
  • Added vendor plan billing through any enabled gateway instead of Stripe alone, with switching between gateways in both directions and a vendor billing page with payment history
  • Added a per-vendor setting for who collects a vendor's cash on delivery, plus an admin-awarded verified vendor badge
  • Added account lockout after repeated failed sign-ins, configurable from Settings and keyed on email and IP together
  • Added an OAuth setup tab that derives the exact redirect URI the server will send and tests credentials before saving
Improvements
  • Rebuilt the customer tracking page around the carrier's own scans, its tracking link, and a per-seller breakdown on split orders
  • Simplified media storage to S3-compatible providers — Cloudflare R2, DigitalOcean Spaces, AWS S3, and self-hosted MinIO — with existing local files kept readable and a migration onto a real provider
  • Moved locations out of POS to their own admin and vendor screens, so a store with the register switched off can still say where its stock is kept
  • Made a commission rate change in Settings reach existing vendors while leaving individually negotiated rates untouched
  • Snapshotted unit cost onto every order line and captured the real gateway fee and exchange rate at the moment they exist, so margin and net revenue mean something
  • Extended country and region pickers to the full ISO 3166-1 list with matching phone codes
  • Made the settings API the single authority on what a section may contain, so a new field can no longer be dropped on the way out by a stale copy of the allow list
  • Server-rendered the messaging channel connections panel and reworked the WhatsApp and Instagram embedded sign-up flow
  • Summarised carrier refusals into one readable explanation shown beside the form, instead of fifteen near-identical sentences in a toast
  • Added a migration that clears the seeded sample-brand titles left in content, so renaming the store in Settings renames it everywhere
  • Documented the finance module, product boosting, storage setup, and carrier shipping, each with the migrations an existing store needs
Fixes
  • Fixed sponsored listings promoting an unsold rung to the top, which let a vendor buy the cheapest position and still land first
  • Fixed carrier tracking updating once and then going silent, so parcels stopped reporting after their first event
  • Fixed international Shippo shipments returning no rates at all, because the customs declaration was built and never sent
  • Fixed Shiprocket collecting the wrong amount on delivery — the goods value without the delivery fee, and one vendor's parcel carrying the whole order's total on a split order
  • Fixed cash, COD, and own-terminal sales being paid out as though the platform had collected the money, which cost the store twice on every such order
  • Fixed a tracking number reaching the shipment but never the order, leaving the customer's tracking page empty on a parcel already in transit
  • Fixed the AI brand kit's colours and logo being discarded on every save while the screen reported success
  • Fixed an uploaded app icon being discarded on save and .ico favicons being re-encoded to WebP
  • Fixed every cold start re-stamping multi-vendor mode and vendor permissions from frozen legacy values, silently undoing what an admin had configured since
  • Fixed the appearance drawer in the vendor header saving nothing while looking applied, and now says so when a save is refused
  • Fixed the second correction to an expense never reaching the books, and a deleted expense leaving its cost in the accounts
  • Fixed a month-end recurring expense collapsing to the 28th after February and staying there for the rest of the template's life
  • Fixed a loyalty write failure returning an error for a payment or refund that had already gone through
  • Fixed saving Settings failing on an unknown vendor permission, which took the cache refresh with it and served the old values back
  • Fixed the root layout declaring English for every locale, so Arabic now server-renders right-to-left instead of correcting itself after hydration
  • Fixed a hardcoded dollar sign on vendor plans, discounts, POS dialogs, and stats strips, and settled which currency a historical order is shown in
  • Fixed the Afrikaans and Xhosa location strings that were carrying Zulu text

1.4.0

majorBig Update
August 10, 2026

Local Pickup, Nearby Discovery & Mobile Storefront

Features
  • Added location-aware discovery so a shopper sets their place once and product listings, categories, collections, brands, vendor stores, and pre-orders narrow to sellers who can actually serve them, with nearest-first sorting and distance badges on product cards
  • Added a distance radius filter that counts how many products each distance returns before the shopper commits to one
  • Added local pickup built around store locations, with opening hours, a collection area, pickup instructions, and a map link, chosen at checkout instead of a booked time slot
  • Added per-vendor store locations carrying their own address and map coordinates, so distance is measured from the counter a shopper can walk into rather than the vendor's payout address
  • Added roles for each location covering whether it stocks inventory, fulfils online orders, and offers pickup, plus an ordered dispatch list that decides which branch a delivery leaves from
  • Added collection availability on the product page, showing the branch, its neighbourhood, and the distance for the exact variant selected, without publishing per-branch stock counts
  • Added saved checkout addresses with a default address, shared with the account address book
  • Added a shipping estimator in the cart that quotes the same rates checkout will charge, alongside a free-shipping progress bar
  • Added a rest-of-the-world shipping zone that prices any address no other zone covers and can carry several rates of its own, replacing the single fallback rate
  • Added vendor pricing for the store's shipping zones, so vendors set what they charge inside geography the platform defines and any zone they leave alone inherits the store's rates
  • Added an advanced JSON product import for up to 1,000 products per file that creates missing categories, generates every option combination, and supports digital products
  • Added ready-made sample catalogs with 200 international products across 12 categories and 16 collections, plus per-vendor catalogs for multi-vendor demos
  • Added support for any ISO 4217 currency from the general settings, with display names and decimal places resolved automatically
  • Added a dedicated installable app icon rendered at the sizes Android and iOS require, separate from the browser favicon
  • Added breadcrumbs to every storefront and account page, doubling as structured data on product pages
  • Added a real sitemap covering products, categories, collections, brands, vendors, blog posts, and content pages, refreshed hourly
  • Added a mobile bottom navigation bar with live cart and wishlist counts, and an account drawer that signs shoppers in or registers them without leaving the page
  • Added infinite loading to the product list with a running result count, grouped filters, and a sticky filter sidebar
  • Added a footer contact source switch so contact details either stay synced with store information or use footer-only values
Improvements
  • Redesigned the storefront for phones with a thumb-reachable bottom bar, a search row in the header, snap-scrolling rails that let the next card peek, a swipeable promo row, and filters in a bottom sheet
  • Made product card wishlist, add-to-cart, and badge controls reachable on touch, where they had been gated behind hover and never appeared on a phone
  • Rebuilt the mobile menu drawer around shop and support groups with per-destination icons, an active-route highlight, a tappable account card, and a collections rail
  • Redesigned the customer account area for small screens with a mobile section nav, a denser dashboard, a standalone change-password card, and lighter order and wishlist pages
  • Made the admin dashboard, orders table, vendors list, inventory editor, and vendor dashboard usable on a phone, including a compact recent-orders card and a pinned inventory save bar
  • Moved the location control out of the header and onto the pages it narrows, seeded on the server so it shows the shopper's place instead of flashing an empty state
  • Ranked shipping zones by how precisely they claim an address, so a region zone written to override a country-wide zone is no longer undercut by it
  • Disabled the legacy shipping cost and free-shipping threshold fields while shipping zones are on, with an explanation of where rates now come from
  • Warned when every rate in a zone is conditional, which would otherwise leave some carts with no rate at all
  • Grouped cart lines by seller so a multi-vendor bag explains up front why collection is unavailable, instead of revealing it after an address has been filled in
  • Simplified collection to opening hours rather than reserved time slots, removing hold expiry from the checkout path entirely
  • Split login and registration into shared form components reused by the auth pages, the account drawer, and the store navigation
  • Moved media uploads straight to storage with client-side WebP conversion, so large files no longer pass through the application proxy
  • Kept footer contact details synced with store information by default, so a general settings update no longer leaves a stale copy in the footer
  • Narrowed canonical URLs, hreflang, and robots rules to what each store actually serves, and kept cart, checkout, account, and auth pages out of search results
  • Added an explanation for visitors with JavaScript disabled instead of skeletons pulsing forever behind unloaded content
  • Hardened the offline experience, cleaned up the legacy install cache, and surfaced registration failures in production
  • Added dry-run-capable migrations for location ownership, location coordinates, retiring pickup slots, and reconciling stock across locations
  • Documented the advanced product import and international catalog setup, and expanded automated coverage for locations, pickup, shipping, imports, and app icons
Fixes
  • Fixed every storefront page declaring itself a duplicate of the home page to search engines, and hreflang advertising all 18 built-in locales regardless of what the store serves
  • Fixed browsers never offering to install the app, because the manifest advertised the store's favicon as its app icon
  • Fixed the offline page being filled from any cached navigation, so a dashboard render, a maintenance page, or a 404 could be served to whoever opened the app next on a shared device
  • Fixed the supported-currency list re-adding a removed currency on every restart
  • Fixed Cash on Delivery being offered on downloads-only orders, which have no moment for cash to change hands
  • Fixed the default shipping cost and free-shipping threshold never reaching an order while shipping zones were on
  • Fixed cash-on-delivery orders skipping the per-vendor rates and import duty that card checkouts already applied
  • Fixed the shopper's chosen shipping method not being recorded on the order or split across its per-vendor sub-orders
  • Fixed the stock reconcile script writing negative per-location quantities, hiding them from its dry run, and raising stock on simple products when told to lower it
  • Fixed a variant's existing stock being wiped the first time a store's locations were synced onto it
  • Fixed colour presets in the preferences drawer highlighting without changing any colour
  • Fixed vendors outside the chosen radius still appearing in nearby results
  • Fixed product imports rejecting rows with no price and failing on categories that did not exist yet
  • Fixed a failed invoice download looking like a dead button
  • Fixed the collection step repeating an address notice and a Cash on Delivery note below the pickup options

1.3.1

minor
August 4, 2026

Country Policy, Order Timeline & POS Register

Features
  • Added a store-wide country availability policy with an admin choice between every country or an explicit allow list, enforced across checkout, saved addresses, customer and vendor profiles, order creation, shipping rates, vendor onboarding, registration, and product imports
  • Added Congo (Kinshasa), Hong Kong, Côte d'Ivoire, Macao, and Palestine to the country list with matching phone codes
  • Added a real order timeline that records placed, paid, shipped, refunded, and cancelled events from checkout, the POS register, every payment gateway, and refunds
  • Added staff comments on orders in the same timeline feed, gated on the edit-orders permission and scoped like every other order view
  • Added an editable product URL handle on the product form that follows the title until you set your own
  • Added a free sample file for digital products that shoppers can open from the product page before buying, separate from the paid downloads
  • Added configurable desktop column counts for the home page New Arrivals and Top Articles grids
  • Added an opt-in setting for selling vendor-owned stock on the shop's POS register in multi-vendor stores
  • Added favicons and PWA icons served from store settings so every install shows its own branding instead of a bundled placeholder
  • Added a per-route demo mode policy so demo deployments accept product creates and updates while still refusing deletes, settings changes, and storage edits
Improvements
  • Redesigned the POS register for phones and tablets with scrollable panels, a pinned checkout footer, a two-row toolbar with filters in a bottom sheet, and a bottom-sheet payment dialog with a pinned charge button
  • Server-rendered the POS catalogue behind a streaming skeleton, removed the duplicate product query on every load, and made refetches abort stale requests
  • Locked the physical or digital product format after creation in both the form and the API, since the two formats carry different data, checkout paths, and stock semantics
  • Centralized stock rules so digital products, untracked products, and continue-selling products behave identically in the buy box, cart, product cards, and inventory writes
  • Extended audit history retention from 90 days to 24 months so an order's history outlives a card chargeback window, with a migration script for existing databases
  • Sized the country picker to the allowed list, showing the search box only for longer lists and a read-only field when a single country is allowed
  • Reworked storefront product cards and the related-products, new-arrivals, and top-articles carousels so cards keep consistent widths and no longer stretch to the tallest title
  • Improved the product create and edit page layout and simplified its organization and collection fields
  • Kept money formatting on Western digits when a currency's regional locale would otherwise print Bengali or Arabic-Indic numerals
  • Excluded the dashboard sidebar and header from printed order pages
Fixes
  • Fixed staff restricted to a vendor, POS location, or region being able to open any order, including its customer details, by typing the order id into the URL
  • Fixed the order timeline showing no events at all for POS sales, card payments, and refunds
  • Fixed historical order totals being relabelled with the store's current currency after an admin switched it
  • Fixed cancelled orders carrying the same success marker as shipped orders in the timeline
  • Fixed held POS sales being visible and resumable from any register, and resuming a hold restoring stale prices and stock another register had already sold
  • Fixed a failed hold silently clearing the POS cart, and digital or continue-selling products being dropped as out of stock when a hold was resumed
  • Fixed the POS camera scanner failing to start and reporting nothing when it did fail
  • Fixed an entire vendor catalogue appearing on the shop's register by default in multi-vendor stores
  • Fixed storefront pages painting the wrong loading skeleton, so a product page no longer flashes the product-grid skeleton before it loads
  • Fixed checkout showing three different loading frames back to back
  • Fixed product saves failing with a database cast error when variant options arrived in a legacy shape
  • Fixed cleared product fields such as compare-at price, cost, unit price, and barcode format reappearing after a save
  • Fixed price ranges and variant stock totals not being recalculated after a product update
  • Fixed private digital files being left in storage after they were removed from a product
  • Fixed digital products and products with stock tracking turned off being reported as out of stock
  • Fixed delete buttons in admin tables reporting a generic failure instead of the demo deployment's own message

1.3.0

majorBig Update
July 30, 2026

Omnichannel Inbox, Vendor Subscriptions & Digital Products

Features
  • Added an omnichannel messaging system that unifies storefront live chat with WhatsApp, Facebook Messenger, Instagram Direct, and Telegram in a single conversation model
  • Added admin, vendor, and staff inboxes with conversation assignment, claim and unassign controls, read state, and live streaming updates
  • Added channel connections for platform and vendor owners with encrypted credentials, WhatsApp embedded signup, public click-to-chat links, and automatic connection health alerts
  • Added WhatsApp template authoring, template synchronization, and an in-conversation template composer
  • Added an escalation engine for unanswered conversations plus a delivery monitor and failures panel for outbound send errors
  • Added chat attachments with shared rendering across every channel and a sandboxed media proxy
  • Added platform live-chat settings, messaging permissions in role-based access control, and routing of the storefront contact form into the conversation system
  • Added an opt-in vendor subscription plan system with an admin plan catalog covering price, billing interval, commission rate, trial length, product and staff limits, and AI-authoring capability
  • Added Stripe billing for vendor plans with product and price synchronization, checkout, customer portal, invoice and payment records, upgrades, downgrades, cancellations, and dunning retries before expiry
  • Added an admin Vendor Configuration surface for registration, approval, trial length, required documents, plan toggle, and default commission
  • Added a single commission authority that resolves store, plan, and settings defaults and projects the result onto the vendor record
  • Added a three-step vendor registration wizard covering account details, store information with verification documents, and a final review screen
  • Added an admin-configurable vendor onboarding flow builder to rename and reorder steps, toggle required and hidden fields, add custom fields, and preview the wizard live
  • Added a vendor-facing subscription page and admin plan assignment with lazy read-time expiry that reverts commission without revoking access
  • Added Pesapal and ioTec payment gateways with IPN registration, callbacks, and verification, plus Ugandan shilling support
  • Added digital products with a physical or digital format switch, private digital-asset storage, vendor and admin asset management, and per-order customer download links
  • Added external video embedding from YouTube and Vimeo on product media
  • Added visual option values for product variants with swatch and image representation and a dedicated visual-options editor
  • Added redesigned vendor storefronts backed by real catalog data with store address, map directions, and vendor following
  • Added a customer detail workspace with a tabbed layout, header summary, order history, activity feed, and avatar upload
  • Added a vendor detail workspace with subscription state, orders, and store statistics
  • Added native device push delivery alongside browser web push
  • Added held orders to the POS terminal
Improvements
  • Improved storefront freshness so admin and vendor catalog changes reach visitors without a hard reload across browser, router, ISR, and API cache layers
  • Moved API rate limiting to a shared database counter so limits hold across multiple application instances
  • Rebuilt admin, vendor, and staff list pages as server-rendered views with shared query helpers, route segments, and loading skeletons
  • Hardened money paths with variant-aware and server-side POS pricing, atomic refund reservations with running totals, order-currency refunds, and crash-safe automatic refunds for tampered carts
  • Made stock, transfer, and pre-order state machines atomic with cancelled-order guards, cash-on-delivery and POS idempotency, and guest-cart merge claims
  • Enforced account status for every role, including admin and staff, with a one-time upgrade migration
  • Made OAuth providers respect the admin panel toggle instead of auto-enabling from environment credentials
  • Made two-factor authentication opt-in and added a password policy and a startup secret preflight
  • Made currency admin-driven, language URL-driven, and the theme light or dark with light as the default
  • Made the appearance color system apply across the whole application and consolidated secret credential handling in settings
  • Converted uploaded and reusable images to WebP
  • Redesigned the product image gallery with a shared layout module and a dedicated product chat entry point
  • Improved customer and vendor detail page performance and aligned their design
  • Improved the media uploader with an embed-video-from-URL control, a drag-and-drop digital files dropzone with file-type badges, and persisted media dimensions
  • Cached settings, menus, and categories with server-seeded headers, paginated account orders, and moved review filtering into the database
  • Added compound indexes and migration scripts for audit, performance, dashboard, vendor storefront, omnichannel, push, and Telegram data
  • Added operating documentation for omnichannel messaging, Pesapal, ioTec, and the vendor subscription billing checklist
Fixes
  • Fixed live chat failing for every visitor after the first on a fresh install by scoping the contact identity index
  • Fixed the public contact form rejecting submissions when live chat was turned off
  • Fixed anonymous chat throttling that granted every request a fresh rate-limit bucket
  • Fixed image attachments to WhatsApp failing because chat images were force-converted to WebP
  • Fixed a stored-script risk where the WhatsApp media proxy relayed provider content types on our own origin
  • Fixed platform messaging settings leaking the escalation email and business-hours schedule into public payloads
  • Fixed platform staff being locked out of the inbox and viewer resolution failing inside server components
  • Fixed outbound messages being lost when an immediate send failed and unread counters dropping concurrent increments
  • Fixed vendor billing races so checkout binds to one subscription, ambiguous or missing Stripe prices fail closed, and webhook processing is leased atomically
  • Fixed vendor billing recovery from checkout sessions, dunning reconciliation, commission snapshots, orphaned rows after vendor deletion, and archived plans exposing internal details at checkout
  • Fixed rename-only product updates unpublishing products and wiping variants, images, and stock
  • Fixed revalidation calls that silently expired nothing and draft products leaking into the storefront
  • Fixed OAuth enabling and disabling not taking effect
  • Fixed login redirects losing the requested destination, along with open-redirect and login-loop risks in return paths
  • Fixed product gallery thumbnails not centering when fewer than four
  • Fixed country flag rendering on Windows, product price symbols, mega menu promo image logic, and an alert translation issue

1.2.0

majorBig Update
July 19, 2026

AI Studio, Media Library & Commerce Improvements

Features
  • Introduced a dashboard AI Studio hub with shared text and image authoring for products, variants, categories, collections, brands, blogs, merchant review replies, hero slides, and promotional cards
  • Added AI generation and improvement for summaries, descriptions, rich content, SEO metadata, image alt text, icons, logos, product media, and variant images
  • Added an AI image workspace with generate and edit modes, quick prompts, background removal, enhancement, upscaling, erase, resize, expand, effects, before-and-after comparison, undo and redo, draft recovery, downloads, deletion, and storefront card previews
  • Added an opt-in hero banner studio that produces exact 1360 × 314 artwork, safely interprets prompts, preserves supplied promotional copy, and supports English, Bengali, and mixed-script text
  • Added ratio-locked 16:9 blog featured images, inline AI images for blog content, and slot-aware artwork for promotional cards
  • Added centralized AI settings for a shared OpenAI key, model selection, output size and quality, per-surface switches, staff and vendor access, daily limits, and connection testing
  • Added brand voice, tone selection, image-style guidance, and a brand kit with primary and secondary colors plus logo support
  • Added streamed long-form content generation, vision-based alt text, and a deterministic SEO checklist with scoring
  • Added exact social exports for Open Graph, square, portrait, story or reel, and X formats with fill or fit modes, brand-color padding, and an optional logo
  • Localized AI Studio controls, presets, settings, and guidance across all 18 supported locales
  • Added reusable global variants with text, color, image, integer, and decimal values plus seven storefront presentation modes
  • Added category-level variant templates that merge into product variants while preserving product-owned options and surviving price and stock combinations
  • Added persistent custom color swatches, variant media and AI image actions, and bulk stock editing
  • Added vendor-scoped storefront filters with vendor-specific product results and filter counts
  • Added Turkish language support plus Turkish lira and Pakistani rupee currencies
  • Added a keyboard-friendly POS calculator with calculation history, fullscreen mode, F8 scanner focus, and improved SKU and barcode search
  • Added standards-aware EAN-13, UPC-A, GTIN-14, and Code 128 identifiers for products and variants with source metadata, internal barcode generation, CSV preflight, and atomic uniqueness protection
  • Added an inventory barcode-label studio with three physical label sizes, 203 or 300 DPI, manual or stock-based copies, ZPL or TSPL output, browser printing, raw downloads, and direct QZ Tray printing
  • Added local Code 128 and QR rendering for POS receipts with automatic printing after completed sales when enabled
  • Added admin and vendor shipment records with exact 4 × 6 internal shipping-label PDFs for browser or direct QZ printing
  • Added a first-class Local Storage provider for persistent single-server installs alongside Cloudflare R2 and S3-compatible storage
  • Added a provider-aware Media Library with pagination, search, media-type filtering, upload, image, video, 3D and document previews, URL copying, and single or bulk deletion
  • Expanded the product size guide with product-line templates, regional sizing, inch and centimetre conversion, fit guidance, measurement instructions, and international equivalents
Improvements
  • Redesigned and modularized AI Studio into focused canvas, media, prompt, action, and session components while keeping shared form integrations consistent
  • Improved AI Studio interactions with responsive menus, one-click presets, persistent drafts, version history, ratio-aware tools, localized canvas sizes, and exact surface previews
  • Improved product and variant workflows with a redesigned edit modal, better option handling, contained product-media previews, and more accurate storefront card previews
  • Improved POS terminal behavior, color-variant handling, keyboard shortcuts, receipt settings, and dashboard KPI fallbacks when POS is disabled
  • Hardened the mega menu to three supported levels with depth validation, synchronized previews, safer navigation state, and bounded storefront layouts
  • Aligned collection creation and editing with the product form experience
  • Improved storage switching with draft-first configuration, provider status and testing, persistent public URL settings, and protection from stale-provider values
  • Improved R2 and S3-compatible support for custom endpoints, addressing modes, region normalization, signed previews, and existing-media continuity
  • Improved runtime uploads with collision-safe original filenames, immediate local serving, byte-range responses, immutable caching, clearer size and provider errors, and proxy bypass for larger files
  • Hardened AI routes with server-side credentials, role and surface gates, rate limits, daily usage accounting, sanitized rich content, and own-storage checks for image edits and downloads
  • Hardened local media delivery against path traversal and uploaded SVG execution while centralizing trusted remote media domains
  • Added authenticated QZ certificate-signing endpoints so thermal-printer private keys remain server-side
  • Added a dry-run and apply barcode-registry migration flow so existing stores can resolve duplicate identifiers before enforcing global uniqueness
  • Updated sidebar scrollbar colors and behavior
  • Expanded automated coverage for AI authoring, hero banners, SEO, social exports, storage uploads, barcodes, shipping labels, and variants, and normalized legacy suites for Vitest
  • Added operating and deployment documentation for AI authoring, hero banners, barcodes, thermal printing, and required migrations
Fixes
  • Fixed AI generation menus becoming unclickable inside modal dialogs and improved their open and close behavior
  • Fixed stale AI drafts remaining after hero slides were removed and eliminated filename side effects during image expansion
  • Fixed hero banner dimension, prompt, redirect, file-size, and source-origin boundary handling
  • Fixed mixed-script hero copy being lost or altered during exact-image rendering
  • Fixed blog featured images being heavily cropped by locking their AI workflow to 16:9
  • Fixed category and product color swatches not consistently using saved custom colors
  • Fixed local-storage media URLs being rejected when saving avatars and other uploaded assets
  • Fixed local files uploaded after server startup not being served and media uploads being truncated by the application proxy
  • Fixed R2 and S3-compatible auto-region, custom-endpoint, path-style addressing, missing-public-URL, and provider-switch deadlock issues
  • Fixed remote or private storage media failing across image, 3D model, email-logo, and cross-provider rendering paths
  • Fixed stale storage drafts overwriting current settings and exposed exact server and media-size errors for failed uploads

1.1.0

minor
July 6, 2026

POS, Analytics & Storefront Improvements

Features
  • Added production-ready barcode scanning to the POS workflow
  • Added Google Analytics 4, Google Tag Manager, Meta Pixel, and TikTok Pixel integrations
  • Added POS receipt printing and expanded payment support
  • Added a color picker for product color variants
  • Added vendor shop sharing and editable vendor store slugs
  • Added social media sharing for vendor profiles
  • Added Peruvian currency support
Improvements
  • Redesigned the POS experience with improved features, responsiveness, and staff navigation
  • Improved POS payment handling, printing, and order completion
  • Optimized the customer dashboard layout for a better fit across screen sizes
  • Improved overall application performance
Fixes
  • Fixed Stripe card payments in POS and removed the unnecessary cardholder field
  • Fixed footer CMS settings not saving correctly
  • Fixed transaction provider text display issues
  • Fixed mega menu validation failures

1.0.0

major
June 25, 2026

Initial Release

Features
  • AI Sales Agent to answer product, payment, and delivery questions and guide shoppers
  • Built-in POS with product search, customer lookup, cart totals, and cash/card/manual payments
  • Single-vendor and multi-vendor storefronts with vendor approval, commissions, and payouts
  • 3D product viewer for immersive product previews
  • Payment gateways: Stripe, PayPal, Razorpay, Paystack, and cash-on-delivery
  • Multi-language and multi-currency support for global stores
  • RTL and Arabic-ready storefront, accounts, and dashboards
  • PWA support for installable, fast, and offline-capable shopping
  • SEO-ready pages, products, and articles out of the box
  • Traffic analytics with Google Analytics and Plausible integrations
  • Product, category, inventory, and order management
  • Coupons, discounts, tax rules, and shipping configurations
  • Customer accounts with order history and wishlist
  • Admin and vendor dashboards with role-based access control
  • Built on Next.js and MongoDB with a responsive light and dark theme

Ready to get started?

Join hundreds of merchants using Storify to launch and scale their online stores.