A grocery personal-shopper service in Camden County, Georgia, built end to end —
site, intake, backend, automated shopping lists, confirmation emails. The record
below is not a list of features. It is a record of how many times finishing
one thing sent the work backwards into something already called done — and
why the founder kept choosing that over shipping sooner.
Business Aisle Ally, a service of LlessuR Is More LLCBuilt by Zhane RussellSpan 8 days
Get to step seven. Go back to four. Refine three. Come forward carrying both.
That is the shape of this build, and it was deliberate. Every phase below moved
the business forward and, in doing so, exposed something wrong or unfinished behind
it. Nothing was left for later. The pattern repeats eleven times.
00
A standing instruction: argue with me
Before any code, one rule was set — don't just agree. An advisory
persona was defined with four modes: mentor, startup advisor, execution coach,
fractional CFO. The founder's explicit note, revisited whenever the advice got
too comfortable: encouragement that isn't earned is worthless.
That instruction is why most of what follows exists. A more agreeable process
would have shipped in two days and broken in front of customers.
01
A backend for a site that had no backend
The landing page was a single static file with nowhere to send an order. The
answer was a Google Apps Script web app: form submissions land in a private
spreadsheet, screenshots upload to Drive, every order gets an ID.
No admin panel was built, because none was needed — the private
spreadsheet is the admin panel. One person approving orders by hand
doesn't need software to do it.
02
Proof, not promises
The pricing section was built around a real receipt from a real trip — shelf
prices against a delivery app's marked-up version of the same cart.
An early draft used an invented example: "a typical 25-item cart." The founder
asked one question — where did 25 come from? It came from
nowhere. It was a plausible midpoint dressed as a fact. It was cut, and replaced
with photographs of an actual 19-item cart.
Then the arithmetic in the comparison column didn't balance. His own screenshot
of a real order explained the gap: a waived delivery fee. The receipt was
corrected to match the world rather than the argument.
03
One price becomes four
A single $25 service grew into a ladder: two standard tiers and two live
in-store tiers where the customer joins by video call while the shopping
happens. The live shop is the part a delivery app structurally cannot copy.
Sent the work back to01 — the spreadsheet's service labels, the form's dropdown, and every
automated routine that read them. 02 — the proof receipt now described
a tier that no longer existed alone. A pricing change is never only a pricing
change.
04
Going public, and nearly losing the mail
A domain, a business phone, a business email address. Connecting the domain to
the host offered a one-click path: delegate the nameservers, done in seconds.
Checking the destination zone first showed it held two records and no
mail configuration at all. Taking that one-click path would have
silently deleted the business email — no error, no warning, just mail that
stopped arriving. External DNS was used instead.
Sent the work back to02 — every social preview card, meta description and canonical link
still pointed at the old temporary address. The proof section had to be
re-rendered into a new preview image so a shared link showed the real prices.
05
Saying no to bookings, gracefully
Four time windows a day, two orders each. The site now counts existing bookings
and greys out full windows, with a manual override sheet for days blocked by hand.
Both checks fail open on purpose. If the availability lookup
breaks, every slot stays selectable and conflicts get caught during manual
review. A form that silently refuses bookings costs far more than one that
occasionally lets through a slot that has to be moved.
Sent the work back to01 — the backend needed a second job it was never designed for: answering
questions from the website, not just receiving from it.
06
Where the money actually moves
The payment structure was stress-tested line by line. The founder never fronts
money: the customer's funds land before anything is bought. But one step had a
hole in it — standing at a register with a full cart, waiting on a stranger to
look at their phone.
That became a 15-minute window, plus a pay-in-full option for
customers who know they'll be unreachable. Cash was refused outright, and the
reasoning was the founder's: cash invites haggling, change-making and disputes,
and leaves no record.
Sent the work back to02 and 03 — the policy cards, the pricing notes, and the whole
payment section of the confirmation email had been written around a rule that
no longer applied. A no-show used to forfeit the deposit; now the deposit is
refunded and only the service charge is kept.
07
One word, and the receipt fell apart
The founder decided his own pricing should read "service charge,"
never "fee" — reserving fee for the delivery apps, because that is the
word people associate with being nickel-and-dimed. Keeping "fee" on their side
of the comparison and "charge" on his sharpened the contrast the entire page is
built on.
Renaming it meant reading every line again. And reading every line again exposed
something that had been sitting on the most persuasive element of the site for
days: the proof receipt showed a $25 service charge against $228.95 of groceries
— an order nobody could actually book, because $25 caps at $150.
Service charge $25.00 → $40.00
Total $260.82 → $275.82
You keep $47.87 → $32.87
Correcting it cost fifteen dollars off the headline savings figure. He took
the smaller number without hesitation: "we're about legitimacy over here."
Sent the work back to02, 03 and 04 — the receipt, the pricing ladder, the policy
cards, the hero line, the confirmation email, and the social preview image, which
had the old savings figure baked into it and had to be re-rendered.
08
The failures that never announced themselves
With the business apparently finished, testing began in earnest. Four bugs
surfaced that had been live the entire time — every one of them silent.
Text extraction had never worked. Not once. The code called a
Google API using the previous version's syntax. It threw an error on every
single order, and a safety net designed to stop a failed scan from blocking a
customer's order swallowed the error completely. The column sat empty for a week
and looked like a feature nobody had used yet.
Photos arrived sideways. Phones store the camera's raw pixels
plus a tag saying which way to turn them. Every photo app obeys that tag; the
text scanner does not. It was reading rotated handwriting and returning things
like reen beans for Green beans.
Only one screenshot ever arrived. A file input replaces its
entire selection each time the picker opens — so choosing images one at a time
silently discarded all but the last, with nothing on screen to say so.
The calendar had 67 duplicate bookings. One test order existed
sixteen times. The duplicate check searched for existing events without a date
range, and that search only looks forward — so any order whose date had passed
was invisible to it, and a fresh duplicate was created every hour, all day, for
five days.
orders dated in the past up to 16 copies each
orders dated in the future exactly 1
A clean split with no exceptions — which is what turned a theory about the
cause into a diagnosis.
Sent the work back to01 and 05 — the backend, the intake form, and both automated
routines. Every one of these had been written, reviewed, and marked done days
earlier.
09
Two lists, two different readers
Once text extraction worked, it produced something ugly: a cart screenshot
scans into a mess of product names tangled with interface text — buttons,
promotions, prices, quantity steppers.
The instinct was to clean it up at the source. The decision was the opposite:
the raw scan stays raw forever, as the unedited record.
Cleaning happens twice downstream, for two people who need opposite things.
The customer gets product names only, in their confirmation
email — and if the scan is too damaged to trust, the system refuses to guess and
says it will work from the photo instead. Nobody's groceries will ever be listed
as "Go to checkout."
The founder gets the opposite: a prep document written to Drive
and linked from the calendar booking — items grouped by store department so the
store is walked once, with sale prices, deal markers, checkboxes, and the raw
scan underneath so anything suspicious can be verified in seconds.
items extracted from 3 screenshots $125.15
total printed on the customer's cart $125.15
difference $0.00
The extracted prices summing exactly to the customer's own total is proof the
list is complete — and it required noticing that items appear twice across
screenshots when someone scrolls while capturing. Counting those twice would
have produced $135.67.
Sent the work back to06 — the confirmation email was rewritten again, this time to know the
difference between a clean scan, a damaged one, and no list at all.
10
Fifteen seconds, and five ways to get it wrong
The site made one claim it could not prove: that a real person reading a shelf
is different from an app sending a substitution notice. Footage existed. Putting
it on the page took five passes.
4 min, full quality 149.0 MB ~23 plays/day before the free tier ends
40 sec 25.9 MB
15 sec 10.2 MB ~336 plays/day
The founder's own edit solved both problems at once: cutting to fifteen
seconds made the file small and made it better. "It actually made the
video more viewable, straight to the point."
Then: an export that was a QuickTime file wearing an MP4 name, which half of all
browsers refuse to play. A vertical phone video laid out full-width, which had to
move into a narrow column. A file that uploaded correctly but landed as
aisle-ally-shop.mp4.mp4 — a doubled extension hidden by the operating
system, found by the founder reading the deploy log after a remote check had
wrongly concluded the file was missing.
And finally: the clip only started playing after you scrolled past it.
The proposed fix was a line of small print telling visitors to scroll down and
back up.
That line was rejected, and the reasoning is the sharpest thing in the whole
build. A workaround written into the page becomes permanent.
Instructions teach customers that the site needs handling. The playback was
driven explicitly instead — starting 200 pixels before the clip reaches the
screen, pausing when it leaves, and falling back to tappable controls on phones
in low power mode, which refuse autoplay outright.
Sent the work back to04 — the deployment process itself, which had already caused a stale
version of the site to sit live for hours while everyone looked at the wrong
cause.
What the pattern actually was
Four things worth pulling out for anyone telling this story.
One
Every step forward exposed a step behind
Not once as an accident — eleven times, as the method. The
pricing ladder broke the receipt. The domain broke the preview cards. One word
change broke the most persuasive number on the site. Real testing broke four
things that had been marked finished days earlier.
Each time the choice was the same: go back, fix it properly, carry it forward.
Never leave a known flaw behind and never write a note explaining it.
Two
Every claim that couldn't survive a skeptic got cut
An invented item count. An unqualified "zero damaged" statistic. A tax claim
contradicted by his own receipts. A phrase about not wanting your groceries,
rejected because writing it plants the idea. The words "secure card link,"
killed on sight — "that sounds like automatic scam."
And a savings figure cut by fifteen dollars to keep the receipt honest. Same
filter every time: never make a statement a skeptic could fairly
contest.
Three
Nothing that broke ever said so
Text extraction failed on every order for a week and produced an empty column.
Photos arrived rotated and produced plausible-looking nonsense. Screenshots were
discarded with no message. Duplicate bookings were reported hourly as ordinary
activity.
Every one was found by using the thing, not by reading the code.
A launch three days earlier would have found all of them the same way — in front
of the first three customers, who are people he knows.
Four
The delay was the product
The founder's own framing, and the honest ending: validity is internal —
proof to yourself the thing you conceptualized got built to standard.
Confirmation is external — money saying it works. Both are needed. Only
one can be achieved alone.
For eight days he built the half he could reach. It is finished. What is left is
the half that requires other people.
"If I would've did it before, they would've ran into issues uploading their list.
I would've had a issue reading their list."