πŸ“² Install this dashboard as an app for quicker access β€” tap to install.

Sites & Occupancy

Camp store
Print WiFi Cards
Active Radios & Sites ⚑
β€” / β€”
Calculating occupancy…
Connected Guest Devices πŸ“±
β€”
Live UniFi client telemetry
Live Park Throughput πŸ“Ά
β€” Mbps
↓ β€” Mbps  Β·  ↑ β€” Mbps
UniFi Gateway Status πŸ›‘οΈ
Connected
UCG-Fiber  Β·  Live Sync Active

Today

Ops command view: day counts, money collected, and network gateway health β€” then the detail boards below.

Arrivals

SiteGuestETAPartyOutDeposit

Departures

SiteGuest

Deposits due

SiteGuestCheck-inAmount

Dirty sites

SiteLast checkout

Open work orders

SiteTitlePriorityStatus

Day Passes & Visitors

Pass #VisitorTypeVehiclePaidWiFi

Campsite Deliveries (Wood & Ice)

SiteGuestItemsRunnerStatus

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.

Reservations

Upcoming Checked in (reservation or walk-in) Extended stay (indefinite) Blocked (no guest) Site TBD (type-only hold) Click to book, or drag to select a range Top edge: balance due Top edge: paid / settled Edge handles: extend / shorten

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.

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.

Work Orders

SiteTitleCategoryPriorityStatusAssigned toCreated

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.

Turn Board

A simple log of park equipment and when it was last serviced — mowers, golf carts, pool pumps, anything worth tracking.

Equipment

NameCategoryLocationStatusLast 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.

Catalog

NameCategoryUnitPriceDepositUnitsAvailableActive

Bookings

GuestItemQtyStatusDepositDue 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

GuestSiteEmail

Compose text

MMS needs a publicly reachable https:// image. Leave blank for a plain text.

Recipients

GuestSitePhone

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

GuestSitePhone

Recent sends

Last bulk emails, texts, and phone broadcasts from this park.

WhenChannelSummarySentFailedBy

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.

    Domain Feature Modules 10 of 10 Active

    Park

    Guest WiFi Network Campers • Dynamic PPSK

    The main campground network. UniFi assigns each campsite an isolated PPSK passphrase, VLAN, and bandwidth limits dynamically upon check-in.

    Office & Staff Network Admin • Isolated VLAN

    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 #VLANProfileSite typeStatus

      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).

      NameDownloadUploadDefault

      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.

      NameNightlyWeeklyMonthlyMin StayDescriptionDefault

      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.

      NameSite TypeDatesNightlyWeeklyMonthlyMin StayPriorityEnabled

      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.

      NamePriceDescriptionEnabled

      Promotion Codes

      Offer a percentage or fixed discount with optional date, minimum-stay, site-type, subtotal, and usage limits.

      CodeDiscountLimitsEnabled

      Camp Store

      Simple product catalog for front-desk sales charged to a guest folio (ice, firewood, merchandise). Ring up sales from the Today tab.

      NameCategoryPriceStockActive

      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.

      CodeBalanceIssued toExpiresStatus

      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 NameURLLast SyncStatus

      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

      TimeEventTarget / UserResultStatus

      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"
      LabelPrefixCreatedLast 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.

      LabelURLEventsEnabledLast 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.

      TimeWebhookEventResult

      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.

      NameUsernameRoleEmail

      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.

      NameRolePhoneActive

      Staff Time Clock & Labor Timesheets

      Record staff clock-in / clock-out punches, track break times, review labor hours, and generate timesheet summaries.

      Total Labor Hours
      0.0 hrs
      Total Punches
      0
      Staff MemberClock InClock OutBreakWorkedNotes

      Shift Scheduling Roster

      Plan employee shifts, front-desk staffing, and housekeeping schedules.

      DateStaff MemberDepartmentStartEndNotes

      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.

        Reports

        Store charges grouped from reservation folios. Product names, categories, and prices are preserved as they were when each sale was posted.

        By product

        ProductCategoryQuantitySales

        Billed electric and water meter charges from reservation folios (method: meter).

        By reservation

        GuestSiteElectricWaterTotalStatement

        Formal night audit: operations snapshot, settlement totals, and revenue vs cash variance. Print for shift handoff without recording a daily close.

        Payments collected

        GuestSiteMethodAmountWhen

        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.

        CategoryAmountShare

        Every guest who has ever completed a stay, for future marketing outreach. Built automatically from stay history at checkout.

        NameEmailPhoneAddressOpt-inVisitsNightsTotal spendFirst visitLast visitSites

        DateSiteGuestNightsRevenuePayment 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.

        SiteGuestPeriodAmountStatus

        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.

        DateOccupiedTotal SitesOccupancy %

        Booking Pace

        Share of available site-nights already booked, looking forward from today.

        Aged Balances

        Outstanding reservation folio balances and unpaid monthly invoices, grouped by age.

        BucketGuestSiteDueDaysBalanceKind

        Booking Insights

        Reservations grouped by staff/portal source, campaign, and referrer. No fingerprinting or hidden guest tracking is used.

        SourceCampaignReferrerReservationsCancelled

        How often each site has been rented, and for how much.

        SiteTimes rentedTotal nightsTotal 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

        TimeSiteGuestMethodAmountRefBy

        Deposits still due

        SiteGuestCheck-inAmount

        Open folio balances

        SiteGuestStatusBalance

        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.

        SiteGuestSinceAmount

        Night audit for multi-shift parks: ops snapshot plus settlement reconciliation (revenue vs collected). Record one close per calendar day.

        Arrivals

          Departures

            Recent closes

            DateClosed atByVarianceNotes

            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.

            WhenUserRoleActionTargetDetails