Demo
See it before you buy it
Two ways round. Below are the walkthroughs: every screen a buyer meets, in order, with what each one proves. And there is a live OpenCart store with Import/export installed, which you are welcome to break.
The live store
demo.kyvero.dev is a real OpenCart store running the admin unlocked, with Import/export installed. Sign in, import a file, apply it, roll it back. There is nothing in it to protect: it holds OpenCart's own demo catalogue and no real data of anyone's.
It wipes itself back to that catalogue after a spell of nobody using it, and again before the next visitor arrives, so anything you do there is temporary and anything you find there was put there by a stranger. Please do not type a password you use elsewhere into it, and do not leave anything in it you would want back.
Delivery Date is on it too. Back In Stock, Returns Portal, Review Requests, Pre-Order and Product Configurator are not on it yet, so their walkthroughs below are the only place to see them working. Those are photographs of stores built for the occasion by a command in our repository, not of this one.
If it does not answer, it is being rebuilt or its host has gone away. It runs on a free tier and we would rather spend the money on the extensions. The walkthroughs below are the same screens, and the documentation describes every extension in full; neither depends on that store being up.
Import/export, screen by screen
A supplier has sent a price and stock file. This is every screen between that file and the catalogue, in order.
What Import/export is says what it does and what it does not; this is what using it looks like.
Map the columns
Every column of the file, the first few values it holds, and the field it is bound to. The fields offered are the columns this store has, so a column another extension added is mappable with no configuration.
The plan
Seven counts for the whole file before a single write. This is the screen that tells you a file you thought would change three products would in fact create four hundred.
What would change
The before and after for each record, with the current value struck through. The row it refused to read is in red, because a price of “on request” is not a number. Nothing here has been written to the catalogue.
A plan it will not apply
A price that moved 88% and a quantity that collapsed to zero look like an upstream mistake, so the plan is held: Acknowledge stands where Apply would. You can still apply it, once you have said that you have seen it.
Undo this import
An applied import can be rolled back, and the rollback is itself previewed: the values it would put back, per record, before you confirm. What rollback does not restore is written down in the documentation.
Profiles and history
The mapping saved as a profile, so next month’s file from the same supplier is an upload and a glance. Every job that ran is still listed, with what it did.
Delivery Date, screen by screen
A store that delivers with its own van. This is the week being set up, a customer booking against it, and the day being read back off the sheet, in that order.
What Delivery Date is says what it does and what it does not; this is what using it looks like.
Your delivery week
Three windows, which weekday each one runs on, and a cap typed into the box under every tick, plus a cap on the whole weekday along the foot. This is the screen behind “three caps, checked together”, and the closed date at the bottom is the one with a note on it.
What it would offer, before you save it
The next fortnight worked out beside the form by the same code the checkout runs, with the numbers you have typed and not yet saved. Every day it will not offer says why, and the clock field at the top lets you pretend a customer is ordering after the cut-off to check it.
Pickup on Saturdays, the courier not
A second calendar bound to one shipping method. It is inheriting the store’s days here, which is why the whole grid is greyed out and unclickable: inheritance is per calendar, never per field. Each timing field prints the number in force beside it.
What the customer gets
The picker sits inside core’s own shipping-method block, with no template edited and no theme file touched. Six days at a time, the nearest given as names instead of dates, and a full window struck through rather than missing.
When the day cannot be kept
Somebody else took the last place while this customer was in checkout. The order moves to the next day that can be kept (never the nearest), and this is the customer being told so before they confirm, in the words they read.
On the order, where you already look
The delivery day sitting between Shipping Method and Payment Method on core’s own order page, linking into the planner, with the “was …” line where a booking moved, so the record of the change survives on the order itself.
Planning the day
The week’s occupancy above the day’s orders, grouped by window. A slot being held for somebody still in checkout is a grey “+1 holding” and is never folded into the count, so a merchant reading 3/4 can trust the 3. It is read-only on purpose: moving a firm booking is a phone call.
The sheet that leaves the building
The same day printed for whoever is driving: the full street address the screen shortens to a town, a tick column the screen does not have, and windows with nothing in them left out. The day also exports as CSV, one row per order.
Back In Stock, screen by screen
A size is gone and somebody wants it. This is the field they meet, the list it fills, the number that list becomes, and the one thing that has to be woken for any of it to send.
What Back In Stock is says what it does and what it does not; this is what using it looks like.
What the shopper meets
Spliced in below Add to Cart in the theme already running, with no template edited. It names the variant rather than the product, because that is what the alert will be about, and the notice under the field is the whole promise in the words the shopper reads before typing anything.
The waiting list
Addresses masked until you ask to see one, and a pending confirmation counted separately from the people waiting, because somebody who has not clicked the link is not on the list yet. The search beside it answers “what do you hold about me” for one address across every store, and honours a withdrawal or an erasure from the same screen.
What to reorder
The waiting list read as a number: per variant, how many are waiting, how long the longest has been, and why an alert cannot go out right now. There is no all-time figure and the footnote says why: requests are deleted on the schedule the shopper was promised, so a total nobody can reconstruct is not printed as though they could.
Per variant, on the product
A row for the product and one for each of its option values, with a switch that inherits from the module until you say otherwise. The state column is the useful half: a variant that cannot be alerted says which of the conditions it is failing, rather than sitting silently at zero.
The part that has to be woken
No alert is ever sent by a page view, which makes this the screen that decides whether the extension does anything at all. Three ways to call the sweep (OpenCart’s own scheduler, a URL anything can fetch, or a command), each printed with this store’s own paths already in it, and any one of them is enough.
Returns Portal, screen by screen
Something is going back, and the person sending it has no account. This is every screen between “I want to return this” and a decision recorded line by line, in order.
What Returns Portal is says what it does and what it does not; this is what using it looks like.
Proving the order is theirs
Two fields and no account. OpenCart’s own form accepts an order number without checking that the order exists or that it belongs to the person typing it; this checks both, and every refusal is worded the same way whatever went wrong, so the screen cannot be used to find out whose address is on an order. The two ways out under the rule are there because a customer who has lost the email has not lost the right to return the thing.
Picking the lines
Every line of the order, with the one that may not come back carrying the reason rather than being hidden. The card adds up as the customer ticks and shows its working (subtotal, share of any order discount, tax), because a number with its arithmetic beside it is a number a merchant can check against their own coupon. “Exchange requested” is worded that way on the button itself: it records what was asked for and creates no order.
The slip, printed before anybody has agreed
The customer gets it immediately, because making them wait for it is how a parcel arrives with nothing in it saying whose return it is. The overprint is the whole reason it can be immediate: it says outright that nobody has accepted the return yet, so it cannot be read as permission to post. Approve the request and it prints without the box.
The queue
Three tabs with their counts, so what is waiting on you is a number rather than a scroll. “Approved, awaiting parcel” is the one worth having: its count is what tells you something was agreed a fortnight ago and never arrived. Both customers here are badged Guest, which is the case OpenCart’s own returns handle worst: it files a guest’s return where that guest can never see it again.
Half of it, and the reason for the other half
Refuse one line and the card shows two figures rather than one: what the customer was shown, and what you are accepting now. The save button counts the refusals back at you before you press it. The box above is required on a refusal, because “why” is what the customer is about to be emailed, line by line, in your words.
Review Requests, screen by screen
An order has arrived and nobody has said anything about it. This is the message that goes out, the page it opens, what ends up on the product page, and the two screens the merchant reads it back from.
What Review Requests is says what it does and what it does not; this is what using it looks like.
What lands in the inbox
One message for the whole order, not one per product, with the first few named and the rest counted. The stars are live (clicking one pre-fills that rating on the page), and the footer carries the reason, the way out and the postal address, because a marketing email that carries none of those is the kind that gets a store blocked.
The page the link opens
No login, no password and no captcha: the link is the proof of purchase, which is what lets a guest order be asked like any other. One card per product, each submitting on its own, so a customer who only wants to talk about one of five can. The card already sent shows its own state back rather than disappearing.
What it puts on the product page
The badge is the point, and the paragraph above the list is what makes it mean something: it says in plain words what the mark is, that unmarked reviews came through the form, and that critical reviews are not removed. Both are spliced into the theme already running, both are yours to reword per language, and turning one off takes the other with it.
One row per order, in one of nine states
A queue rather than a send-and-hope. Needs a look counts the rows pointing at something that has changed since (an order refunded, a review deleted with its product), and a failed send carries your mail engine’s own error with a Resend button, because a message that never left is a thing you can act on.
Why nothing is sending
Seven lines, each naming the screen that fixes it, and the sixth is the one no other extension can answer: it checks the review template your store renders rather than OpenCart’s, so a theme where the badge would silently not appear says so here instead of on the product page.
Pre-Order, screen by screen
A lantern is on its way and the date is known. This is every screen between marking it and the customer paying for it, in order, handed between the merchant and the shopper twice.
What Pre-Order is says what it does and what it does not; this is what using it looks like.
Where a pre-order is made
One tab on the product you already had open, and the whole answer is on it. The three option values disagree with the product on purpose: Large is on the shelf, Medium follows the product, and Small is a pre-order with a date a month later than the product’s. That is the claim this screen proves: per option value, not per product.
The line under the price, everywhere at once
The same line appears on category pages, search results, brand pages and related-product strips, from one template, so a shopper browsing never clicks through to be surprised. No theme file is edited to get it, which is also why a heavily customised theme can end up without it.
What the shopper agrees to
The date, the terms and the button’s own wording, shown before the basket rather than at it, and all three yours to reword per language. The third sentence is the one restriction a shopper can hit: a deferred pre-order is checked out on its own, because an order carries one payment method.
What is owed, and what it refused to do
The stock landed and did not cover everybody, so nothing was emailed. The two orders sit in Ready to notify with the shortfall spelled out in red and a button that sends anyway. That is the whole of the rationing policy: there is none, and the decision is handed back with the number in front of you. The last table is the audit: the status Pre-Order would have named, beside the status the order is really on.
The page the link opens
No login and no account: the single-use link is the identity, which is what lets a guest pre-order like anybody else. The notice at the top is the guarantee: the order is replayed exactly as it was committed, at the price it was placed at, and nothing is recalculated. The link is dead at the end of its window whether or not your host ever calls OpenCart’s scheduler.
Product Configurator, screen by screen
A writing desk that comes in oak or aluminium, where half the questions only apply to one of them. Two screens: the two rules that say so, and a customer meeting them.
What Product Configurator is says what it does and what it does not; this is what using it looks like.
Where a rule is written
A tab on OpenCart’s own product form, saved by that form’s own Save button. There is no second screen and no second save. The two rules differ in their target on purpose: the first takes away a whole option, the second takes away one value, Brass, and leaves the rest of Handle finish standing. That second shape is the compatibility case, and it is the one a list of parts needs.
The same two rules, from the customer’s side
Aluminium is picked, so Wood stain has gone and Brass has gone with it. That happens as the customer clicks, with no reload, on the page the store’s own theme draws. The swatches are not a second feature to configure: OpenCart already held an image on each frame value, and this draws it. What the picture cannot show is the half that matters: add this to the cart with a hidden answer forced in and OpenCart’s own validation refuses it.
These are photographs of the admin screens, not mock-ups. Each set was taken against a store built for the purpose by a command in our repository, which asserts what is on the screen before it takes the picture, and throws the store away afterwards.