Smoobu website builder suffers from bad UX, I used their API instead

waldov1 pts0 comments

How to build a direct STR booking site with Claude, Smoobu & Stripe — Waldo Vanderhaeghen Skip to content ☰

How to build a direct STR booking site<br>with Claude, Smoobu & Stripe

Reference implementation:<br>seumi.vanderlore.de<br>smoobu stripe next.js i18n claude 11 June 2026<br>How to build a short-term rental direct booking site<br>with Claude, Smoobu & Stripe — in 10+ languages<br>Airbnb's guest-side service fee adds 14–16% on top of your nightly rate. On a €700 weekly booking, that's €100 disappearing before a guest even confirms. A direct booking site cuts platforms out of that transaction — and with Claude as your build partner, it's a realistic weekend project, not a multi-month engineering commitment.<br>My own Altbau flat near Boxhagener Platz in Friedrichshain runs on exactly this setup — guests book at a lower price than on Airbnb, same apartment, same hosts. This guide covers the full stack: booking engine, payment flow, multilingual SEO, analytics, an automated Claude agent loop that catches and fixes issues overnight, security hardening, and German legal compliance. Every section includes working code.<br>The system, drawn as a loop<br>The key insight is that this isn't a website you build and forget. It's an iterative system — every layer feeds the next, and each iteration makes the whole thing more reliable.<br>Build Claude AI Audit SEO, Security & legal skills Deploy GitHub → Vercel Bookings Smoobu · Stripe Measure PostHog · GA4 · Telegram ↻ feedback loop Pipeline step Loops back — next iteration A guest books → GA4 and PostHog fire → a nightly smoke check runs → if something breaks, Telegram alerts → a ticket appears in the backlog → Claude picks it up → a fix deploys → the loop runs again. The core booking flow ships in a weekend. The monitoring, agent loop, and legal layers compound over the weeks that follow — that's by design.<br>1 Foundation: GitHub + Vercel<br>Set up the deployment pipeline before anything else. Every subsequent layer ships through it.<br>Create the repo and project<br>Terminal<br>npx create-next-app@latest your-booking-site --typescript --tailwind --app<br>cd your-booking-site<br>git init && git remote add origin git@github.com:yourorg/your-booking-site.git<br>git push -u origin main Connect Vercel<br>Go to vercel.com → New Project → Import from GitHub<br>Select the repo — Next.js is autodetected, no config needed<br>Every push to main now auto-deploys to production<br>No CI files, no build scripts, no server to manage. Vercel handles it.<br>Environment variables<br>Set these in Vercel Dashboard → Settings → Environment Variables before writing API code. Mirror locally in .env.local (gitignored — never commit secrets).<br>SMOOBU_API_KEY=...<br>SMOOBU_APARTMENT_ID=...<br>STRIPE_SECRET_KEY=sk_live_...<br>NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...<br>STRIPE_WEBHOOK_SECRET=whsec_...<br>NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX<br>NEXT_PUBLIC_POSTHOG_KEY=phc_...<br>TELEGRAM_BOT_TOKEN=...<br>TELEGRAM_CHAT_ID=...<br>CRON_SECRET=... # random string, verify in cron handler Scaffold with Claude<br>Once the repo exists, brief Claude on the full system in a single session:<br>Prompt to start with

"Build a Next.js 16 App Router direct booking site for a short-term rental. It needs: Smoobu availability and pricing API, Stripe PaymentIntent payment flow with webhook, multilingual routing for 12 locales, and a Telegram alerting module. Start with the folder structure and the Smoobu client."

Claude will scaffold the architecture, flag the non-obvious traps (webhook ordering, the timezone bug), and propose the folder structure before you write a line of business logic.<br>2 Smoobu: availability, pricing, reservations<br>Smoobu is the channel manager that aggregates bookings from Airbnb, Booking.com, and your direct site. Get your API key at Settings → External Integrations → API .<br>Checking availability and pricing<br>lib/smoobu.ts<br>const BASE = "https://login.smoobu.com/api";<br>const headers = {<br>"Api-Key": process.env.SMOOBU_API_KEY!,<br>"Content-Type": "application/json",<br>};

export async function getAvailability(apartmentId: string, start: string, end: string) {<br>const url = `${BASE}/rates?apartments[]=${apartmentId}&start_date=${start}&end_date=${end}`;<br>const res = await fetch(url, { headers, next: { revalidate: 300 } });<br>const json = await res.json();<br>return json.data[apartmentId] as Record0 | 1;<br>min_length_of_stay: number;<br>}>;<br>} available: 0 means blocked. Build a Set of blocked date keys and disable those dates in the calendar. The response is cached for 5 minutes (revalidate: 300) — enough freshness without hammering the API.

The calendar pulls live availability from Smoobu's rates API. Greyed-out dates are blocked — either by existing bookings or minimum-stay rules.<br>The timezone pitfall — read before writing any date code<br>Smoobu returns dates as strings: "2026-07-01". If these pass through JavaScript's new Date() and .toISOString(), you get one day early — JS parses date-only strings as UTC midnight, but your guests and calendar are in local time (Berlin is UTC+2).<br>Never do this<br>new...

smoobu booking claude build site next

Related Articles