1.4.0
majorBig UpdateLocal 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