Ops command view: day counts, money collected, and network gateway health β then the detail boards below.
Arrivals
| Site | Guest | ETA | Party | Out | Deposit |
|---|
Departures
| Site | Guest |
|---|
Deposits due
| Site | Guest | Check-in | Amount |
|---|
Dirty sites
| Site | Last checkout |
|---|
Open work orders
| Site | Title | Priority | Status |
|---|
Day Passes & Visitors
| Pass # | Visitor | Type | Vehicle | Paid | WiFi |
|---|
Campsite Deliveries (Wood & Ice)
| Site | Guest | Items | Runner | Status |
|---|
Camp store
Store sales today $0.00 Β· 0 transactions
Click an empty cell to book a single night, or click-and-drag across empty cells to select a range and choose New Reservation or Add Block. Drag an upcoming stay (amber) to move dates/site. Drag a checked-in / walk-in bar onto another site to relocate mid-stay (broken pad, etc.) β or use Move to Another Site on the Sites tab. Edge handles shorten/extend upcoming stays only.
Live site status on your uploaded park image. Click a pin for the same details as the Sites tab. Sites without a placed pin don't appear here — place pins under Settings → Park & Branding → Park map.
Anything that needs attention on a site or around the park — guest-reported WiFi issues land here automatically. Use the buttons on a row to start, complete, or reassign it.
| Site | Title | Category | Priority | Status | Assigned to | Created |
|---|
After a guest checks out, the site lands here as Dirty. Walk each site Dirty → Clean → Inspected → Ready before the next guest arrives. Occupied sites are hidden so this stays a turn-over board, not a guest list.
A simple log of park equipment and when it was last serviced — mowers, golf carts, pool pumps, anything worth tracking.
| Name | Category | Location | Status | Last service |
|---|
Park-defined rental catalog β kayaks, golf carts, court time, anything with units, an optional deposit, and a return. To book one for a guest, open that guest's reservation; this tab is catalog admin plus a park-wide view of what's out.
| Name | Category | Unit | Price | Deposit | Units | Available | Active |
|---|
| Guest | Item | Qty | Status | Deposit | Due back |
|---|
Messages
Reach guests who are on site or holding an upcoming reservation — email, text/MMS, or a spoken phone broadcast. Configure SMTP and Twilio under Settings β Guest Communication first.
Compose email
Recipients
| Guest | Site |
|---|
Compose text
MMS needs a publicly reachable https:// image. Leave blank for a plain text.
Recipients
| Guest | Site | Phone |
|---|
Phone broadcast
Places an automated call to each selected guest and speaks your message (Twilio Voice). Use for cancellations, weather, or other time-sensitive alerts. Your Twilio number must support Voice.
Recipients
| Guest | Site | Phone |
|---|
Recent sends
Last bulk emails, texts, and phone broadcasts from this park.
| When | Channel | Summary | Sent | Failed | By |
|---|
Post-stay feedback
Responses from the checkout survey link. Use follow-up filter when a guest asked to be contacted.
| When | Guest | Site | Overall | Arrival | Site | Follow-up | Comments |
|---|
Settings
Grouped by what you're trying to do -- pick a section below. If you're not sure where something lives, Overview is a good place to start.
Selling ice, firewood, or other camp store items? Ring up a sale from the Sites or Today tab's "Camp store" button -- manage products here under Sites & Rates → Camp Store.
System Health
A quick "is everything OK" glance -- useful before calling anyone for help, or when helping remotely.
Setup Wizard
Walks you through business info, guest email, your internet connection, site inventory, and payment details. Runs automatically the first time; use this any time you want to revisit it.
1-Click System Pre-Flight Diagnostics
Deep-checks database latency, backup redundancy, UniFi gateway API, outbound email/SMS gateways, hardware relays, and background cron workers.
Property Profile & Modular Feature Scope
Tailor GuestGrounds to your exact property type. Turn off modules you don't need (e.g. Marina, Kitchen HACCP, Aquatics) to keep the staff dashboard clean, focused, and fast.
Park
The main campground network. UniFi assigns each campsite an isolated PPSK passphrase, VLAN, and bandwidth limits dynamically upon check-in.
Protected operational network for front-desk workstations, POS tablets, and security cameras. Isolated on its own VLAN so guest devices can never reach office equipment.
Office passphrase is kept on the guest SSID as Dynamic PSK. If you set a dedicated Office SSID, that network uses the same passphrase and VLAN. Leave passphrase blank to keep the saved one; leave VLAN blank to keep office on Default LAN.
Site N uses VLAN base + N when the site has no VLAN set (e.g. base 100 β site 4 = VLAN 104). Default /24: VLAN 104 β 10.81.104.0/24; VLAN 256 β 10.82.0.0/24. A tighter prefix packs more VLANs; a wider one gives more devices per pad. Set this before Sync Networks β changing it later will not rewrite existing gateway subnets.
Guests can book at /book.html and purchase add-ons (firewood, s'mores, etc.) when reserving. Same-day check-in works into the evening (server local date) unless a site type sets a same-day cutoff hour β keep the Contabo server timezone matched to the park. Off until you're ready.
Only charged when a guest picks an exact site on the map or list β a "site assigned at check-in" booking never gets it. Shown to guests as "Pay to hold this exact site."
Cancellation policy
Embed booking widget
Let guests book straight from your own website via an iframe or script tag — no separate CMS needed. Reuses the same online booking flow as book.html. Requires Enable online reservation portal for guests above.
Widget Theme & Brand Colors
Customize colors, typography, and shape so the embedded widget looks like a native part of your website.
Leave blank to allow the booking API to be called from any website (simplest; matches how book.html already works today). Listing sites here blocks other sites' own scripts from calling the booking API directly. It does not, by itself, stop a site from putting the widget in an iframe -- that works with no allowlist entry needed, same as any other iframe embed.
Park map
Upload a photo or diagram of your park, then place a pin for each site. Staff get a live status map (Map tab); guests can optionally pick their site on the map when booking online.
Pin editor
Click Place pin next to a site, then click anywhere on the map to drop it there. Drag an existing pin to move it. Each change saves immediately.
Amenities
Optional pins for things guests look for -- restrooms, dump station, playground, laundry, office. Shown with a legend on the same map above (and on the guest booking map, if enabled).
GuestGrounds license
Product site: guestgrounds.com. Leave blank for a full unlock (typical for a single self-hosted park). Paste a plan key to unlock only the modules you bought. Core Desk and WiFi Ops stay available on every plan.
Optional features
Advanced tools stay off until you need them. Turn on a pack for a group, or flip individual switches. Everything below is already built into the app — enabling only shows it.
Packs
Individual
Weather Widget
Shows current conditions and a short forecast on the lobby kiosk (Tablet Kiosk Mode, under Guest Communication). Powered by a free weather service — no account or API key needed. Just tell it what town you're near.
πΊ 4K Digital TV Signage Display
Multi-channel ambient signage loop for TVs in the clubhouse, lobby, camp store, pool, and gate. Target different slides to specific screens or broadcast park-wide.
| Title | Category | Target Screen | Duration | Status | |
|---|---|---|---|---|---|
| Loading playlist slides⦠| |||||
Site Inventory
The park's physical sites — site number, VLAN, bandwidth profile, and rate type. These rarely change (only when a site is built, renumbered, or decommissioned). Day-to-day guest check-in/check-out happens on the Sites tab, not here.
| Site # | VLAN | Profile | Site type | Status |
|---|
Sync Networks creates/updates gateway VLANs and bandwidth groups from this inventory (and the office VLAN). Guest passphrase sync will not create networks — only bind passwords to VLANs that already exist.
Bandwidth Profiles
Download/upload tiers assigned to sites (e.g. Standard, Premium, Unlimited). Applied to network gateway when you click Sync Gateway Networks on Site Inventory (one SSID, per-site VLAN + usergroup).
| Name | Download | Upload | Default |
|---|
Wireless Bandwidth Calculator
Enter what your internet plan provides, hold back what the park office needs, and split the rest evenly across your sites to get a suggested per-site speed limit.
Site Types & Rates
Rate categories assigned to sites (e.g. Standard, Premium, Pull-Through) with an optional nightly rate shown when booking a reservation.
| Name | Nightly | Weekly | Monthly | Min Stay | Description | Default |
|---|
Seasonal & Dynamic Rate Rules
Date-range overrides layered on top of a site type's base rates — e.g. a "Summer Season" rule that raises the nightly rate and requires a 3-night minimum stay for June through August. Rules repeat every year automatically and don't need a specific year. When two rules overlap the same date, the one with the higher priority wins.
| Name | Site Type | Dates | Nightly | Weekly | Monthly | Min Stay | Priority | Enabled |
|---|
Add-ons
Extras guests can purchase with a reservation (staff booking or the online portal) — firewood, s'mores kits, and anything else you sell for the stay. Prices are locked onto each reservation when it's booked.
| Name | Price | Description | Enabled |
|---|
Promotion Codes
Offer a percentage or fixed discount with optional date, minimum-stay, site-type, subtotal, and usage limits.
| Code | Discount | Limits | Enabled |
|---|
Camp Store
Simple product catalog for front-desk sales charged to a guest folio (ice, firewood, merchandise). Ring up sales from the Today tab.
| Name | Category | Price | Stock | Active |
|---|
Self-service kiosk
Park Credit / Gift Cards
Stored-value codes guests can redeem against a reservation folio. Not a payment processor β staff issue and redeem codes here.
| Code | Balance | Issued to | Expires | Status |
|---|
Utility Meter Billing
Rates used when billing electric and water meter reads on long-term / seasonal reservations. Record reads on the reservation folio, then bill usage to the folio.
Example: 100 kWh Γ $0.15 = $15.00
External OTA & Two-Way iCal Calendar Sync
Export live availability feeds to Apple Calendar, Google Calendar, Airbnb, VRBO, or Hipcamp — and import external OTA feeds to automatically hold and block dates on specific sites.
Export Feeds
Subscribe to these URLs in your calendar app or paste into Airbnb / VRBO "Import Calendar" settings to block booked dates.
Inbound OTA Feeds (Import)
Add iCal URLs from Airbnb, VRBO, or Hipcamp for each site. GuestGrounds will periodically fetch and block those dates to prevent double-bookings.
| Site # | Feed Name | URL | Last Sync | Status |
|---|
Network Gateway Connection
Generate an API key in your network gateway console (e.g. Settings → Control Plane → Integrations). Live sync and live stats are best-effort — if your gateway API doesn't match, sites fall back to clear manual instructions.
Newer gateway consoles need the site’s UUID here. Click Test Connection and we’ll fill it in when there’s only one site.
Physical Gate & Access Relay
Sends automated webhook pulses to barrier gates, smart magnetic relays (e.g. Shelly 1 / Pro), and cloud access controllers upon guest check-in, checkout, or staff manual trigger.
Recent Gate Access Logs
| Time | Event | Target / User | Result | Status |
|---|
On-Site Agent
If this dashboard is hosted somewhere off-site (a VPS, not on the park's own network), it can't reach your gateway controller directly anymore. Switch to "Agent (remote)" and run the small relay agent (agent/ folder, see agent/README.md) on a machine at the park — it opens an outbound connection here so no ports need to be opened on your router.
Sent to the alert email address configured under Network Monitoring below -- also requires background monitoring to be enabled there.
Regenerating invalidates the current token immediately — the on-site agent will need its config updated and restarted with the new value.
Integration API
Read-only API keys for external tools (Zapier, scripts). Use Authorization: Bearer <key> or X-API-Key against /api/open/v1/ endpoints.
API examples (copy & paste)
Replace YOUR_KEY with a key you create below. Keys are shown once at creation.
curl -H "Authorization: Bearer YOUR_KEY" https://your-park.example/api/open/v1/sites
curl "https://your-park.example/api/open/v1/availability?siteTypeId=TYPE_ID&checkIn=2026-07-01&checkOut=2026-07-05" -H "Authorization: Bearer YOUR_KEY"
curl "https://your-park.example/api/open/v1/reservations?from=2026-07-01&to=2026-07-31" -H "Authorization: Bearer YOUR_KEY"
curl "https://your-park.example/api/open/v1/occupancy?date=2026-07-01" -H "Authorization: Bearer YOUR_KEY"
| Label | Prefix | Created | Last used |
|---|
Outbound webhooks
Optional: push events to a URL instead of polling the read-only API above. Each delivery is a signed POST β verify it with the snippet below before trusting the payload.
| Label | URL | Events | Enabled | Last delivery |
|---|
Webhook payload & signature verification
Every delivery is a POST with an X-RV-Park-Event header and an X-RV-Park-Signature header (HMAC-SHA256 of the raw body, hex-encoded, using the secret shown once when you create the webhook).
{
"event": "reservation.checked_in",
"timestamp": "2026-07-01T15:04:00.000Z",
"parkName": "Sunny Pines RV Resort",
"data": {
"id": "β¦",
"guestName": "Jamie Rivera",
"siteNumber": "14",
"checkIn": "2026-07-01",
"checkOut": "2026-07-05",
"status": "checked_in"
}
}
Verify the signature in Node (or any language with HMAC-SHA256):
const crypto = require('crypto');
const expected = crypto.createHmac('sha256', WEBHOOK_SECRET).update(rawBody).digest('hex');
const valid = expected === req.headers['x-rv-park-signature'];
Use the raw, unparsed request body for the HMAC β not JSON.stringify(req.body), which can reformat whitespace and break the signature.
| Time | Webhook | Event | Result |
|---|
Network Monitoring
Runs in the background while the dashboard is running: checks internet reachability every few minutes, optionally runs a real download speed test, and flags occupied sites showing zero connected devices. Uses the SMTP settings above to send alert emails.
Receipt Setup
Shown on the printable check-in receipt (Sites tab and Reservations). Business name falls back to the park name above if left blank.
Guest payment apps
Used on printable receipts and the desk βDisplay β¦ QRβ buttons when a guest pays that way. Same idea for both β paste the parkβs handle.
Stripe card & ACH payments
The Stripe secret key and webhook secret stay in the server's .env file. This only enables Checkout and optionally records the publishable key for a future embedded card form.
Significantly lower transaction fees for large stays and monthly lease payments (capped at $5 on Stripe, vs. 2.9% + 30Β’ for cards). Automatically enabled for monthly reservations.
Guest Email (SMTP)
Used for the "Email QR to Guest" button. Works with any SMTP provider — Gmail/Workspace (use an app password), Microsoft 365, or a transactional email service.
Guest Emails
Automatic emails sent to guests using the SMTP settings above — separate from the manual "Email QR to Guest" button on a site. Each one no-ops silently if the guest has no email on file or SMTP isn't configured.
When feedback is on, checkout always creates a private survey link. If thank-you email is on and the guest has an email, the link goes in that message; otherwise staff get a Copy link prompt at checkout (text it or show it at the desk).
Edit message templates
Allowed placeholders: {{parkName}}, {{guestName}}, {{firstName}}, {{siteNumber}}, {{checkIn}}, {{checkOut}}, {{manageUrl}}, {{surveyUrl}}, {{rebookUrl}}, {{promoCode}}.
Booking confirmation
Arrival reminder
Thank-you
Annual rebooking reminder
Scheduled reports
Email a daily ops + accounting digest to the owner or accountant. Uses the SMTP settings above. Local server clock hour; runs at most once per day.
Guest SMS (Twilio)
Texts and phone broadcasts use the same Twilio account. Enable SMS below, then use the Messages tab to text guests or place a spoken voice call (your Twilio number must support Voice). WiFi credential texts still use the toggles further down.
Guest SMS
Automatic texts sent to guests using the Twilio settings above. Each one no-ops silently if the guest has no phone number on file or SMS isn't configured.
Guest text Inbox (two-way SMS)
Lets guests text your Twilio number back β replies land in Messages β Inbox, matched to the guest's reservation. Uses the same Twilio account configured above.
In your Twilio console: phone number β Messaging β "A message comes in" β Webhook β
Digital Check-In & Waiver
Shown to guests who complete check-in on their own phone via a "Digital Check-In Link" from the Sites or Reservations tab. Since this dashboard is self-hosted, that link only works once the guest is already connected to the park WiFi.
Reservation Forms
Edit the forms staff can attach to a reservation. Each attached form keeps its own copy of this text, so later edits do not change past signed records.
Guest Document Uploads
Let upcoming guests share small ID, insurance, pet vaccination, or other documents through their secure Manage My Stay link. Files lock at check-in.
Allowed categories
Require before check-in
Guest Arrival Hub
Shown securely inside Manage My Stay. New parks get starter text based on common RV-park practices (check-in times, quiet hours, pets, WiFi, safety). Edit everything for your park. Use one short step per line in checklist fields.
Tablet Kiosk Mode
A self-serve, full-screen page for a lobby tablet. Guests can look up their reservation by name to check themselves in, or view rates, vacancy, and WiFi/contact info without any login. Opens in a new tab — leave it running on a mounted tablet connected to the park WiFi.
Staff SOP (desk cheat sheet)
Internal front-desk steps β not shown to guests. Also available from Today β Desk SOP.
Staff Accounts
Admins can manage settings, profiles, and this list. Staff can check guests in/out, sync, and email/print WiFi cards.
| Name | Username | Role |
|---|
Team Members (No Login)
People who help run the park but don't need their own dashboard login — e.g. a part-time cleaner or a contracted handyman. Add them here so they show up in the "Assigned to" list on Work Orders.
| Name | Role | Phone | Active |
|---|
Staff Time Clock & Labor Timesheets
Record staff clock-in / clock-out punches, track break times, review labor hours, and generate timesheet summaries.
| Staff Member | Clock In | Clock Out | Break | Worked | Notes |
|---|
Shift Scheduling Roster
Plan employee shifts, front-desk staffing, and housekeeping schedules.
| Date | Staff Member | Department | Start | End | Notes |
|---|
On this computer (always on)
GuestGrounds writes a verified copy of the dashboard automatically about every 6 hours, and again right before Restore or Factory Reset. Copies rotate (recent + daily + weekly) plus a last-good.json. These files live next to the live data, so they survive a bad restore — they do not survive this PC or VPS dying. That takes the second copy below.
Second copy (USB / NAS / cloud folder)
This is the copy that survives a dead disk — after it actually leaves this computer. Point at a USB drive, a mapped network share, another disk, or a cloud-sync folder on this PC (OneDrive, Google Drive, Dropbox). GuestGrounds writes the file; the sync app uploads it. Wait until that app shows the copy is done — “sync pending” is not a backup yet. A folder on the same PC is not enough by itself.
Carbonite, Backblaze, and similar PC backup programs are not a folder you pick here: include the local vault (data\backups) and/or this second-copy folder in those programs. On a VPS, mount a share or use rclone / object storage (see the deploy notes); the Windows OneDrive folder is for a park PC, not the Linux server.
Browse opens the same style of Windows Explorer folder window used elsewhere on this PC. If that isn’t available, you’ll get an in-page folder list instead.
Download / restore
Download a full backup to take off-site (USB, another PC). The file includes credentials (Gateway API key, agent token, SMTP password, Twilio auth token, staff password hashes) — store it like a password vault. Restore replaces the live dashboard; a safety copy of what is here now is saved first.
Restoring replaces everything currently in the dashboard with what is in the chosen file.
Guest Privacy & Data Retention (GDPR / CCPA)
Redact personal identifiable information (names, emails, phones, vehicle license plates, notes, document uploads) on completed or cancelled stays older than a chosen cutoff date. Folio financial totals, rates, and date ranges are preserved for accounting and tax reconciliation.
Danger Zone
Wipes every site, reservation, staff account, report record, and setting back to the application’s defaults. A safety copy of the current dashboard is saved first (on this computer, and to the second folder if that is enabled). You will be signed out and returned to initial setup.
Store charges grouped from reservation folios. Product names, categories, and prices are preserved as they were when each sale was posted.
By product
| Product | Category | Quantity | Sales |
|---|
Billed electric and water meter charges from reservation folios (method: meter).
By reservation
| Guest | Site | Electric | Water | Total | Statement |
|---|
Formal night audit: operations snapshot, settlement totals, and revenue vs cash variance. Print for shift handoff without recording a daily close.
Payments collected
| Guest | Site | Method | Amount | When |
|---|
Owner view of charged revenue by category (lodging, camp store, add-ons, site-lock fees, utilities, other) for a date range β based on folio charge lines.
| Category | Amount | Share |
|---|
Every guest who has ever completed a stay, for future marketing outreach. Built automatically from stay history at checkout.
| Name | Phone | Address | Opt-in | Visits | Nights | Total spend | First visit | Last visit | Sites |
|---|
| Date | Site | Guest | Nights | Revenue | Payment method |
|---|
Monthly invoices for long-term / seasonal guests. Turn on Monthly billing on an occupied site (or at reservation check-in). Periods generate automatically; record cash/Venmo/check here the same way as a stay receipt.
| Site | Guest | Period | Amount | Status |
|---|
Occupancy rate, average daily rate (ADR), and revenue per available site (RevPAR) for a period, plus how fully booked the calendar already is for the weeks ahead.
| Date | Occupied | Total Sites | Occupancy % |
|---|
Booking Pace
Share of available site-nights already booked, looking forward from today.
Outstanding reservation folio balances and unpaid monthly invoices, grouped by age.
| Bucket | Guest | Site | Due | Days | Balance | Kind |
|---|
Reservations grouped by staff/portal source, campaign, and referrer. No fingerprinting or hidden guest tracking is used.
| Source | Campaign | Referrer | Reservations | Cancelled |
|---|
How often each site has been rented, and for how much.
| Site | Times rented | Total nights | Total revenue |
|---|
Cash-drawer view of folio payments recorded today (card / cash / Venmo / Cash App / check). Open balances and deposits due are listed so you can clear money before close.
Payments this day
| Time | Site | Guest | Method | Amount | Ref | By |
|---|
Deposits still due
| Site | Guest | Check-in | Amount |
|---|
Open folio balances
| Site | Guest | Status | Balance |
|---|
Refunds still owed
Recorded automatically when a reservation with paid money is cancelled. Clears itself once staff post a Refund transaction on that reservation's folio covering the amount.
| Site | Guest | Since | Amount |
|---|
Night audit for multi-shift parks: ops snapshot plus settlement reconciliation (revenue vs collected). Record one close per calendar day.
Arrivals
Departures
Recent closes
| Date | Closed at | By | Variance | Notes |
|---|
Who did what, and when — logins, check-ins/checkouts, payments, and changes to sites, rates, users, and settings. This list is read-only; the newest entries are shown first.
| When | User | Role | Action | Target | Details |
|---|