If you run a boutique hotel, an inn or cabinas in Costa Rica and depend 70–90% on Booking and Airbnb, you are giving away between USD 3,000 and USD 7,000 a month in commissions. For a 14-room business billing USD 30,000/month, that is USD 50,000 a year going to OTAs alone.
The solution is not abandoning OTAs — it is adding a properly built direct channel on your own site. A system that takes online payments, syncs your calendar, sends automated confirmations and eventually connects to Booking via channel manager. This guide explains how it is built — stack, payments, calendar, confirmations — with real USD costs for 2026 in CR.
💡 TL;DR: Stack Next.js + Supabase + Stripe + SINPE + WhatsApp Cloud API. Setup USD 3,000–5,000 in 4–6 weeks. Maintenance USD 50–80/month. The 5 features you need on day 1: overbooking-proof calendar, multiple payment methods, automated confirmation, simple admin panel and mobile-first. Channel manager is added when you cross 20 OTA reservations/month.
Why direct reservations (and not just OTAs)
OTAs are discovery channels, not loyalty channels. Booking, Airbnb and Expedia help a new guest find you — but when that same guest wants to come back, they should book directly with you. Without a system on your site, you force them back to Booking and pay commission on a customer who is already yours.
| Metric | Without direct bookings | With direct bookings |
|---|---|---|
| % of reservations via OTA | 85–95% | 55–70% |
| Average commission | 18% | 12% (blended) |
| Acquisition cost per night | USD 22 | USD 14 |
| Net margin per night (USD 120 ADR) | USD 78 | USD 92 |
USD 14 more per night × 14 rooms × 70% occupancy × 30 days = USD 4,116/month extra. Almost USD 50,000/year of recovered margin without raising a single rate. A direct channel also gives you something OTAs never share: guest data (email, phone, preferences) for remarketing and promos to repeat guests.
The typical stack: what we actually use
In 2026, after building 8+ booking systems for hotels in Costa Rica, the stack that gives us the best performance/cost ratio is:
- Next.js 15 (App Router, edge runtime). SSR for SEO, fast by default, mobile-first. 70% of bookings in CR come from mobile — a slow site kills conversion.
- Supabase (managed PostgreSQL + Auth + Storage + Realtime). USD 25/month on the Pro plan, scales nicely to 50,000 reservations/year without changes.
- Stripe (international payments). 3.4% + USD 0.30 per transaction, supports USD and CRC, handles global cards without local gateway hassles.
- SINPE Móvil (local CRC payments). Connected via bank webhook (BAC, BCR, BN) with automated reconciliation. No gateway fees — only the bank's cost (sometimes free under a certain threshold).
- WhatsApp Cloud API (confirmations). USD 0.005–0.015 per message, official from Meta, no ban risk. Pre-approved templates.
- Resend (transactional email). USD 20/month up to 50,000 emails, excellent deliverability, easy to integrate with React Email to design templates as components.
- Vercel (hosting + CDN). USD 20/month on the Pro plan, global edge functions, deploys in under 2 minutes per commit.
Total stack: USD 65–90/month for a boutique hotel with 10–25 rooms. If you sell USD 25,000/month, the stack is 0.3% of revenue — versus the 18% you pay Booking.
💡 For full cost details on a custom project like this, the pricing pillar has all USD ranges by feature.
The 5 features you actually need on day 1
Do not add more. Hotels that launch with 12 features take 3 extra months to ship and none of them are done well. The 5 that actually move the needle:
1. Overbooking-proof calendar
The heart of the system — without this, the rest is decoration. Three rules: database-level constraint with EXCLUDE USING gist (room_id WITH =, daterange WITH &&) that rejects overlaps; 10-minute temporary locks between date selection and payment so two people cannot book the same room; OTA sync every 60–120 seconds if you have a channel manager (1-hour batches = overbookings in high season).
2. Multiple payment methods (Stripe + SINPE + optionally BAC)
A single method = you lose 20–30% of reservations. Stripe Checkout for international tourists (3.4% + USD 0.30). SINPE Móvil for Costa Rican guests — 30–40% of local reservations flow through SINPE, no fees, no FX. BAC Credomatic optional if > 90% is domestic. Present them in parallel at checkout — do not force the guest to choose USD vs CRC before seeing the method.
3. Automated confirmation (email + WhatsApp)
Guest pays → email + WhatsApp arrive in under 10 seconds. If it takes 5 minutes, they call; if it takes 1 hour, they already cancelled. Email via Resend with PDF (React Email, responsive). WhatsApp with Meta-approved template. Both channels — Ticos do not always check email, foreigners do not always use WhatsApp.
4. Simple admin panel for front desk
One page, not 18 screens. The receptionist needs: Gantt-style calendar (rooms × 30 days), filters (check-in today, pending, etc.), search by guest or reservation number, buttons for manual reservation / block / discount / mark as cash-paid, and CSV export for accounting. That is everything in v1.
5. Mobile-first (because 70% book from phone)
Not optional. If your booking engine looks bad on iPhone, you lose 7 out of 10 potential reservations. Legible typography without zoom, date picker usable with a finger, correct keyboards per field, large buttons, load < 2 seconds on 4G. Measure with PageSpeed Insights and aim for 90+ on mobile.
Payments: international Stripe + local SINPE + optional BAC
This is where conversion most often breaks. Detail by method:
Stripe Checkout (the backbone). Supports Visa, Mastercard, Amex and Discover in USD and CRC. Hosted or embedded via their React elements. payment_intent.succeeded webhook fires the confirmation. Refunds from the admin panel. Fee: 3.4% + USD 0.30 per transaction (drops to 2.9% if you negotiate volume > USD 100,000/month).
SINPE Móvil (the local differentiator). Customer gets legal ID + amount + reference, makes a transfer from their banking app (BAC, BCR, BN, Davivienda). Your system listens to the bank webhook — or polls every 30 seconds if the bank does not expose webhooks — and matches by amount + reference. Confirms in 10–60 seconds. Fee: USD 0 or very low. Real case: hotel in La Fortuna, 18% of direct reservations through SINPE — if they had all paid with Stripe, USD 220/month extra in fees (USD 2,700/year).
BAC cards (when there is volume). Only worth it if > 80% of reservations are domestic, you bill > USD 15,000/month and have a team for manual settlement reconciliation. Otherwise, stick with Stripe.
💡 Full SINPE ecommerce guide: SINPE Móvil for ecommerce.
Automated confirmation: email + WhatsApp with pre-approved template
The flow: guest pays → Stripe webhook (or SINPE detector) → booking to confirmed → 2 parallel jobs (email via Resend with PDF, WhatsApp Cloud API with pre-approved template). If either fails, automatic retry via Vercel Cron (3 attempts at 1, 5 and 15 min). Logs in Supabase for manual re-send if everything fails.
The 4 basic Meta-approved templates (1–3 business days each): confirmation ("Hi {{name}}, we confirm your reservation from {{check_in}} to {{check_out}}. Total: {{amount}}"), 24h reminder with address, check-in instructions with WiFi and 24/7 number, and post check-out review with Google link. If you have been waiting more than a week for approval, check that the phone number is properly verified and the category is correct.
Booking integration via channel manager: when to add it
Not on day 1. It is extra complexity you do not need until you have real OTA volume. Keep Booking manual while you have < 20 OTA reservations/month, are listed only on Booking and your inventory changes little — updating the Extranet once a day (5–10 min) is workable.
Add a channel manager when you cross 20 OTA reservations/month, start seeing overbookings or want to list on 3+ channels. The options:
- SaaS (USD 50–200/month): SiteMinder or Cloudbeds. Setup 1–2 weeks. Good if you have < 25 rooms and standard operation.
- Custom (additional USD 1,800–3,500): direct integration via Booking Connectivity API + a certified aggregator for Airbnb. Worth it if you already run the custom engine and want everything in one database.
💡 Full SaaS vs custom decision: channel manager for hotels CR.
HowTo: 7 technical steps in order
The full process, from zero to production:
- Define inventory and rate rules — room types, capacity, seasonal rate, min nights, cancellation policy, deposit. If it does not fit a simple table, setup will cost more.
- Provision the base stack — Next.js 15 + Supabase + Vercel. 3–5 hours upfront. Supabase Auth for the admin panel. Custom domain + SSL.
- Build the calendar with transactional locks —
bookingstable withEXCLUDE USING gistper room + date range. 10-minute temporary locks before payment. Webhooks to confirm. - Integrate Stripe + SINPE Móvil — Stripe Checkout for international cards. SINPE Móvil via bank webhook with automated reconciliation. Both methods in parallel.
- Implement automated confirmations — Resend for email (with React Email). WhatsApp Cloud API with 4 pre-approved templates. Retry with Vercel Cron.
- Build the admin panel — single page with Gantt calendar, filters, search, CSV export and buttons for manual bookings / blocks / discounts. shadcn/ui + Supabase Realtime.
- Integrate Booking via channel manager when volume grows — SaaS (SiteMinder/Cloudbeds) or custom (Booking Connectivity API + aggregator for Airbnb).
Real case: 14-room boutique hotel in La Fortuna
Boutique hotel of 14 rooms, 1 property. Billing USD 32,000/month: 78% Booking, 12% Airbnb, 10% direct (an email form). Monthly commission: USD 5,184. 2–3 overbookings/month in high season because they updated Booking once a day.
We built the base system (Next.js + Supabase + Stripe + SINPE + WhatsApp + admin) for USD 4,200 in 5 weeks, plus custom channel manager (Booking Connectivity API + NextPax aggregator for Airbnb) for an additional USD 2,600 in 2 more weeks. Total: USD 6,800. Maintenance USD 75/month.
| Metric | Before | After | Delta |
|---|---|---|---|
| % direct reservations | 10% | 31% | +210% |
| Monthly commission | USD 5,184 | USD 3,320 | -USD 1,864/mo |
| Overbookings/month | 2.5 | 0 | Solved |
| ADR | USD 145 | USD 152 | +USD 7/night |
Payback: 3.6 months. ADR rose because guest data enabled pre-arrival remarketing and upgrade upsell. Anonymized real case, 2025.
Costs: USD 3,000–5,000 setup and ongoing maintenance
| Component | USD cost | Detail |
|---|---|---|
| Initial setup (one-time) | ||
| Base version (calendar + payments + confirmations + admin) | 3,000–3,800 | 4–5 weeks, up to 3 room types |
| Multi-type + packages + reporting | 4,200–5,200 | 5–7 weeks, 5+ room types, packages |
| Custom channel manager (Booking + Airbnb) | +1,800–3,500 | If added from the start or later |
| Recurring monthly maintenance | ||
| Vercel Pro + Supabase Pro + domains | 46 | Hosting + DB + Auth + Storage |
| Resend + WhatsApp Cloud API | 25–35 | Email + messaging |
| Total monthly stack | 71–81 | |
| Stripe fees | 3.4% + USD 0.30 | Passed to reservation margin |
| Sirius support (optional) | 200–400/mo | Bug fixes + 1–2 small features/month |
Compared to hotel SaaS (Cloudbeds USD 200–300/month, SiteMinder + booking engine USD 150–250/month), custom has a higher upfront cost but the recurring cost is 3–5x lower and the code + data are yours.
💡 Fast quote: interactive quote builder — 4 questions, 30 seconds, USD range + WhatsApp with pre-loaded scope.
Related cluster and hotels vertical
- Channel manager for hotels in Costa Rica 2026 — SaaS vs custom, USD costs and when to integrate OTAs.
- How much software costs in Costa Rica 2026 — pricing pillar with USD ranges by feature.
- Direct channel vs OTA: comparison — exact numbers on the trade-off.
- Hotels vertical — services for hospitality in CR.
For an exact quote, use the interactive quote builder. Or reach us: WhatsApp +506 8433 7752, admin@siriusx.net.
In summary
| Decision | If your hotel... | Recommendation |
|---|---|---|
| Booking engine only | 6–15 rooms, < 20 OTA reservations/month | Setup USD 3,000–3,800, manage Booking manually |
| Engine + channel mgr | 12–25 rooms, > 20 OTA reservations/month on 2+ channels | Setup USD 5,000–7,500 (custom or + SaaS) |
| Multi-property | 3+ properties, complex rate rules | Custom USD 7,500–12,000 with proprietary channel mgr |
| SaaS only | < 10 rooms, no custom code appetite | Cloudbeds USD 100–200/month with engine bundled |
The most common mistake we see: hotels starting with a USD 12,000 enterprise system "to grow into", using it at 15% and still answering the phone to take bookings. The rule: build the minimum viable, ship it in 4–6 weeks, and add features each month based on what real guests ask for.
💡 Quote: interactive quote builder — 4 questions → USD range + WhatsApp with scope.
📞 Direct: WhatsApp +506 8433 7752 or admin@siriusx.net. Mon–Fri 8 am–5 pm, Sat 8 am–12 noon.
