Skip

00/Business

Online reservations for hotels in Costa Rica: 2026 tech setup

Step-by-step technical setup of an online booking system for boutique hotels in Costa Rica: stack, Stripe + SINPE, calendar, email/WhatsApp confirmations and Booking integration via channel manager.

Fecha
May 22nd, 2026
Tiempo de lectura
11 min read
Autor
By Jafeth Jiménez

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:

  1. 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.
  2. Provision the base stack — Next.js 15 + Supabase + Vercel. 3–5 hours upfront. Supabase Auth for the admin panel. Custom domain + SSL.
  3. Build the calendar with transactional locksbookings table with EXCLUDE USING gist per room + date range. 10-minute temporary locks before payment. Webhooks to confirm.
  4. Integrate Stripe + SINPE Móvil — Stripe Checkout for international cards. SINPE Móvil via bank webhook with automated reconciliation. Both methods in parallel.
  5. Implement automated confirmations — Resend for email (with React Email). WhatsApp Cloud API with 4 pre-approved templates. Retry with Vercel Cron.
  6. Build the admin panel — single page with Gantt calendar, filters, search, CSV export and buttons for manual bookings / blocks / discounts. shadcn/ui + Supabase Realtime.
  7. 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

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.

Jafeth Jiménez

By

Jafeth Jiménez

Founder · SEO & developer

Co-founder and owner of Sirius. Leads SEO strategy and ships code on every project the agency delivers. Works with clients in Costa Rica and the region.

03/Step by step

How to build an online booking system for your boutique hotel in Costa Rica

Seven technical steps to implement direct reservations with payments, calendar and confirmations — without overbooking.

  1. Step 01

    Define inventory and minimum rate rules

    Before touching code, write on one page: how many room types you have (standard, superior, suite), capacity per type, seasonal rates (high, low, weekends), minimum nights per season, cancellation policy, and required deposit (50% on booking, 100% on confirm, etc). If this does not fit a simple table, the technical setup will be more expensive — invest 2 hours here before requesting a quote.

  2. Step 02

    Provision the base stack: Next.js + Supabase + Vercel

    Create the Next.js 15 repo with App Router, connect Supabase for the database (tables: properties, room_types, rooms, bookings, guests, payments), set up Supabase Auth for the admin panel, and deploy to Vercel with a custom domain. Initial setup: 3–5 hours. Recurring cost: USD 25–45/month up to the first 100,000 visitors.

  3. Step 03

    Build the calendar with transactional locks

    The heart of the system. The bookings table uses EXCLUDE USING gist constraint with a date range (tstzrange) per room that rejects two overlapping reservations at the database level. When the guest selects dates, a 10-minute temporary lock is created (booking in pending state). If they do not complete payment, it expires. If they do, the Stripe webhook flips the reservation to confirmed. Without this architecture you will see overbookings in high season.

  4. Step 04

    Integrate Stripe (international) + SINPE Móvil (local)

    Stripe Checkout for international cards — charges 3.4% + USD 0.30 per transaction, supports USD and CRC, recurring if you handle memberships. SINPE Móvil for Costa Rican guests — connected via bank webhook (BAC, BCR, BN) that detects the deposit to your legal ID and matches the amount + reservation reference. Configure both as parallel methods in checkout so you do not force the guest to use a card.

  5. Step 05

    Implement automated email and WhatsApp confirmations

    When Stripe sends the payment.succeeded webhook (or the SINPE bot confirms the deposit): 1) flip the booking to confirmed, 2) trigger transactional email via Resend with a confirmation PDF, 3) trigger a WhatsApp Cloud API message with the pre-approved template (includes guest name, dates, amount, Google Maps link to the hotel). Total: 3–6 seconds from payment. If anything fails, automatic retry via Vercel Cron queue.

  6. Step 06

    Build the admin panel for the front desk

    A single page with a Gantt-style calendar showing all rooms x 30 days, filters by status (confirmed, pending, cancelled, check-in today, check-out today), search by guest or reservation number, CSV export for accounting, and buttons for creating manual reservations (walk-in), blocking dates (maintenance), or applying discounts. Built with shadcn/ui + Supabase real-time. Do not add more in v1.

  7. Step 07

    Integrate Booking via channel manager when volume grows

    While you have < 20 OTA reservations/month, keep Booking manual (update inventory once a day on the Extranet). When you cross that threshold or add Airbnb, integrate a channel manager: SaaS if you have fewer than 25 rooms (SiteMinder USD 50–100/month, Cloudbeds USD 100–200/month), or custom if you have multi-property or complex rate rules. The channel manager connects to your system via API and syncs inventory/rates/restrictions every 60–120 seconds.

04/Frequently asked

What people ask us about this.

How much does it cost to build direct online reservations for a boutique hotel in Costa Rica?

Between USD 3,000 and USD 5,000 in setup, depending on scope. The base version (calendar, Stripe + SINPE payments, email/WhatsApp confirmations, admin panel) lands at USD 3,000–3,800 and ships in 4–5 weeks. If you add multi-room-type with packages, channel manager integration and per-channel revenue reporting, it rises to USD 4,500–5,500 and 5–7 weeks. Monthly maintenance is USD 50–80 (Vercel hosting + Supabase + domains + payment fees passed to transaction).

Why bother with direct reservations if Booking is already bringing me guests?

Because Booking charges between 15% and 22% commission on every reservation. A 14-room boutique hotel billing USD 30,000/month with 80% OTA dependency gives away USD 4,320/month in commissions alone. If you recover 25% of that traffic as direct bookings (guests who Google your name and book with you instead of on Booking), you save USD 1,080/month and the system pays for itself in under 4 months.

What tech stack does Sirius use for hotel reservations?

Next.js 15 for frontend (SSR + edge runtime, mobile-first, SEO friendly), Supabase for PostgreSQL database + auth + photo storage, Stripe for international card payments, SINPE Móvil for local CRC payments, WhatsApp Cloud API for automated confirmations, Vercel for hosting with global CDN, and Resend for transactional email. The whole stack costs USD 25–60/month including domains. It is the same stack we recommend in the [pricing pillar](/en/blog/how-much-software-costs-costa-rica).

How do I prevent the calendar from causing overbooking?

Three technical rules: 1) database-level locks with Postgres transactions (Supabase) — when a guest reserves, a 10-minute temporary lock is created on that room + dates before charging; 2) if paying via Stripe, availability is confirmed only after the payment.succeeded webhook fires; 3) if you have a channel manager, sync with Booking and Airbnb must run every 60–120 seconds. Without these three layers you will see overbookings in high season — we have seen it in clients migrating from spreadsheets.

Can I accept SINPE Móvil alongside cards?

Yes, and it matters a lot for Costa Rican guests. 30–40% of direct reservations at boutique hotels in CR with domestic traffic prefer SINPE because it skips the international fee and the USD/CRC conversion. We integrate SINPE via bank webhook with automated reconciliation: the guest gets the legal ID + amount, makes the transfer from their banking app, the system detects the deposit and confirms the reservation. It takes 10–60 seconds depending on the bank. See full guide on [SINPE Móvil for ecommerce](/en/blog/sinpe-movil-ecommerce-integration-costa-rica).

When does adding Booking integration via channel manager make sense?

When you cross 20 OTA reservations/month, or when you are already listed on 2+ channels (Booking + Airbnb for example) and start seeing overbookings or stale rates. Below that, managing Booking manually (own calendar + inventory update on Booking Extranet) is workable. Adding a channel manager costs USD 1,800–3,500 extra if we build custom, or USD 50–150/month if you go SaaS (SiteMinder or Cloudbeds). See the full decision in [channel manager for hotels CR](/en/blog/channel-manager-hotels-costa-rica).

Do WhatsApp confirmations require pre-approval?

Yes. WhatsApp Cloud API requires every transactional message template to be pre-approved by Meta (takes 1–3 business days). We pre-approve 4 standard templates: reservation confirmation, 24-hour pre-check-in reminder, check-in instructions (address + WiFi password), and post check-out review request. Templates can include variables ({{name}}, {{date}}, {{room}}) but the base text is fixed. Once approved, sending the message costs USD 0.005–0.015 per conversation.

How do I contact Sirius to build online reservations for my hotel?

Reach us on WhatsApp at +506 8433 7752 or by email at admin@siriusx.net. The initial consult is free: we review your current traffic, channels, and what you pay in commissions, then we send you scope with USD price and timeline in 2–3 business days. You can also use the [interactive quote builder](/quote) — 4 questions, 30 seconds, gives you a USD range.

05/Direct contact

Talk to Sirius about this.

We're a software agency in Costa Rica. If what you read applies and you want to move forward, reach us through any of these:

Hours
Mon–Fri 8am – 5pm · Sat 8am – 12pm
Location
Pozos de Santa Ana, Santa Ana, San José, CR

02/Tell us

Does any of this apply to you? .

If the note rang a bell and you have a project in mind, let's talk on WhatsApp. No forms.