Westtro
Client Tago Forest
Industry Tourism & Accommodation
Location Jūrmalciems, LV
Scope Booking system & rebuild
Languages LT / LV / EN / RU
Case study // Product and engineering

Baltic Sea coastal cabin stays running on a booking system built from scratch

Tago Forest is three dune cabins near Jūrmalciems, a few steps from Bernāti beach. Behind the site is a custom WordPress plugin — not a licensed booking product — that handles real inventory, real payment, and four languages end to end.

Built and photographed by Westtro.

LANGUAGES: LT / LV / EN / RU / 3 CABINS, INDEPENDENTLY BOOKABLE
TAGO FOREST // JŪRMALCIEMS, LV
01 // The Plugin

A booking system built from scratch, not rented

Tago Forest doesn't run on a white-labeled, licensed booking plugin. Everything that actually takes a booking — tago-forest-cabins — is custom WordPress software, written for this one property and nothing else.

Seven custom database tables hold the real state, deliberately kept separate from WordPress's own posts and postmeta: bookings, each booking's linked cabin and add-ons, add-on nights, each cabin's seasonal rate calendar, its add-on catalog, and external blocks synced from other platforms. A booking is a row in a real table, not a custom post type pretending to be one.

Booking a cabin happens inside a real SQL transaction with row-level locking across every table it touches, so two guests racing for the same weekend can't both win it. The hold lasts exactly twenty minutes while Stripe collects payment; an hourly cron checks and releases anything abandoned back into available inventory — the same as a canceled OTA booking. A custom REST API serves the live day-by-day price and availability calendar straight from this data — no page reload, no third-party embed.

Calendar sync runs in both directions. Any number of iCal feeds — Booking.com, Airbnb, Agoda, anything that exports one — can be pasted in for each cabin and are refreshed hourly, so a booking made on a third-party platform blocks those dates here too. In reverse, each cabin gets its own signed, token-authenticated export feed — no login, no guest names or contact details in it, just blocked date ranges — built specifically to be pasted into Booking.com's own "sync calendars" field, so a direct booking on tagoforest.com blocks that room on Booking.com within the hour.

The admin side got the same care as the public one: a full visual yearly calendar for pricing, with a dedicated blocking mode for manual holds and a one-click "copy rates to next year" so the owner never has to rewrite seasonal prices from scratch, plus a booking list with a manual cancel/refund flow, an add-on manager, and a live email template previewer — all inside wp-admin, built in the same visual language as the site itself.

  • tfc_bookings — guest, dates, status, hold deadline
  • tfc_booking_cabins — rows for each cabin
  • tfc_booking_addons — add-ons for each booking
  • tfc_booking_addon_dates — add-on nights
  • tfc_cabin_seasonal_rates — daily rate calendar
  • tfc_cabin_addons — each cabin's add-on catalog
  • tfc_external_blocks — holds, synced from other platforms
7CUSTOM TABLES
3REST ENDPOINTS
2-WAYOTA CALENDAR SYNC
20 MINPAYMENT HOLD, CRON-CONTROLLED
tagoforest.com rezervāciju logs ar cenu un pieejamības kalendāru
TAGOFOREST.COM // BOOKING WINDOW
02 // Results

By the Numbers

Every photo on this page, and the looping film right at the top of tagoforest.com, was shot and produced by the Westtro team.

7 Database tables

Custom tables that power real inventory, not WordPress posts/postmeta.

4 Languages

End to end — including emails and receipts, not just button translations.

∞ Cabins

Three right now, each independently bookable — the owner can add new ones themselves, with no limit.

20 Minutes

How long a cabin is held for payment before it's released — enforced by a cron job.

03 // Multilingual

A booking flow that's actually translated, not just labeled

Most multilingual booking sites translate the buttons and leave the money logic in whatever language the developer wrote it in. Tago Forest runs Lithuanian, Latvian, English, and Russian straight through the parts that usually get missed: plural guest counts (1 suaugusysis pret 2 suaugusieji), add-on names loaded straight from the database — like the sauna — and bed/room labels hard-coded in PHP constants rather than page content. More than 150 guest-facing text strings are now wired through the Polylang translation layer, checked line by line in all four languages.

The hardest part wasn't the page you see — it was the email you get afterward. The booking confirmation is sent from a Stripe webhook — a server-to-server request where WordPress has no "current page" to guess the language from. We saved the guest's language on the booking itself at the moment of payment and carried it through every touchpoint after, so a guest who paid in Russian gets a Russian receipt — whether it arrives two minutes or two days later.

04 // Checkout

Matched to the reference design, not improvised

The guest-info step, progress bar, and payment screen were rebuilt against the supplied component mockups — in plain PHP and CSS, with no React runtime for a site that didn't need one — with several rounds of comparison until the native checkout matched the reference, not just approximated it.

MATCHED, NOT APPROXIMATED
Tago Forest terase starp priedēm, ar ārtelpu ēdamvietu
TERRACE // OUTDOOR SPACE
Tago Forest jumta stāva guļamistaba zem slīpiem koka griestiem
LOFT // BEDROOM
05 // Performance & Maintenance

A site the owner can keep editing without calling anyone

We moved the finished build from local development to production, then cleared roughly 18,850 old files off the live server to reduce its inode load before it had to handle real traffic. Every page stayed fully editable in Elementor — the owner can move a section or swap a photo without opening a template file.

~18,850 OLD FILES CLEARED BEFORE LAUNCH
06 // Tech Stack

What it's built with

EXECUTION SPECIFICATION
01 // SYSTEM

tago-forest-cabins (custom plugin)

7 database tables, REST API, two-way OTA calendar sync with Booking.com, Airbnb, and Agoda.

02 // CMS

WordPress + Elementor

Fully editable for the owner, with no opening template files.

03 // LANGUAGES

Polylang

Four languages, including emails and receipts, not just buttons.

04 // PAYMENTS

Stripe

Real payment with a 20-minute hold window and server-side verified pricing.

05 // PHOTOGRAPHY

Produced by Westtro

Every photo and looping film on the site — shot and produced by our team.

Index // Ledger

Other Transformations

VISI PROJEKTI
Project Industry Link
Start a Project

Let's get to work. Let's start talking.

Updates

Tips and news about web development. Sign up for updates.

tagoforest.com — live. Every photo on the site and the looping film at the top were shot and produced by Westtro.