This commit is contained in:
2026-09-01 13:05:37 +05:30
parent 22c9f45b44
commit 9b24d9ec09
4 changed files with 309 additions and 12 deletions

View File

@@ -49,6 +49,24 @@ export interface SetupStep {
href: string;
/** A real count, when there is one worth showing. */
detail?: string;
/**
* Why this step is worth doing — the consequence of not doing it.
*
* Every one of these is a failure somebody has actually had on this platform,
* not a generalisation. A merchant who understands that an unpriced product
* cannot be rung up does the work; one told to "complete step 5" does not.
*/
why: string;
/** The actual actions, in order. Short enough to follow without re-reading. */
how: readonly string[];
/**
* The trap.
*
* Optional, and only present where there IS one — a gotcha invented to fill a
* field teaches people to stop reading them.
*/
gotcha?: string;
}
export interface SetupInput {
@@ -72,6 +90,16 @@ export function setupSteps(input: SetupInput): SetupStep[] {
return [
{
id: 'profile',
why:
"Shoppers see your photo, name and licence before they see a single product. An FSSAI or trade licence is a display requirement for a food business — and across every shop on the platform not one had entered it, because until now nothing could save it.",
how: [
"Add a shop photo — the picture shoppers see beside your shop",
"Enter your FSSAI or trade licence number",
"Write a line about what you sell",
"Check the phone and address below are still right",
],
gotcha:
"A field left blank is not changed. Saving will never erase something you did not fill in.",
title: 'Complete your shop profile',
todo: 'Add your shop photo and licence — this is what shoppers see.',
cta: 'Add your shop details',
@@ -80,6 +108,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'people',
why:
"Every branch needs somebody who can sign in and run it. Adding people first is what lets you choose who runs a shop, rather than accepting a login named after the building.",
how: [
"Users & access, then Add person",
"Their email is how they sign in",
"Leave the shop as “Not at a shop yet” if their branch does not exist",
],
gotcha:
"You never issue a password. They set their own the first time they sign in.",
title: 'Add your people',
todo: 'Add whoever will run your shops. You can add them before a branch exists.',
cta: 'Add a person',
@@ -91,6 +128,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'branch',
why:
"Stock, prices and the sales ledger all hang off an outlet. Nothing can be sold until there is one to sell it from.",
how: [
"Choose who runs it from the people you have added",
"Set the address and opening hours",
"Set the delivery radius — it decides which addresses the app will serve",
],
gotcha:
"Pick a person. Leave it blank and a login is created named after the shop, on the shop email — and everyone at that counter shares it.",
title: 'Open your first branch',
todo: 'Commission an outlet and say who runs it.',
cta: 'Open a branch',
@@ -100,6 +146,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'products',
why:
"An empty catalogue is an empty shop. Nothing else in this list can be done until there are products to price and stock.",
how: [
"Inventory ▸ Catalogue to pick from the shared catalogue",
"Or Inventory ▸ Upload sheet for your own list",
"A sheet needs a product name; price and opening stock are read if present",
],
gotcha:
"An uploaded sheet goes to the catalogue service for review first — usually a few hours. It is queued, not stuck. When it finishes you still press “Put on the shelf” to price and stock it.",
title: 'Get your products in',
todo: 'Import from the catalogue, or upload your own spreadsheet.',
cta: 'Add products',
@@ -117,6 +172,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'priced',
why:
"A product with no price cannot be rung up at a till, and one that has not been released reaches no shop at all. Both look identical on the shelf.",
how: [
"Inventory ▸ Products, starting with the rows marked “Not ready”",
"Each row says what is blocking it",
"Set a price, then release",
],
gotcha:
"Releasing sends a product to EVERY branch you run. Each keeps its own price — releasing several together will not overwrite them.",
title: 'Price and release them',
todo: 'A product with no price cannot be rung up, and one not released reaches no shop.',
cta: 'Price and release',
@@ -128,6 +192,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'stocked',
why:
"The app shows only what you actually hold. A priced, released product with a balance of zero is invisible to shoppers.",
how: [
"Inventory ▸ Stock",
"Record what is on the shelf now",
"A branch asks head office for more through a stock request",
],
gotcha:
"Stock is counted per outlet. Ten cases at one branch does not make the product sellable at another.",
title: 'Put stock on the shelf',
todo: 'Record what you actually hold — nothing sells at a balance of zero.',
cta: 'Add stock',
@@ -139,6 +212,15 @@ export function setupSteps(input: SetupInput): SetupStep[] {
},
{
id: 'onsale',
why:
"This is the finish line: a shopper can find the product and buy it. Three things have to be true at once, and a product can look perfect while failing one.",
how: [
"It has a category — without one the app cannot list it at all",
"It is on this branch’s shelf",
"Its stock balance is above zero",
],
gotcha:
"Category is the one that catches people. A product priced, released and stocked but filed under no category is invisible to every shopper.",
title: 'See it in the app',
todo: 'Once a product is priced, released, stocked and in a category, shoppers can buy it.',
cta: 'Check the app view',