Ackeemeter
A booking site for Jamaican tourism where a visitor can plan a whole multi-stop trip (airport transfer, stay, tours and adventures) from many small local operators and book every leg in one go, while those operators take and manage the bookings from a plain, phone-friendly dashboard.
- Two-sided
- operators take bookings; travellers self-plan whole trips
- 8 kinds
- tours, stays, transfers, rides, activities, attractions, rentals, events
- Whole island
- every parish is a first-class field, not just the resort strips
The problem
Most of Jamaica's tourism isn't the big resort strips. It's a scatter of small, often unmarketed operators (farm-tour guides, airport-transfer drivers, guesthouse and villa managers, rafting and ATV outfits, event promoters) who sell over WhatsApp and by phone. A visitor who wants a real island trip has to find and book each one separately, and an operator in a small parish is hard to find at all. There's no single place to plan a whole multi-stop trip and book every leg, and no simple tool a non-technical operator can run from their phone to take those bookings.
What it does
Ackeemeter is a public marketplace of Jamaican tourism services across every parish, grouped by eight kinds: tours, stays, transfers, rides, activities, attractions, rentals and events. Each listing has a price in Jamaican or US dollars, a detail page and a public booking page, and the explore page is live and browsable today.
For travellers it's a trip planner. A visitor adds services from different operators into one day-by-day itinerary and books the whole thing at once. The system prices each leg itself and confirms the bookings across all the separate businesses together: either every stop is booked or none is, with a real booking code for each operator.
For operators it's a dashboard with deliberately plain-English navigation (home, bookings, your listings, guest forms, partners). An operator can list and manage services, take bookings and move them through their stages, build custom guest forms (a flight number, dietary needs, a waiver) for a specific service or guest, and set up partnerships that let one operator offer another's service as an add-on.
Agencies and planners can compose an itinerary for a client, share it as a clean public link with contact details stripped out, and turn an approved plan into real bookings.
Key features
Plan a whole trip, book it once
A visitor plans a Jamaica trip airport-to-airport from many small businesses and books every leg in a single action, instead of chasing each operator over WhatsApp.
Every stop booked, or none
The trip is confirmed across all the separate operators together, so a traveller never ends up with half a trip because one leg quietly failed.
A dashboard an operator can actually use
Plain-English screens let a non-technical operator take and manage bookings from their phone, with no jargon to learn.
Guest forms that fit the service
Operators collect exactly what a booking needs (a flight number, dietary needs, a waiver) per service or per guest, instead of a run of back-and-forth messages.
Operators sending each other business
One operator can offer a partner's service as an add-on, like a stay offering an airport transfer, so small businesses refer work to each other.
Shareable agency itineraries
A planner sends a client a clean, private trip link and turns it into real bookings once approved, without leaking any operator or lead contact details.
Where it stands
Ackeemeter is live and works end to end, but it's an early-stage showcase deployment filled entirely with seeded demo listings: it hasn't onboarded real operators or travellers yet, it takes no in-app payments (payment is off-platform and the money dashboard is still to come), and it deliberately charges no fees for now.
Under the hood: for the technically-minded
How it's built
The code is a pnpm monorepo built around a shared domain core (the fixed value sets, data schemas, ids and money) over a Postgres data layer with Drizzle, plus five services: identity, catalog, booking, itinerary and network. Each service exports plain functions the web apps call directly for fast server rendering, and also runs behind an HTTP gateway at api.ackeemeter.com. The front end is two React Router 7 apps: a warm marketing site and the signed-in platform (explore, the trip planner and the operator dashboard).
A few decisions carry the reliability. All money is stored as whole cents in a named currency, never as floating-point. Every fixed set (the eight service kinds, the booking and itinerary statuses, the pay methods) is a single named type rather than loose strings repeated everywhere. Services return a result value for expected failures instead of throwing, so the HTTP and server-rendered callers handle them the same way. And the Jamaica-timezone day math that both availability and pricing depend on lives in one place, so a booking can't be quoted at one price and then checked against a different day.
Booking is a request-then-confirm model, and payment is handled off the platform for now: the recorded pay methods are on arrival, by invoice, or externally, and there's no card processing yet. It runs on the studio's own servers with Docker via Coolify, and deploys are triggered explicitly rather than on every change.
The hard problems
Booking a trip across independent businesses, atomically
A trip can span several separate operators, so confirming it has to book every leg or none. This surfaced a subtle production bug where the server bundle loaded a second copy of the Postgres driver, which quietly downgraded transactions to per-statement autocommit and broke atomicity. The fix was to force a dedicated pooled connection per transaction rather than trust the driver's own instance check, verified by tests and by a live rollback-then-retry booking.
Never letting price and availability disagree
The capacity re-check at booking time and the price quote both depend on the same Jamaica-timezone day bucketing. Centralizing that logic in one module, imported everywhere, means a booking can't be priced for one day and then capacity-checked against another.
Public sharing without leaking private details
Itinerary links and public booking pages resolve friendly slugs to internal ids on the server and strip operator and lead contact details from what they return. These paths were checked by adversarial security reviews for the usual cross-object, forgery, redirect and price-tampering holes.
Built with
- React Router 7
- Hono
- Postgres
- Drizzle
- pnpm monorepo
Building something in this space?
Work with us →