BackPersonal

Subasta

The auction site I built in one night to sell my things before moving abroad, without becoming a hostage to WhatsApp.

Type
Project · personal
Role
Product, design and build with AI
Year
2026
Status
Live
Link
subasta-leilao.vercel.app ↗
Highlights
About 12 hours, from Atlas to a live site
45 minutes of specification before any code
Bids in Brazilian reais or Argentine pesos
Subasta: preview of the moving sale auction, with photos of a sofa, a kitchen and a shelf

A whole home to sell

I’m moving abroad, and almost everything in my home has to go before I do, from the sofa and the fridge to the bed, the shelf and the coffee machine. I could picture what was coming, with dozens of listings and hundreds of messages in which people ask if it’s still available, ask if I can do less and arrange to pick it up on Saturday, and on Saturday nobody shows up. The way things were heading, I’d spend my last weeks in town haggling over a sofa on WhatsApp.

That’s when I thought the price could sort itself out if I put everything on a site where anyone interested places a bid and the highest bid wins, with no haggling and no back-and-forth, just one last message to arrange the pickup. Since many of the buyers speak Spanish and pay in Argentine pesos, that’s where the name came from, because subasta is Spanish for “auction”.

Three Subasta screens on a phone: the welcome sheet, an item page and the bid form with the bid history

The starting point

Subasta was inspired by a system Gabriel Teixeira built with the same idea, and the problems his ran into became requirements for mine from day one:

  • Alerts. Many people missed knowing when someone outbid them, so here anyone who confirms their email gets the outbid alert and the final-stretch reminders, 48, 24, 2 and 1 hour before the end.
  • Booked pickups. In his system, scheduling came in along the way, while in Subasta it was part of the flow from the start, with the winner picking a free slot and getting a calendar invite by email.

The management side is all mine, designed from the problems I saw in his, and it brings together the pricing logic, the MCP connector that links the Admin panel to Claude to create and edit items in bulk, the skill that runs that flow and a history with undo for everything the AI touches. On top of that came my perspective as a director of product, after working on many products, which is to care for the experience on both sides, for the people bidding and for whoever runs the auction.

Paper first, then screens

Since I’m not a developer, I built all of Subasta in conversation with Claude, and what made it work was not starting with code. Before any screen, I spent 45 minutes writing the product down with Atlas, the documentation method I’ve been testing at work, which always follows the same order:

  1. Constitution. This is where the product is defined along with the rules nothing can break, which for Subasta included “I talk as little as possible” and “money never goes through the site”, and it’s also where the vocabulary gets fixed, so it’s “bid” and never “offer”, “pickup” and never “delivery”.
  2. Objects. These are the things that exist in the system (item, bid, buyer, pickup), each with its own states and rules.
  3. Flows. These are the journeys, like placing a bid or booking a pickup, and they only point to the objects’ rules.

Every unanswered question became a pending decision until I made the call, and nothing went in as a guess, so when the AI went to build it already knew what to do in every case, even two bids landing in the same second.

I started at 3:43 pm, Atlas was done at 4:26 pm and by 9 pm the site was ready, built in five stages that each ended with something working. The tweaks went on into the early hours, and in total it took about 12 hours.

Nothing can block the first bid

The most important moment in an auction is the first bid, because that’s when someone decides to play, so I removed everything that got in the way of it.

A first bid only takes a name, email and WhatsApp number, with no password and no code. In the first version I asked people to confirm their email before bidding, for security, and I soon saw what that did, because someone was excited, one tap away from bidding, and I was sending them off to dig a code out of their inbox.

So I flipped it and turned email confirmation into a trade, where right after the bid the site asks if you want to know when someone outbids you. If you confirm, you get email alerts and unlock the My bids, Pickups and Notifications tabs, which show a padlock until then, and if you skip it you keep bidding as usual, because I wanted the email to feel like a reward, not a wall.

An item page on desktop, with the My bids, Pickups and Notifications tabs locked by a padlock

Coming back later on another device only takes your email and a code, with no password to remember.

Two Subasta screens on a phone: Sign in, with a passwordless email code, and an item’s bid history, with names blurred

The rest of the site follows the same idea of removing friction:

  • The bid comes ready. The field already shows the next valid amount, always round, in steps of 5 reais, and you just tap.
  • Everyone in their own currency. If you think in pesos, you bid in pesos, and the equivalent in reais shows beside it.
  • Sharing is copying. The button just copies the link, which turns into a WhatsApp preview with the photo, current bid and “Bid”.
  • The ending has urgency. In the last 48 hours a banner at the top changes color, and in the last hour it becomes a countdown.
  • The pickup books itself. The winner picks a day and time on the site, and the invite lands in both our calendars.

WhatsApp link preview of an item, with the photo, the highest bid in reais and pesos and the Bid button

The Admin panel: an auction I run on my own

On the buyer’s side the rule was removing friction, and on mine it was not turning this into a second job. I was going to run everything alone, with dozens of items and the move around the corner, so every screen in the Admin panel was designed for me to get things done in a few clicks and move on.

Entering dozens of items by hand would be the first bottleneck, which is why the panel has a connector to Claude, where I describe things in a conversation, the way I’d say them (“grey sofa bed, about five years old, starts at 1,200”), and it creates the drafts with title, description, category and the Spanish version. Then I just upload the photos, which the browser compresses.

Item list in the Subasta Admin panel, with state, starting bid in reais and pesos, number of photos and bids and the Close button

Item editor in the Admin panel, with the photos, the fields in Portuguese and Spanish and the starting bid

When an item closes, it moves to Sales, which works like a to-do list showing who won, whether they’ve booked the pickup and a button that opens WhatsApp with the message ready, in the buyer’s language. If they disappear, I pass the item to the next highest bid with one tap.

Sales screen in the Admin panel, with sold items and buyers covered by grey bars

Since the AI also makes changes to the auction, I needed to know who did what, so the History logs every change with its source (me in the panel, Claude in the chat or the system itself) and an undo button whenever going back won’t hurt a buyer.

Admin panel History, with each change, its source and the Undo button

And everything that applies to the whole auction, like the end date, pickup hours, closed days and the exchange rate between reais and pesos, lives on a single screen, Settings.

Admin panel Settings, with the auction end, pickup hours, the exchange rate and the chat connector

What real use changed

Even with everything specified, the product changed once real people started using it. The Google Calendar integration became an email invite, which solves the same problem without asking for access to anyone’s account, and the pickup slots, which I was going to open one by one, became default hours with closed days marked separately. The friends who tested on their phones found the rest, like the login that dropped when you closed Safari and the field that zoomed in when tapped.

What stayed with me is that writing code is no longer the hard part, because the real time went into the 45 minutes thinking through the rules and the hours watching people use it.