Case study2026
A bookshop with three locations, 3,538 products and a till that
Twelve days from the first line of code to launch, without migrating the operation. Santo & Seña got a site that looks like the house, while WordPress kept running the shop, the invoicing and the point
- Client
- Santo
& Seña - Location
- Bogotá, Colombia
- Live since
- September
10, 2026 - Services
- E-commerce
- UI/UX Design
- Web Development
- SEO

(01)
A new site, without touching the operation.
Santo & Seña is a bookshop and record store in Bogotá with three locations and a catalogue of 3,538 products. Its operation (inventory, invoicing, point of sale) lived on WordPress and WooCommerce, and it worked. What didn’t work was the face: the site was the usual WordPress theme, slow to load and foreign to what the
The brief wasn’t “rebuild the shop”. It was harder: make a new site without touching the operation. The till couldn’t stop invoicing for a single day, and the 6,115 addresses Google had already indexed couldn’t


(02) The
There was no maintenance window.
WordPress wasn’t migrated, switched off or frozen. It stayed as the engine. On top of it we built a bridge: the new site serves what it knows (catalogue, product pages, events, blog, search) and asks WordPress for the rest behind the scenes. Checkout, customer accounts and the admin keep coming from WordPress, on the same domain, with no
- 01Launch with no risk to
the till On launch day invoicing stayed exactly the same, because nobody touched the systemthat invoices. - 02Roll back in
five minutes The rollback plan was a DNS record with a 300-second TTL, with the previous alias and CNAME written down, name and value, next to the rest ofthe launch. - 03Keep
the SEO The 6,115 live addresses are honoured with permanent 301 redirects, which pass the old page’s authority to the new one instead of leaving themto compete.
(03)
Six decisions and what they cost.
A case study without trade-offs is a brochure. These are the decisions that carry the most weight, with what
- 01
Music is precomputed, not
resolved live WooCommerce doesn’t know which artist each record is. Matching every product against Discogs, MusicBrainz and iTunes happens overnight and is versioned in the repository. Cost: a generated file Git can’t merge. Result: 102 records resolved, 48 vinyls playing on the
site’s turntable. - 02
Search runs in
the browser Searching 3,538 products live meant one request per keystroke against a shared server. The index is built at compile time instead. Cost: 830 KB downloaded once, weighed against a search box that sometimes
doesn’t answer. - 03
In-house analytics that
identify nobody A counter on Upstash Redis, no cookies, no personal data, and a private panel. No funnels or attribution, but it shows what no third-party tool can: what people searched for and
didn’t find. - 04
The shop iPad is its
own piece The iPad where customers listen to records isn’t a smaller screen, it’s another problem: no links, everything by touch, and it resets itself for the next customer. Cost: code duplicated
on purpose. - 05
Everything rotates by the day, not
at random Categories, new arrivals, the record of the day and the featured location rotate by the day number in Bogotá. Everyone sees the same thing the same day; whoever comes back tomorrow finds
something else. - 06
Three scheduled jobs, one allowed
to fail Catalogue (daily), monthly report (daily) and health (13 checks, eight times a day). A fourth one ends in red on purpose when a hand-written list points to something
sold out.





(04) What
Three hard weeks, documented with the measurement that closed them.
- 01The hosting mistook our own traffic for
an attack Product pages started failing, and so did the point of sale. A temporary diagnostic route proved the block depended on where the request came from; with that, the provider found our requests in its own logs and lifted the protection. What stayed: a direct door for the team, a smarter health check and aone-page runbook. - 02The network budget was longer than the
function’s deadline One in 25 product pages failed on first visit, always at 15 seconds: the code gave each query 20 seconds, the platform killed the function at 15. Fix: six seconds per query and a 30-second deadline on the busiest routes. Twelve random cold pages afterwards: all between 0.17 and1.87 seconds. - 03The bill doubled, and the culprit wasn’t the
obvious one Image optimisation was 82 cents out of 23 dollars. 88% of the bill was 117 production deploys in thirteen days, plus link prefetching that rendered the uncached shop page once per filter option. Prefetching is now off where it costs and on where it’s free: from 35 prefetches on the home page, 9 uncached, down to 24,none uncached. - 04Three regressions, reverted the
same day Trimming image widths broke pages already cached in browsers, measuring too hard tripped the build twice, and the publish guard kept a bad version for two hours. The health check now verifies the home page’s sections, not just thatit answers.
(05)
A directed AI agent, not an automatic one.
Of 343 commits, 239 were written by an AI agent and 80 by the studio. That explains the pace, and also the limits. Every decision is documented in the code itself, and every diagnosis was closed by measuring, not
What didn’t work: verification needs the same discipline as development. And human direction isn’t optional: the most valuable decisions (not migrating, the bridge, in-house analytics, the iPad as its own piece) came from the business, not from
(06) Where it
Sixteen days in production.
The music catalogue regenerates every night, the monthly report builds itself, the home page recomposes with what arrives at the shop, and health is checked eight times
- 12Days from first commit
to launch - 6,115Indexed
addresses preserved - 13/13Health
checks passing
Pages respond in 0.18 to 0.66 seconds. Cold product pages load in 0.17 to 1.87 seconds, with no failures. Across nine pages, 1,755 of 1,755
images verified.

(07)
The work isn’t closed, and the case doesn’t pretend it is.
- 01Degraded
catalogue mode Serve yesterday’s data, with a notice, when the back-office doesn’t respond. It’s the root of most incidents inthis period. - 02Cache the
shop page It’s the only purchase page that is drawn from scratch onevery visit. - 03Turn the data
into action The panel already shows what people searched for and didn’t find, and what they left in the cart. Next: a mailing list of their own and a “back instock” alert.
Front end
Next.js 16, React 19, Tailwind CSS 4, TypeScript on Vercel. Eight direct dependencies: no component library, state manager
Back office
WooCommerce on WordPress (Hostinger), not migrated. Point of sale: Pliego, the client’s own plugin, invoicing
Data & automation
Upstash Redis for sessions and analytics. Discogs, MusicBrainz and iTunes for the catalogue. GitHub Actions for three
Your operation works, but your site doesn’t look like you?
We can build the new face without touching what keeps the business running. That’s what