Smoobu → Google Sheets:
Automate Your STR Reservation Management
Every new booking kicks off the same busywork: message the cleaner, update the tax list, fix your own overview — and hope no cancellation slips through the cracks. This free Apps Script does all of it for you. It connects to the Smoobu API and keeps three spreadsheets current — your cleaner's schedule, your accountant's tax export, and your own master list. Set it up once and it runs every hour in the background, whether you're thinking about it or not.
Three outputs, zero manual work
The script writes to three separate Google Sheets simultaneously. Each stakeholder gets only the columns they care about — nothing more, nothing less.
Your cleaner
A sheet your cleaner checks on their phone before heading over. New booking? Already there. Cancellation? Already gone — nobody drives out to clean for a guest who cancelled last week.
- Arrival & departure dates
- Guest name & count (adults, children)
- 🐕 Dog count — auto-detected from guest notes
- 👶 Infant count — detected even if miscategorised
- Cancellations removed in real time
- Guest notes & assistant instructions
Your accountant
Skip the January scramble. Only completed stays, counted from your tax year start date, with fees already broken out — send your accountant the link and you're done.
- Booking channel (Airbnb, Booking.com, direct)
- Total guest payment
- Host fee (platform commission) separated
- Cleaning fee separated
- Net payout calculated automatically
- Only past stays — no future bookings
You (the host)
Every booking, every detail, in one place — the guest's phone number, the prepayment that hasn't arrived, the note about a late check-in. It's also a full backup of your reservation data, independent of Smoobu.
- All bookings across all properties
- Guest phone number & contact details
- Price paid vs. price billed
- Payment status (prepayment tracker)
- Guest notes & special requests
- Deep-link to Smoobu guest app per booking
How it all connects
One script run does everything: it fetches all bookings from Smoobu, applies smart detection logic, then writes to all three sheets in a single pass.
1 Prerequisites
Nothing here costs extra and nothing needs installing. If you run Smoobu and use Gmail, you already have almost everything — the only real prep is creating three blank spreadsheets.
| What you need | Where to get it |
|---|---|
| Smoobu account with API access enabled | Settings → External Integrations → API → Generate API key |
| Google account with Drive & Sheets | You already have this if you use Gmail |
| 3 Google Sheets — Master, Cleaner, Tax | Create blank spreadsheets; copy their IDs from the URL |
| Edit access to all three sheets | The script runs as your Google account, so it needs owner or editor access |
2 Setup steps
- Create three blank Google Sheets: one for yourself (Master), one to share with your cleaner, one to share with your accountant
- Copy each sheet's ID from the URL bar — it's the long code between
/d/and/edit - Open your Master Sheet → Extensions → Apps Script
- Delete the placeholder code, paste the full script (see the "Get the script" section below), and save
- Reload the spreadsheet — a Smoobu Sync menu appears in the toolbar
- Fill in the CONFIG block at the top with your API key and sheet IDs
- Click Smoobu Sync → Update All Bookings for the first run
- Grant permissions when Google prompts you (the script needs Sheets, Drive, and URL fetch access)
3 Configure
Fill in the four values at the top of the script. Everything else is automatic.
const CONFIG = { // 1. Your Smoobu API key (Settings → External Integrations → API) API_KEY: 'YOUR_SMOOBU_API_KEY_HERE', // 2. Google Sheet ID for your cleaner's schedule CLEANING_SHEET_ID: 'YOUR_CLEANING_SPREADSHEET_ID', // 3. Google Sheet ID for your accountant's tax report TAX_DESTINATION_ID: 'YOUR_TAX_SPREADSHEET_ID', // 4. First day to include in the tax export (Year, Month-1, Day) // new Date(2025, 11, 31) = 31 December 2025 TAX_START_DATE: new Date(2025, 11, 31) };
new Date(2025, 11, 31) is December 31st, 2025 — the end of the previous tax year.
4 Master list — your full view
The Master List is written to a tab called Reservations in your main spreadsheet. It contains every booking (confirmed and cancelled) with all available data.
| # | Arrival | Departure | Guest | Portal | Adults | Dogs | Price | Paid | Status |
|---|---|---|---|---|---|---|---|---|---|
| 129045 | 15.06.2025 | 20.06.2025 | Smith, J. | Airbnb | 2 | 🐕 1 | €450.00 | €450.00 | confirmed |
| 129108 | 22.06.2025 | 25.06.2025 | Müller, A. | Booking.com | 2 | — | €310.00 | €155.00 | confirmed |
| 129234 | 01.07.2025 | 08.07.2025 | Johnson, C. | Direct | 4 | — | €720.00 | €720.00 | confirmed |
| 129301 | 10.07.2025 | 14.07.2025 | Rossi, M. | Airbnb | 2 | 🐕 2 | €380.00 | €380.00 | confirmed |
Full column list: Position, Arrival, Departure, Guest Name, Portal, Reference ID, Guest App URL, Created Date, Phone, Adults, Children, Infants, Dogs, Guest Notes, Assistant Instructions, Price, Amount Paid, Prepayment Paid, Number of Nights, Status.
5 Cleaner sheet — schedule & pet alerts
Written to the Data tab in your separate Cleaner spreadsheet. Cancelled bookings are excluded automatically — your cleaner never sees a job that was cancelled.
| Arrival | Departure | Guest | Adults | Children | Infants | 🐕 Dogs | Guest Notes |
|---|---|---|---|---|---|---|---|
| 15.06.2025 | 20.06.2025 | Smith, J. | 2 | 0 | 0 | 1 | We're bringing our dog, very well-behaved! |
| 22.06.2025 | 25.06.2025 | Müller, A. | 2 | 1 | 0 | — | |
| 01.07.2025 | 08.07.2025 | Johnson, C. | 4 | 0 | 0 | — | We're celebrating an anniversary |
| 10.07.2025 | 14.07.2025 | Rossi, M. | 2 | 0 | 0 | 2 | Bringing 2 dogs, they sleep in the kitchen |
Notice what's missing: money. Same schedule, same notes as your master list, but none of the financial columns. Your cleaner sees who's arriving and what to prepare for — what guests paid stays between you and your accountant.
6 Tax export — accountant-ready
Written to two places: a Smoobu Tax export tab in your Master Sheet (all bookings), and your separate Tax Sheet (filtered to completed stays past your TAX_START_DATE). The latter is what you share with your accountant.
| Date | Channel | Start | Nights | Guest | Amount | Host Fee | Cleaning | Paid Out |
|---|---|---|---|---|---|---|---|---|
| 16.06.2025 | Airbnb | 15.06.2025 | 5 | Smith, J. | €450.00 | €45.00 | €60.00 | =M-O |
| 23.06.2025 | Booking.com | 22.06.2025 | 3 | Müller, A. | €310.00 | €46.50 | €60.00 | =M-O |
| 02.07.2025 | Direct | 01.07.2025 | 7 | Johnson, C. | €720.00 | €0 | €80.00 | =M-O |
| 11.07.2025 | Airbnb | 10.07.2025 | 4 | Rossi, M. | €380.00 | €38.00 | €60.00 | =M-O |
The "Paid Out" column is a live formula, not a pasted number: =M-O in the actual sheet, where column M is the total amount and column O is the host fee. Correct a fee figure once and the payout fixes itself. The cleaning fee keeps its own column, so your accountant can treat it however your setup requires.
7 Smart pet & infant detection
Guests frequently mention animals in the free-text notes field without ticking the "pets" checkbox in Airbnb or Booking.com. This is the single most common cause of "surprise" for cleaners.
The script scans each booking's notice field (guest-visible notes) with two detection layers:
Layer 1 — Structured field
Smoobu stores an infants field. This is the authoritative count if the guest filled it in correctly.
Layer 2 — Text regex on guest notes
// Counts 2 dogs if the guest mentions "two dogs" / "2 Hunde" / etc. if (noticeLower.match(/\b(2|two|zwei|deux)\s+(dogs|hunde|chiens|pets)\b/)) { dogCount = 2; } else if (noticeLower.match(/(dog|hund|pet|chien|animal)/)) { dogCount = 1; // single mention = 1 dog assumed }
// Checks Smoobu's structured field first; falls back to text scan if (infantCount === 0) { const match = noticeText.match(/Number of infants:\s*(\d+)/i); if (match) infantCount = parseInt(match[1]); }
Layer 2 also checks the price elements API call (made for each booking to get fee data): if there's a "pet fee" line item, a dog is flagged even without a text mention.
/(dog|hund|chien|perro|cane|animal|huisdier)/. The regex works on any word that appears anywhere in the notice field.
8 Fee breakdown
Smoobu's reservation list endpoint gives you a single commission-included value. To get the cleaning fee, the script makes a second API call per booking to the price elements endpoint:
GET https://login.smoobu.com/api/reservations/{id}/price-elements // Returns an array like: [ { type: "cleaningFee", name: "Cleaning Fee", amount: 60 }, { type: "commission", name: "Airbnb Host Fee", amount: 45 }, { type: "extraPerson", name: "Additional Guest", amount: 20 } ]
The script finds the cleaning fee by matching type === "cleaningFee" or a name containing "cleaning". The host fee is taken from the commission-included field first (already on the main record), falling back to the price elements if it's missing.
9 Tax date filter
The accountant's external sheet only receives bookings where the reporting date (day 2 of the stay) is after TAX_START_DATE and the arrival is in the past. This filters out three things automatically:
| Excluded from the accountant sheet | Why |
|---|---|
| Future bookings | Revenue not yet earned — arrival date is still in the future |
| Stays before your tax year start | Already declared in the previous year's return |
| Cancelled bookings | Filtered out upstream — never reach the tax export |
const sendToAccountant = taxDateObj && arrivalDateObj && (taxDateObj > CONFIG.TAX_START_DATE) && // after tax year start (arrivalDateObj <= today); // stay has started
Your master sheet (internal) always contains all bookings regardless of this filter — the filter only applies to what goes into the external Tax Sheet.
10 Hourly trigger
Set this up once and the script runs automatically in the background — you never need to click "Sync" again.
- In your Master Sheet → Extensions → Apps Script
- Click the clock icon on the left sidebar (Triggers)
- + Add Trigger
- Function:
syncSmoobuToSheet - Event source: Time-driven → Hours timer → Every hour
- Save — Google prompts for permissions on first run
To check the run history and see any errors: in Apps Script → left sidebar → Executions. Each run is logged with its duration and any error messages.
Get the script & template
The full script is a GitHub Gist — free, open source, yours to copy and adapt. If you'd rather not format three spreadsheets from scratch, the ready-made template (headers, formulas, pet-alert highlighting) is one request away through Hostmade.de — informational platform built by hosts for hosts.
Get the template spreadsheet
All three tabs already built — headers, formulas, pet-alert highlighting — so your first sync lands in a sheet that looks right from row one. One request via Hostmade.de — informational platform built by hosts for hosts — and it's yours.
Request the template →Need custom columns or properties?
A Telegram ping the moment a booking lands. An extra column your cleaner keeps asking for. More properties in the same sheets. Tell me what your setup needs and I'll wire it up.
Get in touch →