STR Co-Host Business · Complete Tech Stack Playbook

Launch Your Co-Hosting Business
From Zero to Live Website

A step-by-step guide for building a professional marketing website, owner portal, and backend infrastructure — with no monthly platform fees and no coding experience required.

4 Phases
4 Key Tools
3 Portal Paths
1 day Total Build Time
🤖
Phase 6 · AI & Automation
Ready to automate booking sync, review responses & monthly owner reports with Claude?
Open AI Automation Playbook →
🌐
GitHub Pages
Free website hosting. Your site files live here.
🌍
Namecheap
Domain name (~$12–30/yr). Your professional URL.
📋
Formspree
Contact form backend. Leads land in your email.
📊
Google Sheets
Owner portal data source. Free, real-time updates for both portal paths.
🏠
3 Portal Paths
Softr (scaling operators) · HTML (smaller co-hosts) · Google Sheet Direct (self-managers). Pick what fits your operation.
🤖
Claude AI
Builds all 4 website files from your answers.
01
Phase 1 · 60–90 min
Build the Website with Claude AI
We use a carefully crafted prompt to have Claude build your complete website — 4 files, fully customized to your brand, market, and services. No coding required.
The website is built in pure HTML, CSS, and JavaScript — the three languages every browser already understands. There is no WordPress, no Squarespace, no monthly platform fee. The result is a fast, professional site you fully own and can update without anyone's permission. Claude writes all the code; you just answer questions about your business.
1
Open Claude and start a fresh conversation
~2 min
→ Open Claude.ai

Click New Chat in the left sidebar. Do not paste the prompt into an existing conversation — it must be a clean session so Claude starts fresh with no prior context.

Always use a brand new conversation for each client build. Starting in an existing chat can cause Claude to mix up details from a previous project.
2
Copy and paste the Master Build Prompt
~3 min

Copy the entire prompt below (everything from [START PROMPT] onward) and paste it into Claude. Do not modify it — it is designed to work as written.

📋 Master Build Prompt — Paste into Claude
You are an expert web developer and STR (short-term rental) co-hosting business consultant. Your job is to build a complete, professional, mobile-responsive marketing website for a new STR co-hosting business — including a working owner client portal with live Google Sheets data integration and a Formspree lead capture contact form. The website is built in pure HTML, CSS, and JavaScript — no frameworks, no dependencies, no backend server required. It is hosted on GitHub Pages (free). The owner portal pulls live data from a published Google Sheet CSV. Formspree handles contact form submissions. Do not begin building until you have completed the full discovery process below. STEP 1 — DISCOVERY Ask ALL of the following questions in a single organized message before writing any code. Group them clearly by section. State that you need all answers before you can begin. SECTION A — BRAND & BUSINESS - What is the business name? - What is the owner's first and last name? - What is the business tagline or one-line value proposition? (Offer to write one if they don't have one) - What is the management fee percentage? (e.g. 18%) - What email address should contact form leads be sent to? - Do they have a domain name? If not, note they'll need one from namecheap.com before launch. SECTION B — MARKET & SERVICE AREA - What city or region is the business based in? - What specific towns or areas do they serve? (Up to 6 — these appear in the scrolling ticker) - Approximate average nightly rate in their market? - Approximate average occupancy rate? (Default: 68% if unknown) SECTION C — BRAND AESTHETICS - Color direction — pick a preset or describe their own: Mountain/Forest | Coastal/Beach | Desert/Southwest | Urban/Modern - Do they have hero photos to upload? (Direct to unsplash.com if not — free commercial use) - What feeling should the site give visitors? SECTION D — SERVICES & DIFFERENTIATORS - What are their 3–4 core services? - What makes them different from other co-hosts in their area? - Do they use AI or technology as a differentiator? SECTION E — CONTENT - Do they want an About section? (2–3 sentences) - What are 3–5 FAQ questions they expect from property owners? SECTION F — OWNER PORTAL - Which portal path are you using? A) Softr — best for scaling operators (5+ owners, professional login, $49/mo) B) HTML Portal — best for smaller co-hosts (1–5 owners, free, GitHub-based) C) Google Sheet Direct — best for self-managing owners (no portal, Hospitable + n8n writes booking data directly to a shared Google Sheet) - If Softr: confirm they have a Softr account and their Google Sheet is connected - If HTML portal: how many owners at launch? For each: full name, email, access code - If Sheet Direct: confirm they are using Hospitable as their PMS and have n8n set up (or plan to) - What data should owners be able to see? (Dashboard stats, reservations, earnings, documents, messages) STEP 2 — CONFIRM & PLAN Summarize all answers, list assumptions, confirm photo situation, and ask for explicit go-ahead before building. STEP 3 — BUILD Deliver four files: 1. index.html — Full marketing homepage 2. style.css — All styles 3. script.js — All JavaScript 4. owner-portal.html — Working owner portal with Google Sheets integration CRITICAL REQUIREMENT — CLOUDFLARE EMAIL OBFUSCATION FIX: Never write email addresses as plain strings in HTML or JavaScript. Always use this pattern: function e(user, domain) { return user + '\x40' + domain; } e('owner','gmail.com') // produces [email protected] at runtime Apply this in THREE places: CONFIG owners array, all mailto href links (set via JS in DOMContentLoaded), and the sendMessage function. Without this fix, portal login will silently fail on GitHub Pages. REFERENCE STANDARD: hillsidestays.net — match or exceed this quality on every build. After delivering files, include full backend setup instructions for GitHub, Namecheap DNS, Formspree, and Google Sheets. PORTAL NOTE (include at end of delivery): If using Path A (Softr): the portal is production-ready from day one with real authentication and automatic data separation. Connect n8n automations at 10+ properties to eliminate manual Sheet updates entirely. If using Path B (HTML portal): it handles 1–5 owners comfortably with manual Sheet updates (~5 min/owner/month). Migration to Softr at 5–7 owners is straightforward — data stays in the same Google Sheet. If using Path C (Sheet Direct): no portal files to deliver — instead, provide the owner's Google Sheet and configure the Hospitable → n8n → Sheet workflow per the AI Automation Playbook, Workflow 1. Migrate to Softr at 5–7 owners or whenever the overhead outweighs $49/month.
This prompt is engineered to make Claude ask you all the right questions before writing a single line of code. This discovery process is how the website ends up tailored to your specific market, brand, and services — not generic. The reference to hillsidestays.net tells Claude the quality bar to hit.
3
Answer Claude's discovery questions
~20 min

Claude will respond with 6 sections of questions (A through F). Answer each one. Here's what to have ready:

A
Business name, owner name, management fee %, contact email, domain name (if purchased)
B
Region (e.g. "Western North Carolina"), 4–6 specific towns or areas you serve, rough nightly rate and occupancy estimate
C
Color direction (Mountain/Forest, Coastal, Desert, Urban), 3 hero photos uploaded directly to chat or sourced from Unsplash
D
Core services (Guest Comms, Pricing, Cleaning, Maintenance are good defaults), your key differentiators, yes/no on AI tools
E
2–3 sentence About bio, 3–5 FAQ questions (Claude writes the answers)
F
Number of initial owners (1–5), each owner's name, email, and access code
For photos: Go to unsplash.com, search your market (e.g. "Blue Ridge mountains cabin"), and download 3 landscape photos. Upload them directly into the Claude chat window alongside your answers. All Unsplash photos are free for commercial use with no watermarks.
4
Review Claude's plan and approve the build
~5 min

Claude will summarize your answers and ask for an explicit go-ahead before building. Read through the summary — check that your business name, colors, service area, and owner info are all correct. Then type:

💬 Approval Message
Looks great — go ahead and build all four files.
5
Save all four files to your computer
~10 min

Claude will deliver four labeled code blocks. For each one:

1
Click the Copy button on the code block
2
Open a plain text editor (Notepad on Windows, TextEdit on Mac — set to plain text mode)
3
Paste the code and save the file with the exact filename Claude specifies (index.html, style.css, script.js, owner-portal.html)
Save all four files in the same folder on your computer. Also move your hero photos into this same folder before uploading to GitHub.
02
Phase 2 · 15–20 min
Set Up GitHub & Launch the Site
GitHub is where your website files live and where the site is served from. Every file you upload goes live within 1–5 minutes. It's free for public repositories.
Think of GitHub like a Google Drive for code files — except it also has a built-in feature called GitHub Pages that turns any folder of files into a live website. You upload your HTML, CSS, and JS files, flip a switch, and your site is live at a free URL. When you connect a custom domain (Phase 3), visitors see your domain instead of the GitHub URL.
1
Create a GitHub account
~5 min
→ Go to GitHub.com
a
Click Sign Up — use your business email address
b
Choose a username — ideally your business name (all lowercase, no spaces). Example: hillsidestays
c
Select the Free plan when asked
d
Verify your email address when the confirmation email arrives
2
Create a new repository
~3 min

A repository is the folder where your website files will live.

a
After logging in, click the + icon (top right) → New repository
b
Repository name: use your business name in all lowercase with no spaces (e.g. hillsidestays)
c
Set visibility to Public (required for free GitHub Pages hosting)
d
Leave all other settings at their defaults and click Create repository
3
Upload your website files
~5 min
a
Inside your new empty repository, click "uploading an existing file" (or the "Add file" button → "Upload files")
b
Drag and drop ALL files: index.html, style.css, script.js, owner-portal.html, and all photo files (.jpg)
c
In the "Commit changes" section at the bottom, leave the default message and click Commit changes
Make sure all files are at the root level (top of the repository) — not inside any subfolder. If index.html is inside a folder, GitHub Pages won't find it and you'll get a 404 error.
4
Enable GitHub Pages
~3 min
a
Go to your repository → click Settings (top menu)
b
Scroll down in the left sidebar and click Pages
c
Under "Source" select Deploy from a branch
d
Branch: main | Folder: / (root) → click Save
e
Wait 2 minutes, then your site is live at: https://[username].github.io/[repositoryname]
This free GitHub URL works immediately and is your backup URL — even after you connect your custom domain, this URL always works independently. Use it anytime you need to verify the site is working when troubleshooting domain issues.
5
How to update files in the future
Reference

Whenever you need to make changes to the website:

1
Go to your repository on GitHub and click the file you want to edit
2
Click the pencil icon ✏️ in the top right of the file view to edit directly in the browser — no software download needed
3
Make your change, then click Commit changes
4
The live site updates within 1–5 minutes
Never upload an old saved copy of a file to make a small change. Always download the current version from GitHub first, or edit directly in GitHub's browser editor. Uploading an old copy will overwrite any changes made since you last saved locally — including owner additions.
03
Phase 3 · 30–45 min (+ DNS propagation wait)
Domain, Contact Form & Google Sheet Setup
Connect your custom domain, activate your contact form, and create the Google Sheet that powers the owner portal.
1
Purchase your domain from Namecheap
~10 min
→ Go to Namecheap.com
a
Search for your business name — try .com first, then .net, then .co
b
Add to cart and complete purchase (~$12–30/year)
c
Create a Namecheap account with your business email during checkout
Your domain is your professional address on the internet — it's what owners and property managers will type to find you. The ~$15/year cost is the only unavoidable expense in this entire tech stack.
2
Configure DNS records to point to GitHub
~10 min

DNS records are like a directory that tells the internet where to find your website when someone types your domain. You need to add 5 records total:

a
In Namecheap dashboard → click Manage next to your domain → click Advanced DNS tab
b
Delete any existing A records or CNAME records that are already there
c
Add these 4 A records (Type: A Record, Host: @, TTL: Automatic):
🌐 GitHub Pages IP Addresses — Enter all 4
185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153
d
Add 1 CNAME record: Type: CNAME, Host: www, Value: [username].github.io (replace with your GitHub username)
e
Click the checkmark to save each record
DNS propagation takes 10 minutes to 24 hours. Your site at github.io will keep working the whole time. Don't panic if your custom domain shows an error for a few hours — it's normal.

How to Check If DNS Has Propagated

Don't guess — use this free tool to see the real-time status from servers around the world:

→ DNS Checker Tool
1
Go to dnschecker.org and type your domain name (e.g. hillsidestays.net)
2
Select record type A and click Search
3
You want to see the four GitHub IP addresses showing green checkmarks across most locations. Some red X marks early on is normal — wait and recheck in 30 minutes
4
Once you see mostly green, go to GitHub → Settings → Pages → your domain should now pass the DNS check and allow you to enable HTTPS
3
Connect your domain to GitHub Pages and enable HTTPS
~5 min
a
Go back to GitHub → your repository → Settings → Pages
b
Under "Custom domain" type your domain exactly (e.g. hillsidestays.net) and click Save
c
Wait for DNS check to pass (green checkmark), then check Enforce HTTPS
HTTPS is the padlock icon in the browser address bar. It tells visitors your site is secure — without it, browsers show a "Not Secure" warning that damages trust. GitHub provides this certificate for free automatically.
4
Set up Formspree for your contact form
~10 min
→ Go to Formspree.io
a
Click Get Started Free and sign up with your business email
b
Create a new form. Copy the Form ID — it's 8 characters like mdaldwkw
c
In GitHub, open index.html → click the pencil icon ✏️ to edit in the browser
d
Use Ctrl+F / Cmd+F and search for YOUR_FORM_ID — it will appear inside the form's action attribute, which looks like: action="https://formspree.io/f/YOUR_FORM_ID". Replace only the YOUR_FORM_ID portion with your actual ID (e.g. mdaldwkw). The rest of the URL must stay exactly as-is.
e
Commit the change → wait 2 min → submit a test form on your live site
f
Check your email — the test submission should arrive. If it lands in spam, open it and click "Not Spam" and add [email protected] to your contacts
The free Formspree plan allows 50 form submissions per month. That's 50 property owner leads. When you hit that ceiling, it means the business is generating enough activity to justify the $10/month upgrade — it's a milestone, not a problem.
5
Create the Google Sheet for the owner portal
~15 min
→ Open Google Sheets

Create a new spreadsheet named [Business Name] — Owner Portal Data. Set up the first tab with this exact structure:

The sheet has two layers: a stats block at the top (rows 1–9), then four section markers (all-caps keywords in Column A) that tell the portal where each data type begins. Here is a fully populated example — copy this structure exactly, then replace the sample data with real values:

📊 Google Sheet — Full Example (Column A | Column B and beyond)
── STATS BLOCK (rows 1–9) ────────────────────────────── Col A | Col B label | value owner_name | Sarah Johnson property_name | Ridgeline Retreat ytd_revenue | $14,820 ytd_nights | 61 avg_rate | $243 occupancy | 72% next_payout | $2,140 payout_date | March 1, 2026 ── RESERVATIONS (leave row 10 as section marker) ─────── RESERVATIONS Guest Name | Check-in | Check-out | Nights | Revenue | Status Marcus Webb | Feb 14 2026 | Feb 17 2026 | 3 | $729 | Confirmed Priya Nair | Feb 21 2026 | Feb 24 2026 | 3 | $681 | Confirmed Derek Okafor | Mar 7 2026 | Mar 11 2026 | 4 | $972 | Pending ── MONTHLY EARNINGS (leave this row as section marker) ─ MONTHLY_EARNINGS Month | Gross | Management Fee | Net to Owner January 2026 | $3,850 | $693 | $3,157 February 2026 | $3,240 | $583 | $2,657 ── NOTICES (leave this row as section marker) ────────── NOTICES Your February payout of $2,657 has been sent — expect it by Feb 28. Spring bookings are strong! March is already 80% booked. ── DOCUMENTS (leave this row as section marker) ──────── DOCUMENTS 2026 Management Agreement | https://drive.google.com/file/your-link-here January 2026 Statement | https://drive.google.com/file/your-link-here
The section markers (RESERVATIONS, MONTHLY_EARNINGS, NOTICES, DOCUMENTS) must be typed exactly as shown — all caps, in Column A, with nothing else in that row. The portal scans Column A top to bottom, and when it sees one of these keywords, it switches modes and starts collecting that type of data. If a section marker is missing or misspelled, that entire tab in the portal will be blank.
Critical formatting rule: Always enter values as formatted text — type $3,850 not 3850, and 81% not 0.81. If you enter raw numbers, the portal will show dashes instead of values. The sheet does not do the formatting — you must type it.

Publishing the Sheet as a CSV

a
In Google Sheets: File → Share → Publish to web
b
First dropdown: select the specific tab name — NOT "Entire Document"
c
Second dropdown: Comma-separated values (.csv)
d
Click Publish → confirm → copy the full URL
e
Verify the URL contains &gid= followed by a number — this confirms it's tab-specific, not the whole document
✗ WRONG URL (entire document — no &gid= number): /pub?output=csv
✓ CORRECT URL (tab-specific — has &gid= number): /pub?gid=1746701891&single=true&output=csv
f
In GitHub: open owner-portal.html → click pencil icon to edit
g
Find YOUR_PUBLISHED_SHEET_CSV_URL and replace with your copied URL
h
Commit the change
04
Phase 4 · Owner Portal Setup & Operations
The Owner Portal — Three Paths
There is no single "best" method — there's a best method for your operation. Each path is fully documented below. Choose the one that matches where you are today, knowing you can migrate later without losing your data.
Best For: Scaling Operators
Path A — Softr Portal
Real login security, automatic data separation, email invite onboarding. $49/mo. The right choice when you're managing 5+ owners and want a professional, low-maintenance operation.
Best For: Smaller Co-Hosts
Path B — HTML Portal
Free, fully custom, already built for Hillside Stays. Requires GitHub edits to add owners. The right choice for 1–5 owners where every dollar matters and you're comfortable with light technical work.
Best For: Self-Managers
Path C — Google Sheet Direct
No portal at all. Hospitable routes booking data via n8n directly into a Google Sheet the owner can access. Zero portal cost or maintenance — the Sheet is the portal.
How to choose: If you have investor-level clients who expect a professional login experience, go Path A. If you're just getting started and keeping overhead at zero, go Path B. If your owners are self-sufficient and just need to see their numbers, go Path C — it's the leanest setup possible and pairs naturally with the Hospitable automation stack.

Path A — Softr Portal (Scaling Operators)

1
Create your Softr account
~5 min
→ Go to Softr.io → Softr Pricing
a
Click Get Started Free — no credit card required for the free plan
b
Sign up with your business email address
c
The free plan supports up to 10 logged-in users and 1 published app — enough to build, test, and onboard your first 2–3 real owners before upgrading
d
Upgrade to Basic ($49/mo) when you need a custom domain (portal.yourdomain.com) or have more than 10 active owners
The free plan has one meaningful limitation for production use: no custom domain. Your portal will live at something like yourbusiness.softr.app rather than portal.yourdomain.com. For a paying investor client who expects a professional experience, the $49/mo upgrade is worth doing from day one.
2
Connect your Google Sheet as the data source
~10 min
Softr doesn't store your data — it reads it from Google Sheets (or Airtable). Your spreadsheet remains the single source of truth. This means monthly data updates work exactly the same way as the HTML portal — you edit the sheet, the portal updates automatically. The difference is everything else: login, user management, and data separation are all handled by Softr instead of by you.
a
In Softr: go to Settings → Data Sources → Add Data Source → Google Sheets
b
Click Connect with Google and authorize Softr to access your Google account
c
Select your [Business Name] — Owner Portal Data spreadsheet from the list
d
Softr will import each tab as a separate data table — you should see one table per property owner tab
With Softr, you do not need to publish the sheet as a CSV or worry about &gid= URLs — Softr connects directly via the Google Sheets API. The tab-specific CSV publishing steps in the HTML portal section do not apply here.
3
Build the portal using a Client Portal template
~60–90 min
→ Softr Client Portal Templates → Softr Help Docs
a
From your Softr dashboard, click Create App → Start from Template and select a Client Portal template
b
Branding: Go to App Settings → Branding. Set your primary color (forest green: #1a3a2a), accent color (gold: #c9a84c), upload your logo, and set fonts to match your main site
c
Pages to build: Dashboard (stats overview), Reservations (table view), Earnings (monthly breakdown), Documents (file links), Messages (contact button). Use Softr's drag-and-drop block editor to add and configure each page
d
Connect data blocks to your Sheet: For each block (table, stat card, list), click it → select your Google Sheet as the data source → map the columns to the fields Softr expects
e
Set up User Groups: Go to Users → User Groups → Create a group called "Owners." Set visibility rules so each owner only sees records where their email matches a column in the Sheet (Softr calls this "conditional visibility" or "data filtering by logged-in user")
The data filtering step (sub-step e) is the most important configuration in Softr. Without it, every owner sees every other owner's data. Softr's help docs have a dedicated guide on this — search "filter data by logged-in user" in the Softr docs if you get stuck.
4
Connect your custom domain (paid plan)
~15 min + DNS wait

On the Basic plan, you can connect a subdomain like portal.yourdomain.com so owners have a professional URL instead of a softr.app link.

a
In Softr: Settings → Custom Domain → enter portal.yourdomain.com
b
Softr will show you a CNAME record to add — copy the name and value
c
Go to Namecheap → your domain → Advanced DNS → add the CNAME record Softr gave you
d
Back in Softr, click Verify — DNS propagation takes 10–30 minutes. Use dnschecker.org to track it
e
Once verified, Softr automatically provisions an SSL certificate (the HTTPS padlock) — no action needed
5
Adding a new owner in Softr
~5 min
This is where Softr pays for itself. Adding an owner goes from a 15-minute GitHub editing session to a 2-minute email invite. The owner sets their own password — you never handle credentials.
a
In your Google Sheet, add a new tab for the owner's property and populate their data
b
In Softr: go to Users → Invite User → enter their email address and assign them to the "Owners" user group
c
Softr sends them an invitation email automatically — they click the link, set their own password, and log in
d
Because of the data filtering rules you set up in Step 3, they will automatically only see their own property's data — no additional configuration needed per owner
e
Send the owner a welcome email using the template in the HTML portal section below — adjust the login URL to your Softr domain and remove the access code reference
6
Monthly data updates in Softr
~5 min/owner

This is identical to the HTML portal method — because the data source is the same Google Sheet.

1
Open the owner's tab in Google Sheets
2
Update YTD revenue, nights, occupancy, average rate, payout info
3
Add new bookings and the new monthly earnings row
4
Add any notices or messages
No GitHub. No CSV publishing. No URL copying. Just edit the sheet and save — Softr reflects the changes automatically, usually within a minute.

Path B — HTML Portal (Smaller Co-Hosts)

Use this path if you're just starting out with 1–5 owners and want to keep overhead at zero. All the technical steps and known bugs are fully documented here. When monthly management overhead starts eating into your time, that's your trigger to migrate to Path A — the data stays in the same Google Sheet, so nothing is lost.

A
Adding a New Owner (~15 min)
15 min

Before you start, collect from the new owner: their full name, email address, property name, and choose an access code for them (like a PIN — e.g. SMITH2026).

Part A — Google Sheet Setup

a
In your Owner Portal Data spreadsheet, right-click any tab at the bottom → Duplicate
b
Rename the new tab to the owner's property name (e.g. "Ridgeline Retreat")
c
Update the data in the new tab for this owner (owner_name, property_name, etc.)
d
Publish THIS TAB as CSV: File → Share → Publish to web → select the tab name specifically → CSV → Publish → copy URL
e
Confirm the URL has &gid= with a different number than the first owner's URL

Part B — GitHub Portal Update

a
Go to GitHub → your repository → click owner-portal.html → click pencil icon ✏️
b
Use your browser's Find function (Ctrl+F on Windows / Cmd+F on Mac) and search for the text owners: [ — this jumps you directly to the CONFIG section near the bottom of the file
c
You will see a list of owner objects inside square brackets. Each one starts with { and ends with }, — scroll to the last owner entry and place your cursor after its closing },
d
Press Enter to start a new line, then paste the new owner entry below (the trailing comma after the closing brace is required — don't remove it)
💻 New Owner Entry — Add to CONFIG owners array
{ email: e('their_email_username','gmail.com'), code: "THEIR_ACCESS_CODE", name: "Their Full Name", initials: "XX", sheetUrl: "PASTE_THEIR_CSV_URL_HERE", },
Never write email addresses as plain text like "[email protected]" — Cloudflare will scramble it and logins will always fail. Always use the e('username','gmail.com') format. The split-string pattern makes it invisible to the scanner.
d
Click Commit changes
e
Wait 2–5 minutes → test the login yourself before notifying the owner
f
Send the owner their portal access details using the email template below

Owner Welcome Email Template

✉️ Owner Welcome Email — Copy and Customize
Subject: Your Owner Portal is Ready — [Property Name] Hi [Owner First Name], Your owner portal is live! This is your private dashboard where you can view booking activity, earnings, upcoming payouts, and any messages from our team — all in one place. Here's how to log in: Portal URL: [YOUR DOMAIN]/owner-portal.html Email: [their email address] Access Code: [their access code] A few tips for your first login: • The portal works best on a computer browser or tablet • Bookmark the portal URL so you can find it easily each month • Data updates automatically — no need to refresh manually after I send your monthly summary • If you ever have trouble logging in, just reply to this email and I'll sort it out right away Your portal is currently showing placeholder data — I'll have your real numbers loaded before your first monthly summary goes out. Looking forward to a great partnership, [Your Name] [Business Name] [Your Phone Number]
B
Monthly Data Update (~5 min per owner)
5 min/owner
This is the beauty of the system: you never touch GitHub for data updates. The portal reads directly from the live Google Sheet. Change a number in the sheet, and the owner sees the new number the next time they refresh their browser.

Do this at the start of each month for every active owner:

1
Open the Google Sheet → navigate to the owner's tab
2
Update YTD revenue, nights booked, occupancy, average rate
3
Update the next payout amount and date
4
Add new bookings to the RESERVATIONS section
5
Add the new month row to MONTHLY_EARNINGS
6
Update NOTICES with any messages (e.g. "Your March payout has been sent!")
Remember: always type formatted values ($3,850 not 3850). Raw numbers will display as dashes in the portal.
C
Removing an Owner
~5 min
1
Go to GitHub → open owner-portal.html → click pencil icon
2
Find the owner's entry in the CONFIG owners array and delete the entire object (from { to the closing },)
3
Commit changes — the owner's login credentials are immediately invalid
4
Optionally: archive their Google Sheet tab (hide or move to a separate "Archive" sheet)

Path C — Google Sheet Direct (Self-Managers)

This path is for property owners who self-manage their own listing and just need a clean, organized view of their reservation data and earnings — no login portal required. Instead of building a portal, you bypass it entirely: Hospitable fires booking data into n8n, which writes it directly to a Google Sheet the owner can access any time. The Sheet is the portal.

Why this works: Self-managing owners are already comfortable with Google tools. They don't need a branded dashboard or a login screen — they need accurate, up-to-date numbers in one place they can trust. A well-structured Google Sheet, automatically updated by Hospitable via n8n, does exactly that with zero portal overhead on your end.
1
Create the owner's dedicated Google Sheet
~10 min
→ Open Google Sheets

Create a new spreadsheet named [Property Name] — Owner Dashboard and structure it with these tabs:

a
Dashboard tab — summary stats: YTD revenue, total nights booked, occupancy rate, average nightly rate, next expected payout. These are written by n8n each time a booking comes in or is updated.
b
Reservations tab — one row per booking. Columns: Guest Name, Check-in, Check-out, Nights, Payout Amount, Status, Platform. n8n appends a new row on every reservation.created webhook from Hospitable.
c
Monthly Earnings tab — one row per month. n8n rolls up completed bookings into this tab on the 1st of each month. Columns: Month, Gross Revenue, Management Fee, Net to Owner.
d
Notices tab — a simple text area you (the co-host or operator) update manually with messages: payout confirmations, maintenance notes, seasonal updates.
Always format values as text in your n8n workflow — write $3,850 not 3850 when appending to the Sheet. This ensures any conditional formatting or display logic works correctly.
2
Share the Sheet with the owner (view access)
~2 min
a
In Google Sheets, click Share (top right) → enter the owner's email address
b
Set their permission to Viewer — they can see everything but cannot edit the data
c
Uncheck "Notify people" if you want to send the welcome email yourself (recommended — lets you add context)
d
Click Send — the owner can now open the Sheet directly in their Google account, bookmark it, and check it any time
No login to manage. No portal to maintain. The owner bookmarks the Sheet URL once and it's always there — updated automatically every time a booking comes in. If they're a Google Workspace user, it even appears in their shared files list without any action on their end.
3
Connect Hospitable → n8n → Google Sheet (Booking Sync)
~60 min (one-time)

This is the automation that makes Path C work. See the full n8n workflow setup in the AI Automation Playbook → Workflow 1. At a high level:

1
In Hospitable: go to Settings → API → Webhooks → add your n8n webhook URL → subscribe to reservation.created and reservation.updated events
2
In n8n: create a workflow triggered by the Hospitable webhook. Parse the payload — extract guest name, check-in, check-out, nights, payout amount (divide by 100 — Hospitable sends cents), and status
3
Add a Google Sheets node: append a new row to the owner's Reservations tab with the parsed booking data
4
Add a second Google Sheets node: update the Dashboard tab — recalculate YTD revenue, total nights, occupancy, and average rate
5
Activate the workflow. From this point on, every new or updated booking in Hospitable writes to the owner's Sheet automatically — zero manual entry
📦 Hospitable Webhook Payload — reservation.created
{ "event": "reservation.created", "data": { "uuid": "res-abc123", "check_in": "2026-03-15", "check_out": "2026-03-19", "nights": 4, "guest": { "name": "Marcus Webb", "email": "..." }, "payout": { "host_payout_amount": 82400 }, // CENTS — divide by 100 → $824.00 "property_id": "prop-xyz789", "status": "confirmed" } }
4
Monthly Earnings Rollup (automated)
Set and forget

On the 1st of each month, an n8n scheduled workflow rolls up the previous month's completed bookings into the Monthly Earnings tab. This runs automatically — no action required on your part.

1
In n8n: create a second workflow with a Schedule trigger → set to run on the 1st of each month at 7:00 AM
2
Read all rows from the Reservations tab where the check-out date falls within the prior month
3
Sum the payout amounts, calculate management fee (your percentage), subtract to get net to owner
4
Append a new row to the Monthly Earnings tab: Month name, Gross, Management Fee, Net to Owner
Pair this with the AI Monthly Report from the Automation Playbook and the owner gets both the raw numbers in their Sheet and a warm narrative summary email — fully automated, every month, without you lifting a finger.
5
Adding a new self-managed owner
~15 min
1
Duplicate the Sheet template for the new owner's property
2
Share with the owner (Viewer access) and send the welcome note below
3
In your n8n booking sync workflow, add the new property's Hospitable property ID to the routing logic (use a Config tab or a lookup node to map property IDs to Sheet IDs)
4
Test by triggering a manual webhook event in Hospitable → confirm the row appears in their Sheet

Owner Welcome Note — Path C

✉️ Self-Manage Welcome Note — Copy and Customize
Subject: Your Property Dashboard is Ready — [Property Name] Hi [Owner First Name], I've set up a live dashboard for [Property Name] that updates automatically every time a booking comes in. No login required — it's a shared Google Sheet you can access any time from any device. Bookmark this link: [PASTE GOOGLE SHEET URL HERE] What's in the dashboard: • Dashboard — running totals: revenue, nights booked, occupancy, next payout • Reservations — every booking, automatically added when confirmed • Monthly Earnings — rolling monthly summary (updates on the 1st) • Notices — messages from me about payouts, maintenance, or anything else The data updates automatically from our booking system — you'll see new reservations appear within a few minutes of them being confirmed. No need to wait for a monthly email from me to see where things stand. I'll still send you a monthly summary on the 1st with a full breakdown and any notes — the dashboard just means you have live access whenever you want it. [Your Name] [Business Name] [Your Phone Number]
Hard-Won Knowledge
Known Bugs & How to Fix Them
These are real issues that came up during the Hillside Stays build in February 2026. Every one of them is documented here so you never have to debug them again.
🐛 Bug #1 — Cloudflare Email Obfuscation Breaks Login
What happens: You deploy the portal, try to log in with correct credentials, and always get "Invalid email or access code." The site looks fine but login never works.

Why: GitHub Pages (via Cloudflare's CDN) automatically scrambles any email address it detects in HTML or JavaScript — it's a spam-prevention feature. The portal stores your email in its login config, so by the time the page loads, the email in the code no longer matches what you typed.
✓ THE FIX — already in your portal
Use the split-string function instead of writing emails directly: e('username','gmail.com') instead of "[email protected]". The e() function assembles the email at runtime after the scanner has passed. Apply this in the CONFIG array, all mailto links, and the sendMessage function.
🐛 Bug #2 — Uploading Old File Wipes New CONFIG
What happens: You add a second owner to the portal but their login doesn't work and no data loads. The first owner still works fine.

Why: You uploaded an old saved copy of owner-portal.html from your computer. That old file didn't have the second owner's entry. It overwrote the current GitHub version.
✓ THE FIX
Always edit files directly in GitHub using the pencil icon — never upload a file from your computer to make a small change.
🐛 Bug #3 — Publishing Entire Sheet Instead of One Tab
What happens: The portal loads but shows wrong data, mixed data, or nothing at all.

Why: When publishing to CSV in Google Sheets, the default is to publish the entire document. But each owner needs their own specific tab published separately.
✓ THE FIX
In the Publish to web dialog, always select the specific tab name in the first dropdown. Confirm the URL contains &gid= with a number — without it, you've published the whole document.
🐛 Bug #4 — Raw Numbers Show as Dashes in Portal
What happens: The portal loads but all financial values show as "—" (dashes) instead of amounts.

Why: Values were entered as raw numbers in Google Sheets (3850) instead of formatted text ($3,850). The portal expects pre-formatted strings.
✓ THE FIX
Always type the $ and % symbols directly in the cell. The sheet is a data source, not a calculator — it does not format for you.
🐛 Bug #5 — GitHub Pages Rebuild Delay Causes Confusion
What happens: You commit a change and immediately refresh the live site — it shows the old version. Panic ensues.
✓ THE FIX
Wait 2–5 minutes after every commit before checking the live site. GitHub rebuilds on its own timeline. If you're still seeing the old version after 5 minutes, do a hard refresh: Ctrl+Shift+R (Windows) or Cmd+Shift+R (Mac).
🐛 Bug #6 — Portal Looks Broken When Opened From Desktop
What happens: You double-click owner-portal.html on your computer and it looks like unstyled plain text with no layout.
✓ NOT A BUG — Normal Behavior
The portal is designed to be served via a web server (GitHub Pages), not opened as a local file. Always test the portal at your live GitHub or custom domain URL, never by double-clicking the file on your desktop.
🔧
Reference
Owner Portal Troubleshooting
Use this when something isn't working in the portal. Start at the top and work down — most issues are resolved by step 2 or 3.
❓ Problem: Login fails with correct credentials
Check 1 — Email obfuscation. Open owner-portal.html in GitHub. Search for the owner's email. If it appears as a plain string like "[email protected]" instead of e('owner','gmail.com'), Cloudflare has scrambled it. Fix: rewrite using the split-string format and commit.

Check 2 — Access code case. The code comparison is case-insensitive, but double-check there are no leading/trailing spaces in the code field in the CONFIG.

Check 3 — Stale GitHub Pages cache. After a recent commit, wait 5 minutes and hard-refresh (Ctrl+Shift+R / Cmd+Shift+R) before testing again.
Quick test
Ask the owner to try logging in from a private/incognito browser window — this rules out any cached session data on their device.
❓ Problem: Portal loads but shows no data (all dashes or blanks)
Check 1 — Sheet URL in CONFIG. In GitHub, find the owner's entry in the CONFIG array. Copy their sheetUrl value and paste it into a new browser tab. It should load a plain CSV file (comma-separated text). If it shows a Google error page, the URL is wrong or the sheet isn't published.

Check 2 — Tab-specific URL. Confirm the URL contains &gid= followed by a number. If it ends in just /pub?output=csv, you published the whole document instead of their specific tab. Republish the correct tab and update the URL in GitHub.

Check 3 — Section markers. Open the owner's Google Sheet tab. Confirm that RESERVATIONS, MONTHLY_EARNINGS, NOTICES, and DOCUMENTS appear in Column A exactly as shown — all caps, nothing else in that row.
Quick test
Paste the sheetUrl directly in your browser. If it loads CSV text — the URL is fine, and the issue is in the sheet structure. If it shows an error — fix the URL first.
❓ Problem: Data shows but values display as dashes (—)
This is always a formatting issue in the Google Sheet. The portal expects pre-formatted strings, not raw numbers.

Open the owner's tab and check every value in the stats block (rows 1–9). Any cell that contains a plain number like 3850 or 0.81 needs to be retyped as $3,850 or 81%. Save the sheet — the portal updates automatically within a minute.
❓ Problem: One owner's data works, another owner sees the first owner's data
This means two owners are pointing to the same Google Sheet CSV URL. In the CONFIG, each owner must have their own unique sheetUrl pointing to their specific tab.

In GitHub, open owner-portal.html and compare the sheetUrl values for both owners — they must have different &gid= numbers. If they're the same, go back to Google Sheets, publish the correct tab separately, and update the CONFIG with the new URL.
❓ Problem: Owner says the portal looks broken (unstyled text, no layout)
If they're opening the file from their desktop — this is expected. The portal must be accessed via the live URL, not by double-clicking the file. Send them the correct URL: [yourdomain.com]/owner-portal.html

If they're accessing via the URL — open the URL yourself to confirm it looks correct. If it's broken for everyone, check GitHub to make sure the most recent committed version of owner-portal.html is intact and that all files are still in the root of the repository.
❓ Problem: Owner can't find the portal or forgot the URL
The portal URL is always: [yourdomain.com]/owner-portal.html

Suggest the owner bookmark it. You can also add a direct link to the portal in their welcome email and in your monthly summary emails so they always have it. Consider adding a subtle "Owner Login" link in your main site footer if you want it more discoverable.
05
Phase 5 · Final QA
Pre-Launch Checklist
Run through every item below before calling the site live and telling owners they can log in.

Website

Contact Form

Owner Portal

Looking Ahead
Tech Stack Growth Roadmap
The system you've built is designed to grow with you. Here's when and how to upgrade each component.
This roadmap reflects all three portal paths. The website, domain, and Google Sheet infrastructure stays the same across all of them — you're only choosing which layer sits on top. Hospitable + n8n automations apply to any path and can be added at any scale.
Path A · Scaling Operators
Softr Portal
Real login, automatic data separation, email invite onboarding. $49/mo on paid plan. Best when you're managing 5+ owners and client professionalism matters.
Path B · Smaller Co-Hosts
HTML Portal
Free, already built for Hillside Stays. Requires GitHub edits per owner. The right zero-overhead starting point for 1–5 owners. Migrate to Softr at 5–7 owners.
Path C · Self-Managers
Google Sheet Direct
No portal. Hospitable → n8n → Google Sheet. The owner bookmarks a shared Sheet and sees live booking data without any login. Zero portal cost or maintenance.
Any Path · When Ready
Add n8n + Hospitable
Connect Hospitable to Google Sheets via n8n. Eliminates manual monthly data entry — bookings flow in automatically. Essential for Path C; a major upgrade for Paths A and B.

Three Portal Paths — Side-by-Side

Factor Path A — Softr Path B — HTML Portal Path C — Sheet Direct
Best For Scaling operators, 5+ owners, investor-grade clients Smaller co-hosts, 1–5 owners, budget-conscious Self-managing owners who just need their numbers
Monthly Cost $49/mo (paid) · Free to test $0 $0
Owner Login Real email + password login Access code only No login — shared Google Sheet link
Adding an Owner Email invite — 2 min Edit GitHub file + manage CSV URLs (~15 min) Share Sheet + add property to n8n routing (~15 min)
Data Separation Automatic — each owner sees only their data Manual — separate tab + URL per owner Separate Sheet per owner — fully isolated
Booking Data Updates Manual Sheet updates (~5 min/owner/mo) or n8n automated Manual Sheet updates (~5 min/owner/mo) or n8n automated Fully automated via Hospitable + n8n
Technical Complexity Low — drag-and-drop editor Medium — GitHub edits, CSV URLs Medium — n8n workflow setup (one-time)
Requires Hospitable No (works with any PMS) No (works with any PMS) Yes — webhook integration required
The bottom line: None of these three paths is universally best — they each win for a specific operator type. Path C is the most automated when paired with Hospitable, but requires that PMS. Paths A and B work with any booking platform and give you a branded portal experience. You can run different paths for different clients simultaneously.

Revisiting Your Tech Stack — Prompt for Future Claude Sessions

When you're ready to upgrade or troubleshoot anything in this stack, start a new Claude conversation and paste the prompt below. It will give Claude all the context needed to help you modify, extend, or migrate your system.

🤖 Context Prompt — Use for Future Claude Sessions
I run an STR co-hosting business. My website is built in pure HTML/CSS/JS hosted on GitHub Pages at [YOUR GITHUB URL]. The site includes a working owner portal (owner-portal.html) that authenticates owners via a CONFIG object and pulls live data from published Google Sheet CSV tabs. Owner portal path (check which applies): [ ] PATH A — SOFTR: Portal lives at [your softr domain]. Google Sheet connected as data source. Owners invited via email — no access codes. Data filtering set up by logged-in user email. [ ] PATH B — HTML PORTAL: owner-portal.html hosted on GitHub Pages. Owners authenticate via CONFIG object. Each owner has tab-specific CSV URL. Email obfuscation via e('user','domain.com') split-string format. [ ] PATH C — SHEET DIRECT: No portal. Hospitable fires reservation.created webhooks → n8n → Google Sheet per owner. Owner has Viewer-only access to their Sheet. n8n handles booking sync and monthly earnings rollup. Key technical details (HTML portal only, if applicable): - All emails use split-string obfuscation: e('user','domain.com') to avoid Cloudflare scrambling - Each owner has their own Google Sheet tab published as a separate CSV (tab-specific &gid= URL) - Data must be formatted text ($3,850 not 3850) or portal shows dashes - GitHub Pages rebuilds take 2–5 minutes after each commit - Edit files using GitHub's built-in browser editor (pencil icon) — never upload from local I'm looking for help with: [DESCRIBE WHAT YOU NEED] Reference site for quality standard: hillsidestays.net
$
Cost Summary
What This Tech Stack Costs
Designed to operate at near-zero monthly cost at the pre-revenue stage.
Service What It Does Cost Upgrade Trigger
GitHub Pages Website hosting Free Never — works indefinitely
Namecheap Domain Custom URL (yourbusiness.com) ~$15/yr N/A — renew annually
Formspree Contact form submissions Free (50/mo) 50+ leads/mo → $10/mo
Google Sheets Owner portal data Free Never for this use
Claude AI Building & maintaining code Free tier available Claude Pro at $20/mo if heavy use
Softr Owner portal — Path A (scaling operators) $49/mo (paid) · Free to test Upgrade when ready for custom domain or 10+ users
n8n Cloud Automation layer for Path C (Sheet Direct) $20/mo (Starter) Required for Path C; optional add-on for Paths A & B
Total at Launch — Path A (Softr) ~$64/mo + $15/yr domain
Total at Launch — Path B (HTML Portal) ~$15/year only
Total at Launch — Path C (Sheet Direct + n8n) ~$35/mo + $15/yr domain