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.
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
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.
Custom tables that power real inventory, not WordPress posts/postmeta.
End to end — including emails and receipts, not just button translations.
Three right now, each independently bookable — the owner can add new ones themselves, with no limit.
How long a cabin is held for payment before it's released — enforced by a cron job.
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.
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.
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.
What it's built with
tago-forest-cabins (custom plugin)
7 database tables, REST API, two-way OTA calendar sync with Booking.com, Airbnb, and Agoda.
WordPress + Elementor
Fully editable for the owner, with no opening template files.
Polylang
Four languages, including emails and receipts, not just buttons.
Stripe
Real payment with a 20-minute hold window and server-side verified pricing.
Produced by Westtro
Every photo and looping film on the site — shot and produced by our team.
Other Transformations
| Project | Industry | Link |
|---|
Let's get to work. Let's start talking.
Tips and news about web development. Sign up for updates.
Submission received. Thank you!tagoforest.com — live. Every photo on the site and the looping film at the top were shot and produced by Westtro.
