TropicfyProduct Design

Ops console app

Platform
Mobile-first web app
Role
Solo PM, Product Designer, AI-Native Engineering
Culture
AI-first, Prototype-first
Stack
Next.js, GitHub, Supabase, Vercel
Timeline
4 weeks
Ops Console — internal operations platform for Tropicfy, showing a tour's single guide payment and its price breakdown on mobile

Profitable tours went from 0 to 30. The Ops console prices every Tropicfy tour from its real cost, sets a single payment per guide, and replaces the operation's manual processes. I owned the product, design, and production build — AI-first with Claude, in four weeks.

The problem

Nobody knew what a tour cost.

At Tropicfy every tour is run by an independent guide, not staff, and each one names their own rate when a booking comes in. The customer's price came from the same blind spot: set from experience, not from real cost.

First it cost money. Then it cost time.

Without real fixed costs behind the price, the business lost money. When the loss was big enough, the tour was canceled — and a bad review came with it.

The missing system cost time too. Every booking assignment carried a calculation in the middle to decide whether the tour was worth operating.

"How do I price a tour when its cost is a different number for every guide?"
The solution

First the cost. Then the price.

The fix started with a sibling guide-facing micro-app I built as a project of its own, to collect, in a structured way, what every guide charges to operate Tropicfy's tours.

The console averages those rates into one fixed payment per tour and modality, and prices each tour from that cost. Finding a guide, reaching them and knowing what to pay now happen in one place.

Anatomy of a booking, before this console
Pricing
Set from experience, not cost
Booking
Arrives through GYG or the website
Guide
Asked what they charge
Margin check
Calculated by hand, tour by tour
Finding
Turns out there's no margin
Outcome
Canceled, or run anyway for the review
Pricing
Set from experience, not cost
Booking
Arrives through GYG or the website
Guide
Asked what they charge
Margin check
Calculated by hand, tour by tour
Finding
Turns out there's no margin
Outcome
Canceled, or run anyway for the review
Design decisions

Rules that live in the product, not in the training.

A feasibility spike set the scope

Eight problem statements came out of the interviews; half needed bookings into the console. Pulling them from the booking system required one price per tour on every platform, so pricing and booking assignment came first; bookings moved to MVP2.

Decision 01

Only the buy rate is real

Tropicfy holds dollars; some guides are paid in colones. The console uses the central bank's buy rate — the lower of its two rates — so a payment never costs more than the dollars cover.

Decision 02

Contact lives in the guide's row

Reaching a guide meant a Google Sheet and contacts scattered on a phone. WhatsApp, call and copy now sit in the guide's row — three manual steps down to none, name still attached.

Decision 03

Two margins, kept in sync

GetYourGuide keeps 30%, Bokun (website) keeps 2% — one price can't come from one margin. The console holds two, tied together: edit either one and the other adjusts, and all 30 prices recalculate.

Decision 04

The rack only builds the benchmark

Guides declare two rates: what they charge clients, and what they charge an agency. We price from the agency rate — the other one only feeds the market benchmark our price is measured against.

Guides tab — destinations with their tour and guide counts, and the data-health panel
Guides · Directory
A tour inside the Guides tab — the single payment, the exchange rate it was converted with, and each guide with WhatsApp, call and copy in their row
1
2
Guides · Tour
A tour inside the Prices tab — the two synced margins, and our price against the market average
3
4
Prices · Tour
Coded prototype

Built AI-first, straight into production.

The prototype was the production codebase from the first commit, built with Claude as the engineer and me making every call. Hardening ran on that same code.

Validation

Nine findings. Two worth fixing.

Two rounds of moderated usability testing produced nine findings, ranked by severity — Only the critical and the serious were fixed; the rest were logged.

Round two closed the critical finding and left the second one honest: the interface now holds the comparison, and what's missing is the habit of using it. That's not a thing another round of testing fixes.

Uses the console's payment without hesitating between it and a guide's own rate
Resolved
Round 1
0 of 2
Round 2
2 of 2
Mentions the market comparison before saving · nobody edits the price directly
Partial
Round 1
0 of 2
Round 2
0 of 2
2 of 2 with one prompt
The payment didn't read as the payment.Resolved
Before: the tour in the Guides tab showed a suggested payment for the guide, with no unit, above each guide's own rack and net rates
BeforeBoth SMEs hesitated between it and a guide's own rate, and the unit was unclear.
A tour inside the Guides tab — the single payment, the exchange rate it was converted with, and each guide with WhatsApp, call and copy in their row
AfterSay what the number is, and pay for it in colour.
The market comparison wasn't working.Partial
Before: the tour in the Prices tab showed our price and the market average in separate cards
BeforeNeither SME used the market comparison, even prompted.
A tour inside the Prices tab — the two synced margins, and our price against the market average
AfterPut our price and the market average in the same block.
Outcomes

Thirty tours priced, and nothing left to calculate by hand.

Four success metrics, each with a counter-metric — written during definition and answered before deploying.

3→0
Manual steps to reach a guide — 2 of 2 reached them from the console
0→30
Tours with a calculated price, in both modalities
always→never
Having to calculate or ask what to pay — observed, not self-reported
1→0
Manual currency conversions per payment
Reflection

AI made it fast. Design thinking made it right.

Working AI-first didn't change the quality of the thinking — it changed the reach. Research, prototype, testing and production belonged to one person, and what came out is a product running, not a file handed off.

Next case study
Customer contact
update app