Skip to content
In production · Tatuapé, São Paulo

A corner shop from 2005
with its whole shelf online.

Bendito Coco has been cracking coconuts to order on Rua Tuiuti for twenty-one years. The problem was never the coconut — it was the supermarket queue at seven in the evening. The shop went online with the whole shelf: 78 products, 10 sections and own-fleet delivery to 26 neighbourhoods across São Paulo, within 15 km of the shop.

My role
Engineering, platform and data
Design
Brave (@leorossigomes)
Model
E-commerce with own-fleet delivery
Stack
Next.js App Router · Cloudflare

benditococo.com.br — live, with real prices and real stock.

The problem

Being very good at one thing doesn't close the weekly shop

The shop started in 2005 as a chilled green-coconut stand near the metro. Same scene every day: people heading home from work, buying a coconut, and asking whether there was also bread, milk, anything that saved them a trip to the supermarket. The shelf kept growing until it became a grocer's, and in 2022 the coconut-milk press arrived — the house line stopped being a label and became something made out the back.

Taking that online carries a difficulty an electronics shop never faces: freshness can't be proven in a photograph. Someone buying coconut water for the first time from a new site has no way of knowing whether it will arrive cold, whether it came from concentrate, whether sugar was added. Trust is the product — and it had to fit on a screen.

A catalogue that won't fit a shop window

Coconut across five sections, plus produce, bakery, chilled goods, dry groceries and drinks. Ten sections that have to coexist without turning into a hypermarket.

Freshness with no proof

“Selected” and “premium” mean nothing. Without origin, date and temperature it is only an adjective.

Own delivery, short window

Four distance bands, from 45 minutes to two hours, motorbike and bicycle, 26 neighbourhoods. There is no courier to blame when the coconut arrives warm.

Architecture

Catalogue at the edge, cart in the browser

Product and category pages are rendered and served from Cloudflare's edge — opening the shop gets you finished HTML, not a skeleton that only becomes a shop after the JavaScript lands. The cart lives in the browser itself, under a versioned localStorage key. There is no server session and no cookie for the cart: close the tab, come back tomorrow, same basket.

Bendito Coco architecture in three layers The browser holds the cart and the postcode. Cloudflare's edge serves the rendered catalogue and the checkout. The third layer is not a database: it is the physical operation — four cold rooms, the press and own-fleet delivery. BROWSER Cart versioned localStorage Postcode do we deliver here? Club price on the spot Free shipping how much is left EDGE · CLOUDFLARE Catalogue 78 products, 10 sections Recipes become a basket Checkout 4 steps, no account Product JSON-LD per item THE SHOP · RUA TUIUTI 4 cold rooms · 2–6 °C Coconut-milk press Own delivery · 26 areas · 45–120 min Bendito Coco architecture in three layers The browser holds the cart and the postcode. Cloudflare's edge serves the rendered catalogue and the checkout. The third layer is not a database: it is the physical operation — four cold rooms, the press and own-fleet delivery. BROWSER Cart versioned localStorage Postcode do we deliver? Club price on the spot Free shipping how much is left EDGE · CLOUDFLARE Catalogue 78 products, 10 sections Recipes become a basket Checkout 4 steps, no account Product schema per item THE SHOP · RUA TUIUTI 4 cold rooms · 2–6 °C Coconut-milk press Own delivery 26 areas · 45–120 min
The third layer is not a database. It is a cold room, a press and a bicycle — and it is what decides whether the first layer's promise is true.
Decision records

Five choices and what each one cost

Every architectural decision has a consequence. Recording only the upside is marketing, not engineering.

01

Checkout with no account and no password

Situation
The typical buyer is a neighbour, buys on impulse in the late afternoon and wants cold coconut within the hour. Every required field between basket and order is a chance to give up.
Decision
Four steps — identification, address, delivery, payment — asking for name, e-mail, mobile and an optional tax ID. No account, no password, no e-mail confirmation before buying.
Cost
Without an account there is no order history and no saved address on the server side: a returning customer types the address again. The trade was deliberate — the shop would rather lose the convenience of the second order than lose the first.
02

A paid club, with the member price shown before you join

Situation
Supermarket loyalty is usually a card nobody can find at the till, or a subscription that only pays off for people who do the maths.
Decision
Clube Bendito costs R$ 19.90 a month, and the member price already appears on the product card next to the full price, on 25 items — for non-members too. The shop publishes the arithmetic alongside it: 7.3% average discount on those items, and R$ 273.00 of monthly shopping for the fee to pay for itself. You see the difference, and the break-even, before deciding to join.
Cost
Two visible prices on one screen is more for the eye to process, and it forces the interface to explain “in the club” on every card — including to people who will never subscribe, who now see a better price that isn't theirs. In exchange, the discount stops being a promise and the is-it-worth-it calculation sits outside the funnel, where the customer can check it.
03

A whole page for what the shop refuses to sell

Situation
Freshness can't be proven in a photo, and every food site claims to be fresh. An adjective differentiates nobody.
Decision
Publish the list of 21 barred additives and practices, with the E number where one exists — the same code printed on the packaging, so the customer can check without asking. Alongside it go the five origins with town and state, the four-day maximum between harvest and cold room, and the 2–6 °C range.
Cost
It is a permanent constraint on the range: every new supplier now has to clear a public list, and quietly loosening the rule is no longer possible. That was the point — the restriction became the sales argument.
04

Cart in the browser, not in a server session

Situation
A session cart needs a stateful server, a cookie and an identity to hang the session on — three things a corner shop does not need to run in order to sell coconuts.
Decision
The cart lives in localStorage under a versioned key (bc.cart.v1), with the version inside the data itself. When the shape changes, the code knows what it is reading instead of breaking on an old object.
Cost
The cart does not follow you across devices: what you built on the phone is not on the laptop. For a neighbourhood shop settled in minutes the cost is low — and in exchange there is no server state to leak, and the cart depends on no cookie.
05

Unit pricing on everything, and suppliers by name

Situation
The same product comes in 300 ml, 1 L and a 5 L jug. Comparing in your head is the customer's job, and in that job the apparently cheapest is often the dearest per litre.
Decision
Almost every card shows price per litre or per kilo — the exceptions are the ones sold by the piece, where there is no unit to compare. And the name of whoever produced it sits above the product name, including when it isn't the house: Dona Zilda, Padaria Santa Clara, Sítio do Vale.
Cost
Giving outside suppliers the stage weakens the house brand on some cards, and unit pricing sometimes reveals that the big pack is not the better deal. Both effects are the price of being checkable.
Current state

Where the shop is

78
products in the catalogue
10
sections, coconut to groceries
26
neighbourhoods with own-fleet delivery
21
barred additives and practices, named and numbered

It is all live: catalogue, search, categories, the week's offers with a flyer, recipes that drop their own ingredients into the basket, reviews from verified purchases, back-in-stock alerts on sold-out items and a postcode check before you start filling the basket. Payment goes through Pix, card, or cash on delivery.

What isn't here: sales figures, margin, acquisition cost and the contract. A client's shop in operation doesn't publish its till — and this case study exists to show engineering decisions, not somebody else's revenue.

Transfer

What can be reused

A neighbourhood catalogue looks nothing like a B2B SaaS, but both projects solved the same kind of problem: put authority where it can be verified, and take state out of where it doesn't need to exist.

  • A catalogue with variants, unit pricing and stock, served finished from the edge — no application server in the path.
  • A versioned client-side cart that survives a format change without breaking the order of whoever was mid-basket.
  • Stepped guest checkout, with the order summary always visible alongside.
  • Member pricing computed and shown next to the full price, with the break-even arithmetic published beside the fee.
  • Per-product structured data with brand, SKU and offer — what makes an item show up with its price in search results.
  • A public standards page: turning a business constraint into a checkable argument instead of an adjective.
Next step

Got a shop your website can't show?

Thirty minutes is usually enough for me to say whether it's my kind of problem — and, if it isn't, to point you at someone who solves it.

← See the other projects