King Sound Resort Hotel — Administrator & Owner Manual
v0.3.0 · #ver 2026-10-12 08:50 AEST
For Wayne and Resort Management. Manual version 1.2, 1 October 2026.
This manual explains the advanced management features of the King Sound Resort Hotel booking engine: Stripe payment configuration, refund processing, pricing loadings and seasonal rates, deposit and cancellation policy rules, and financial reporting with accountant CSV export.
Something broken or need help? Call Colin Dixon on 0419 415 000.
Contents
- Stripe setup step by step
- Issuing a refund
- Setup parameters & safe defaults
- Deposit & cancellation policy
- Pricing: base rates, seasons & holiday loadings
- Reports & accountant CSV export
- Month-end checklist & support
1. Stripe setup step by step
Online deposits and card payments are powered by Stripe Checkout. The resort owns and controls its own Stripe account directly.
Step 1: Wayne creates the Stripe account
- Visit stripe.com and click Start now.
- Register using your business email (e.g.
info@kingsoundresort.com.auor Wayne’s administrative email). - Complete the business verification:
- Business structure: Australian Company or Sole Trader / Partnership.
- ABN: King Sound Resort Hotel legal business ABN.
- Bank Account: Nominate the resort’s Australian bank account (BSB and account number) where AUD payouts will be deposited.
- Statement descriptor:
KING SOUND RESORT(so guests recognize the charge on their card statement).
Step 2: API Keys (Restricted Key Preferred)
- In the Stripe Dashboard, navigate to Developers → API keys.
- For maximum security, create a Restricted Key with only the necessary permissions:
Checkout Sessions: WriteRefunds: WriteWebhook Endpoints: Write
- Alternatively, copy the standard Secret Key (
sk_test_...for testing,sk_live_...for production). - Provide the key to Colin privately via secure channel (never by open unencrypted email).
Step 3: Colin adds secrets to Cloudflare
Colin sets the secrets directly in the Cloudflare Worker environment using Wrangler:
npx wrangler secret put STRIPE_SECRET_KEY
npx wrangler secret put STRIPE_WEBHOOK_SECRET
Note: Keys are encrypted by Cloudflare and never committed to the GitHub repository or visible in frontend code.
Step 4: Register the Webhook Endpoint
In Stripe Dashboard → Developers → Webhooks, add an endpoint:
- Endpoint URL:
https://ksrh.oze.au/api/stripe/webhook(or production domain upon cutover). - Events to listen for:
checkout.session.completed(updates booking todeposit_paidand confirms the reservation).checkout.session.expired(releases any temporary calendar holds).charge.refunded(logs refund amount and updates booking torefundedorpartially_refunded).
- Copy the Signing secret (
whsec_...) and provide it to Colin.
Step 5: Test booking
- Set Payment Mode in Admin to First-Night Deposit or Fixed Deposit ($100.00).
- Go to the booking page (
/bookings) and submit a booking. - On the Stripe Checkout page, enter the official Stripe test card:
- Card Number:
4242 4242 4242 4242 - Expiry: Any future date (e.g.
12/28) - CVC: Any 3 digits (e.g.
123) - Name & Postcode: Any valid details (e.g.
6728)
- Card Number:
- Click Pay. You will be redirected back to
/bookingswith confirmation. - In the Admin portal (
/admin), verify the booking status is Confirmed with payment status Deposit Paid.
Step 6: Switching to Live
Once Wayne approves the wording and test bookings, replace STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET with live production keys (sk_live_... and live whsec_...).
What payouts look like
- Card payments process in Australian Dollars (AUD).
- Stripe automatically transfers accumulated funds to the resort’s bank account on a rolling 2-business-day schedule (or weekly if preferred).
- Standard domestic card processing fee is approx. 1.75% + 30c per transaction, deducted automatically prior to payout.
- Detailed tax invoices and payout statements are downloadable anytime in the Stripe Dashboard under Balances → Payouts.
2. Issuing a refund
When a guest cancels or requires a deposit refund, reception or management can issue the refund directly from the Admin portal.
Full, partial, and policy-driven refunds
- Open the Bookings & Availability tab in
/admin. - Find the guest reservation.
- Click the ↩️ Refund button on the booking row.
- The Process Guest Refund window opens:
- Displays the Deposit Paid and Refundable Balance.
- Calculates the notice days between today and the check-in date.
- Evaluates the resort’s cancellation tiers and displays the Recommended Refund (e.g. 100% full refund if >14 days out, 50% if 7–14 days, or $0.00 if under 7 days).
Staff overrides and audit logging
- Standard Refund: If issuing the recommended refund, simply click Confirm Refund.
- Staff Override: If management decides to refund more or less than the policy dictates (e.g. compassionate grounds for flight cancellations or medical emergency):
- Check the Override Standard Policy checkbox.
- Enter the custom refund amount.
- Enter the Mandatory Override Reason (e.g. “Flight cancelled due to Kimberley weather; approved by Wayne”).
- Click Confirm Refund.
- Every override is permanently recorded in the
booking_refundsaudit log with timestamp, staff name, policy suggestion vs actual refund, and the written reason.
Payment gateway processing & timing
- If the booking was paid via Stripe Checkout, the system automatically triggers an instant electronic refund via the Stripe API.
- Card refunds typically take 5 to 10 business days to reappear on the guest’s card statement.
- The booking status updates to Refunded (or Partially Refunded), and the refunded total appears in the financial reports.
3. Setup parameters & safe defaults
All operational parameters are managed in /admin under Booking Mode & Stripe and Pricing & Seasons:
| Parameter | Recommended Safe Default | Explanation |
|---|---|---|
| Booking Mode | email_only | Safe mode. Forms email reception directly; avoids double-booking until the calendar is 100% caught up. |
| Payment Mode | deposit_first_night | Requires guest to pay the first night rate via Stripe Checkout to lock in the reservation. |
| Fixed Deposit ($) | $100.00 AUD | Used only if Payment Mode is set to deposit_fixed. |
| Notification Email | info@kingsoundresort.com.au | Receives direct booking inquiries and staff alerts. |
| Holiday Stacking | highest | If a date qualifies for multiple holiday loadings, only the highest single percentage applies. |
| Sunday Loading | +10.0% | Automatic loading on base room rates for Sunday nights. |
| WA Public Holidays | +15.0% | Loading applied on all Western Australian gazetted public holidays. |
| WA School Holidays | +10.0% | Loading applied during WA gazetted school holiday term breaks. |
| Admin Passphrase | 16+ random characters | Security passphrase. System fails closed (HTTP 503) if short or known. |
4. Deposit & cancellation policy
The policy is configured in the Policy & Cancellation tab in /admin.
Setting the policy rules
- Deposit Type:
First Night: Guest pays the exact first night total (including that night’s specific loadings). Recommended.Percentage (%): Guest pays a percentage of the total stay (e.g. 20% or 25%).Fixed Dollar ($): Flat deposit (e.g. $100.00).None: No card payment required online; balance paid at resort.
- Balance Due Timing:
On Arrival: Remaining balance collected at front desk upon check-in.X Days Before Arrival: Balance collected X days prior to check-in (e.g. 7 or 14 days).
- Cancellation Tiers:
- Tier 1: 14+ days before arrival → 100% deposit refund.
- Tier 2: 7 to 14 days before arrival → 50% deposit refund.
- Tier 3: Under 7 days before arrival → 0% deposit refund (deposit forfeited).
- No-Show Rule:
- Standard outback terms: “No refund for no-show; 100% of the booking total is charged.”
Policy snapshot on bookings
Whenever a guest books or submits an inquiry, the system saves a permanent Policy Snapshot on that specific booking record. If Wayne alters the resort’s cancellation policy next month, earlier bookings retain the exact terms they agreed to when booking.
5. Pricing: base rates, seasons & holiday loadings
All pricing is calculated dynamically per night at request time using src/lib/pricing.ts.
Loading Priority & Stacking Order
For every individual night of a guest’s stay, pricing resolves in this exact priority:
- Base Room Rate: The room’s standard nightly rate (e.g. $185.00 for Standard Queen).
- Season Rate or Multiplier:
- If a season has a fixed rate (e.g. Dry Season fixed $240.00), that becomes the night’s base.
- If a percentage (e.g. +10%), base increases by 10%.
- Day-of-Week Loading:
- Sunday +10% (or any configured day e.g. Friday/Saturday).
- Public Holiday Loading:
- Western Australia public holiday date +15%.
- School Holiday Loading:
- WA school holiday date range +10%.
Holiday Stacking vs Highest Single Loading
In /admin under Pricing & Seasons, choose how multiple holiday loadings interact:
- Highest Single Loading Applies (Default): If a date falls on both a WA School Holiday (+10%) and Easter Monday (+15%), only the +15% applies.
- Stack Loadings Together: Both percentages add together (+10% + +15% = +25%). Note: Day-of-week loadings (such as Sunday 10%) always stack on top of the holiday loading.
50-Cent Rounding & GST
- All room rates in Derby include 10% Australian GST.
- Every nightly rate rounds to the nearest 50 cents ($0.50):
- Example: $214.25 rounds up to $214.50.
- Example: $214.20 rounds down to $214.00.
Worked Example:
- Room: Twin Share Room (Base: $195.00)
- Night: Easter Sunday, 5 April 2026
- Calculation:
- Base: $195.00
- Season: Shoulder season (0% until set) = $195.00
- Day-of-Week: Sunday (+10%) = +$19.50
- Public Holiday: Easter Sunday (+15%) = +$29.25
- Total: $195.00 + $19.50 + $29.25 = $243.75
- Round to nearest 50c: $243.50 AUD (incl. GST)
- Guest Breakdown Displayed:
Sun 5 Apr: $195.00 + Sun +10% + Easter Sunday +15% = $243.50
Updating Holiday Dates Annually
Public holiday dates for 2026 and 2027 are pre-seeded in the database. At the beginning of each calendar year:
- Open
/adminand select the Pricing & Seasons tab. - In Public Holidays, click + Add Holiday to add next year’s Easter, ANZAC Day, WA Day, etc.
- In School Holidays, enter the gazetted WA Department of Education term break dates.
6. Reports & accountant CSV export
The Reports tab in /admin provides full revenue management and accounting data.
Selecting Date Ranges & Viewing KPIs
- Choose a start date and end date (or use presets: This Month, Next Month, Full Year).
- Confirmed Bookings: Count of reservations locked on the calendar.
- Enquiries: Inquiries submitted during the period.
- Conversion Rate: Percentage of inquiries converted to confirmed stays.
- Nights Sold: Total room-nights occupied.
- Occupancy %: Overall occupancy across the 58 resort rooms, plus per-room breakdown.
- ADR (Average Daily Rate): Average room revenue per occupied room-night (
Total Stay Revenue / Nights Sold). - Revenue Summary:
- Total Stay Value (contracted room spend)
- Deposits Collected (gross cash collected via card/transfer)
- Balances Due (outstanding balances to be collected on arrival)
- Refunds Issued (total refunds processed)
- Net Revenue (
Deposits Collected - Refunds Issued)
Revenue by Loading Type
Reports break down exactly where revenue originated:
- Standard Base Rate Revenue
- Seasonal Peak Adjustments
- Sunday & Weekend Loadings
- Public Holiday Loadings
- School Holiday Loadings
Upcoming Arrivals, Departures & Outstanding Balances
- Arrivals: Schedule of arriving guests with contact phone numbers and room category.
- Departures: Daily checkout list.
- Outstanding Balances: Immediate ledger showing guests with money due upon arrival.
Accountant CSV Export
Click 📥 Download Accountant CSV to export a clean spreadsheet ready for Xero, MYOB, or your bookkeeper. The CSV contains:
Reference,Guest Name,Email,Phone,Room IDCheck In,Check Out,NightsStatus,Payment StatusTotal Stay ($),Deposit Paid ($),Balance Due ($),Refunded ($)- Loading breakdown (
Base Rate,Season,Day of Week,Public Holiday,School Holiday) GST Included ($)(exact 1/11th calculation for BAS filing)Created Date
Stripe Reconciliation Tool
The reports screen automatically verifies local database records against Stripe:
- Confirms matching Payment Intent IDs.
- Flags any booking marked Confirmed on the calendar whose Stripe Checkout was abandoned or unpaid.
- Flags any discrepancy between deposit amounts and Stripe receipts.
7. Month-end checklist & support
5-Step Month-End Checklist for Wayne:
- Log in to Admin: Go to
https://ksrh.oze.au/adminon the 1st of the month. - Review Reports: Open Reports, select the previous month (e.g. 1 Sep to 30 Sep).
- Verify Outstanding Balances: Ensure all completed stays are marked with payment resolved.
- Download Accountant CSV: Save the CSV and forward it to your resort accountant.
- Reconcile Stripe Payouts: Match the Net Revenue figure in the report against Stripe bank deposits.
Who to call:
If you need rates changed, dates updated, credentials reset, or custom feature adjustments:
Colin Dixon
Mobile: 0419 415 000
Email: colin@oze.com.au
Web: https://oze.au/
8. Disaster Recovery, Backups & Outage Continuity
Full technical document: See docs/disaster-plan.md.
Printable emergency reception cards: What to do if… Checklist, 14-Day Run Sheet, Paper Booking Form.
8.1 Automated Off-Site Backups (Nightly at 2:00 AM AWST)
Every night at 2:00 AM Western Standard Time (18:00 UTC), a Cloudflare Worker cron executes a complete backup:
- Cloudflare R2 Storage: Exports all tables to gzipped JSON and CSV archives in the private
ksrh-backupsbucket. Retains 30 daily and 12 monthly snapshots automatically. - Google Workspace Shared Drive: Duplicates the backup archive, today’s 90-Day Offline Pack (HTML), and the 14-Day Run Sheet to the resort’s shared Google Drive folder (
KSRH Backups). Retains 30 days. - R2 Free Tier: Running cost is $0.00 / month (well within Cloudflare’s 10 GB free tier).
- Admin Alert: If an automated backup is ever older than 36 hours, the Admin Backups tab turns bright red with an urgent warning.
8.2 Google Drive for Desktop: Local Offline Sync
To ensure reception has yesterday’s reservation data on their physical computer even if telephone lines, power, and internet are down:
- Install Google Drive for Desktop on the reception PC.
- Sign in with the reception Google Workspace account.
- Locate the shared folder “KSRH Backups”.
- Right-click the folder and select “Available offline”.
- Result: The latest database snapshots and offline files are mirrored locally on
G:\Shared drives\KSRH Backups\without requiring an active internet connection.
8.3 Cloudflare D1 Time Travel (30-Day Point-in-Time Recovery)
If a booking is accidentally deleted or data is corrupted, Cloudflare D1 Time Travel can rewind the entire database to any minute in the last 30 days.
- Inspect history:
npx wrangler d1 time-travel info ksrh-booking --remote - Rewind live database (e.g. to 2:00 PM UTC on 30 Sep 2026):
npx wrangler d1 time-travel restore ksrh-booking --remote --timestamp="2026-09-30T14:00:00Z"
(Executed by Colin Dixon or authorized engineer in under 60 seconds).
8.4 Restoring from a Backup File (scripts/restore.sh)
To restore an archived backup file:
./scripts/restore.sh backups/backup-latest.json.gz --db ksrh-booking-restore-test
The script loads the backup into a NEW isolated database first, compares row counts for every table, and outputs verification before any live switchover.
8.5 90-Day Offline Pack & 14-Day Run Sheet
- Offline Pack: In Admin → Backups, click 📥 Download 90-Day Offline Pack (HTML). This is a single, self-contained HTML page that opens in any browser without internet. It includes an interactive room matrix, upcoming arrivals/departures, and guest phone numbers.
- Daily Run Sheet: Formatted for A4 printing on the reception clipboard. Reception prints this every morning for complete power failure resilience.
8.6 Blackouts & Catch-Up Paper Bookings
- When internet is down: The public booking page automatically displays:
“Online booking is temporarily unavailable, please call reception directly on (08) 9193 1044.” - Taking reservations offline: Use printed Emergency Paper Booking Forms. Take payments via the standalone 4G EFTPOS machine or cash.
- When power/internet returns: Open Admin Portal → Backups & Disaster Recovery → Catch-up Paper Bookings.
- Double-Booking Clash Engine: The system immediately checks live D1 database records. If an online reservation occurred right before the outage, it alerts staff with the conflicting guest details before saving.
8.7 Credentials Registry & Contingency (“If Colin is Unavailable”)
Master credentials for Cloudflare, GitHub, Stripe, and the domain are encrypted in the resort’s shared RoboForm Password Vault:
- Cloudflare: Account
Colin@oze.com.au(Account ID1b494ec3de3d84b846e3100f5bbf561d). - Backup Engineers: Travis and James have secondary access to Cloudflare and GitHub.
- Direct Database Console: Cloudflare Dashboard → Workers & Pages →
ksrh→ D1 Databaseksrh-booking→ Console tab allows running SQL directly without developer tools.