Sandbox Training environment — real customers aren't contacted and payments aren't charged. Reset Weekly
Documentation

How everything works.

Every module of ResortStrata, explained in plain English. Use the contents on the left to jump to a topic, or have a question? Send us a note.

01

Getting started

Creating your account and organization

To begin using ResortStrata, visit the registration page and create an account with your email address and a secure password. During registration you will also create your first organization — this is the top-level entity that holds all of your resorts, contacts, invoices, and team members.

Once registered, you will be signed in automatically and taken to the portal dashboard. You can update your organization name and details at any time from the settings area.

The 30-day free trial

Every new organization starts with a 30-day free trial that gives you full access to all portal features. No credit card is required to start. Before the trial expires you can subscribe to a paid plan from the Billing page to maintain uninterrupted access.

Dashboard overview

The dashboard is your command center. At a glance you will see:

  • Stat cards — quick counts for key metrics such as total resorts, total units, active occupancy windows, and open maintenance jobs.
  • Upcoming arrivals — occupancy allocations whose start date is approaching, so you can prepare units for incoming guests or owners.
  • Open jobs — maintenance jobs that are not yet completed, ordered by priority and due date.
  • Servicing due — housekeeping and servicing tasks that are scheduled or in progress and approaching their due window.
  • Outstanding invoices — invoices that have been sent but not yet paid, helping you keep track of receivables.

Navigating the portal

The portal uses a sidebar menu on the left-hand side that provides access to every section: Dashboard, Resorts, Contacts, Occupancy, Servicing, Jobs, Invoices, Email, Settings (which contains Staff and Permission Groups), Billing, and Support. On smaller screens the sidebar collapses into a hamburger menu.

All data in the portal is scoped to your current organization context. If you belong to more than one organization you can switch between them using the organization switcher at the top of the sidebar.

02

Resorts & units

Adding a new resort

Navigate to Resorts in the sidebar and click Add Resort. You will need to provide:

  • Name — the display name for the resort (e.g. "Oceanview Residences").
  • Address — the street address of the property.
  • City — the city or town.
  • Country — select from the country list.
  • Timezone — used for scheduling servicing, jobs, and occupancy dates in the correct local time.
  • Fiscal year start — month and day on which the annual maintenance-fee period begins. Default 1 January. Change this if the resort bills on a seasonal cycle (e.g. 1 November or 1 April). See Annual Fee Assessments for how this feeds the assessment creation defaults.

Managing units within a resort

Each resort contains one or more units — these represent individual rooms, apartments, villas, or lots. When viewing a resort, click Add Unit to create a new unit. Each unit has:

  • Unit identifier — a label such as "Unit 4A", "Villa 12", or "Room 301".
  • Primary owner — the contact picked on creation is automatically given a 100% ownership stake. For joint or fractional ownership, edit the unit afterwards and add extra owners (see below).
  • Annual fee amount — the yearly maintenance / levy amount for this unit (in the organization's currency). Used by the Fee Assessment feature to generate invoices.
  • Notes — optional free-text notes about the unit (e.g. "Ground floor, wheelchair accessible").

Units are the fundamental building blocks of the system. Reservations, servicing tasks, maintenance jobs, housekeeping status, fee assessments, and invoices are all linked to specific units.

Joint, fractional, and timeshare ownership

Every ownership stake on a unit is tracked as its own record with a share percentage and an effective date range. This supports three common patterns:

  • Single owner (the default) — one record at 100% with an open-ended effective date.
  • Joint owners — two or more records (e.g. 50% + 50%, or 60% + 40%). Each owner is billed their share of the annual fee separately, with their own invoice number.
  • Weekly timeshares — one record per week-holder at 1.92% (1/52) or equivalent. The ownership list shows each holder, and fees are prorated accordingly.

To add or edit ownerships, open the unit edit page and use the Ownership section. The list shows every current and historical stake with its percentage and effective dates; a footer row shows whether the active stakes today sum to 100% (if not, a warning appears — double-check it's intentional). When a unit is sold mid-year, add a new ownership record starting on the transfer date and set the previous record's "Effective to" to the day before. The fee assessment will then bill the old owner for their days and the new owner for theirs automatically.

How unit count affects billing

ResortStrata uses a per-room pricing model. Your subscription cost is based on the total number of units across all resorts in your organization. There is a minimum of 5 units — if you have fewer than 5, you will be billed for 5. This keeps pricing fair for small and large properties alike.

Editing and updating resort details

Click on any resort from the list to view its details. From the resort detail page you can edit the resort name, address, city, country, and timezone. You can also add, edit, or remove units from this page.

Tip: Keep timezone settings accurate — they affect how due dates and scheduling windows are interpreted throughout the portal.

03

Contacts, tags & import

Adding owner and tenant contacts

Contacts represent the people associated with your properties — typically owners and tenants. Navigate to Contacts and click Add Contact to create a new record.

Contact fields

  • First name and Last name — the contact's full name.
  • Kind — owner or tenant (see below).
  • Email — used for sending invoices, broadcast emails, payment links, and the owner portal invite.
  • Phone — optional phone number for the contact.
  • Marketing opt-in — a flag indicating whether the contact has consented to receive marketing communications. This is respected by the email broadcasting feature.
  • Tags — one or more free-form labels you define (e.g. "VIP", "Club Member", "Legacy Owner"). See below.

Tags

Tags let you categorize contacts beyond simple owner / tenant. Create tags on the fly by typing a new name, or pick existing ones from the dropdown. Tags are organization-scoped, so tags created in one organization are never visible to another.

  • Tags can be added when creating or editing a contact.
  • On the contact list you can filter by tag to find everyone in a given segment.
  • Tags can be managed (renamed or deleted) from Contacts > Tags. Deleting a tag removes it from every contact it was attached to.
  • Broadcast emails and mailing lists can be built from tag segments.

Browsing and searching

The Clients list is sorted alphabetically by last name. Use the search box at the top of the list to filter by first name, last name, or email address — the search matches any part of those fields, case-insensitive. Clear the search to return to the full list.

Email deliverability flags

When a broadcast or invoice email bounces or is reported as spam, the affected contact is automatically flagged on the Clients list with a red label next to their email address — Hard bounce (address permanently rejected), Soft bounce (temporary rejection — will clear itself on the next successful delivery), or Marked spam (recipient reported a broadcast as spam; marketing opt-in is automatically turned off). Opening the contact shows a more detailed banner and a Mark delivery as resolved button — use it once you've confirmed the address with the contact or cleared the underlying problem. The flag will re-apply on the next bounce if the issue recurs.

Linking contacts to resorts and units

When creating or editing a contact, you can associate them with specific resorts and units. Separately, each unit has a primary owner — that's the contact who receives the unit's annual fee invoice and who sees that unit in the owner self-service portal.

Owner vs tenant distinction

Contacts are classified as either owners or tenants. This distinction is important for:

  • Email broadcasting — you can target owners only, tenants only, by tag, or by specific mailing list.
  • Invoicing — ensuring bills go to the correct party.
  • Reservations — recording owner usage versus rental usage.
  • Owner portal — only owner contacts can be invited to the owner self-service portal.

Inviting a contact to the portal

You can invite any contact to create a user account linked to their contact record. The contact receives an email with a secure invitation link; when they set a password they are automatically signed in. Invited contacts land on the owner self-service portal, scoped to only their own units, bookings and invoices. See Owner Self-Service Portal for details.

Importing contacts from CSV (including MailChimp)

Navigate to Contacts > Import to bulk-create contacts from a CSV file. The importer understands the common MailChimp export format and generic CSVs with columns for first name, last name, email, phone, and an account type.

  • Duplicate protection — contacts are matched by email. If a contact already exists, the import updates missing fields rather than creating a duplicate.
  • Tag assignment — the AccType column (or any free-form column you choose) can be mapped to tags. For example, values like "Club Member" or "Legacy" become tags on each imported contact.
  • Optional mailing list — you can assign every imported contact to a new or existing mailing list in a single step.

Tip: Keep email addresses up to date. Invoice delivery, payment links, broadcast emails, and owner portal invites all depend on accurate contact email addresses.

04

Mailing lists

Why mailing lists

Mailing lists let you curate groups of contacts for broadcast email campaigns. A contact can belong to any number of mailing lists. Unlike tags — which are free-form labels — mailing lists are explicit membership collections you build and maintain for sending to.

Creating a list

Navigate to Email > Mailing Lists and click New List. Give it a name (e.g. "2026 Annual Owners") and an optional description. Once created you can add or remove members at any time.

Adding members

  • Pick contacts individually from the contact picker.
  • Bulk-add everyone with a selected tag.
  • Bulk-add everyone on a CSV import (choose "Add to list" when importing).

Members are deduplicated — if a contact is already on the list, adding them again has no effect.

Sortable, searchable member view

The list detail page shows all members alphabetically, with a search box to filter by name or email. You can remove members one at a time or in bulk.

Using lists for broadcasts

When composing a broadcast email, choose a mailing list as the audience. Only contacts who are on that list and have opted into marketing will receive the email. See Email Broadcasting for the full workflow.

The built-in Test Group (trial accounts)

Every organization has an auto-created mailing list called Test Group. On a free trial, this is the only list broadcasts can be sent to, and it is capped at 5 activated staff members. The Test Group is a safety net — it lets you practise sending without any risk of reaching real contacts before you're paying. Add members to it by inviting staff from Settings > Staff; they appear in the Test Group automatically once they activate their invite. Once you subscribe to a paid plan, the Test Group stays available and you can also send to any other mailing list.

Tip: Keep lists small and focused. A list that covers every owner will hit deliverability limits harder than targeted lists based on tenure, location, or opt-in campaign.

05

Reservations & PMS

What a reservation represents

A reservation records who is using a unit, when, and how. Reservations cover the full property management lifecycle — owner usage, paid rentals, blocks for owner friends or family, and maintenance downtime.

Reservation types

  • Owner — the unit's primary owner (or a linked contact) is staying in the unit themselves. No charge.
  • Rental — a paid booking for a guest. Tracks guest details, price, and can be linked to an invoice.
  • Blocked — the unit is held out of availability without a guest (e.g. for owner's personal hold, renovation planning, inter-owner arrangements).
  • Maintenance — a deliberate block for a known maintenance window.

Reservation status workflow

  • Confirmed — the reservation is booked but the guest has not yet arrived.
  • Checked in — marked automatically when you check the reservation in. Records the check-in timestamp.
  • Checked out — marked automatically on check-out. Records the check-out timestamp and flips the unit's housekeeping status to dirty.
  • Cancelled — the reservation was cancelled before arrival.
  • No-show — the guest did not arrive within the expected window.

Creating a reservation

Navigate to Reservations and click New Reservation. You can filter and view reservations by resort, type, date range, and status. Each reservation requires:

  • Unit — the resort unit being reserved.
  • Type — one of owner / rental / blocked / maintenance.
  • Owner contact — the contact responsible for the booking (for rentals this is usually the booker; for owner usage it's the primary owner).
  • Start date and End date — the check-in and check-out dates.
  • Guest name, email, phone — for rentals or owner-guest stays, the details of the person actually staying.
  • Guest count — how many people are staying.
  • Total — for rentals, the price charged. Used to generate an invoice.
  • Notes — free-text operational notes visible to staff.

Overlap detection

The system automatically checks for date conflicts when you create or edit a reservation. If the dates overlap with an existing confirmed reservation for the same unit, you'll see a warning. This prevents double-booking.

Check-in and check-out

From a reservation's detail page, use the Check in button to mark the guest as arrived. The reservation's status moves to checked in and the unit's housekeeping status moves to in progress.

Use Check out when the guest leaves. The reservation moves to checked out and the unit's housekeeping status automatically flips to dirty, queueing it up for the housekeeping team.

Cancelling a reservation

Click Cancel on a reservation to mark it as cancelled. Cancelled reservations remain in the history but are removed from overlap detection, freeing the dates for new bookings.

Generating a rental invoice

For reservations with a rental total, you can generate an invoice directly from the reservation. The reservation is linked to the invoice so payment status is visible from the booking record.

Tip: Use reservation type filters to quickly separate your paid rental pipeline from owner weeks, and combine with the housekeeping board to plan turnovers between bookings.

06

Housekeeping

Housekeeping status board

Each unit has a persistent housekeeping status so your team can see at a glance what needs attention. Navigate to Housekeeping for the grid view of every unit, its current status, last-cleaned timestamp, and any upcoming arrivals.

Statuses

  • Clean — ready for the next guest.
  • Dirty — needs cleaning. A unit automatically moves here on check-out.
  • In progress — housekeeping has started on the unit.
  • Out of service — the unit is deliberately unavailable (deep repair, renovation, etc.). Prevents it being rented.

Automatic status changes

  • Checking a reservation in moves the unit to in progress.
  • Checking a reservation out moves the unit to dirty.

Staff can override at any time — e.g. flip from dirty to clean once a clean is done, or mark a unit out of service ahead of works.

Bulk actions

Select multiple units from the housekeeping board to mark them clean in one action. Useful after a synchronised housekeeping shift.

Notes and last-cleaned record

Each status change records the team member and timestamp. Optional notes can be added — e.g. "replaced towels, reported hairdryer broken" — to give the next person visiting the unit context.

Tip: Combine the housekeeping board with the Reservations calendar to spot same-day turnovers and plan staffing.

07

Servicing tasks

Creating servicing tasks

Servicing tasks cover all routine unit preparation work — cleaning between guests, inspections, repairs, and deep cleans. Navigate to Servicing and click Add Task. Choose from the following task types:

  • Cleaning — standard housekeeping clean.
  • Inspection — a walkthrough to check unit condition.
  • Repair — minor fix work that does not warrant a full maintenance job.
  • Turnover — full preparation of a unit between occupancy windows (typically combines cleaning and inspection).
  • Deep clean — thorough, intensive cleaning beyond the standard scope.

Task fields

  • Unit — the resort unit to be serviced.
  • Status — the current state of the task (see below).
  • Task type — one of the types listed above.
  • Due start and Due end — the window during which the task should be completed.
  • Assignee — the team member responsible for carrying out the task.

Checklists

Each servicing task can have a checklist — a list of individual line items that staff can work through and tick off as they complete each step. This is especially useful for turnovers and deep cleans where multiple steps must be followed in order.

Add checklist items when creating or editing a task. Staff members can then mark each item as complete from the task detail view.

Task statuses

Tasks progress through the following statuses:

  • Scheduled — the task has been created and is awaiting its due window.
  • In progress — work has begun on the task.
  • Completed — the task is finished.
  • Cancelled — the task has been cancelled and will not be carried out.

Tip: Assign tasks to specific team members so they appear in each person's workload. Use checklists to standardize quality across your housekeeping team.

08

Maintenance jobs

Logging reactive maintenance

Maintenance jobs track reactive work that needs to be done on your properties. Navigate to Jobs and click Add Job. Each job includes:

  • Title — a short summary of the issue (e.g. "Leaking kitchen tap").
  • Description — detailed information about the problem and any relevant context.
  • Category — the type of maintenance work required.
  • Priority — how urgently the job needs attention.
  • Status — the current stage in the job workflow.

Categories

Jobs are organized into the following categories:

  • Plumbing — pipes, taps, drains, water heaters, toilets.
  • Electrical — wiring, outlets, switches, lighting, circuit breakers.
  • HVAC — heating, ventilation, air conditioning, thermostats.
  • Structural — walls, roofing, foundations, windows, doors.
  • Cleaning — specialist cleaning beyond routine housekeeping.
  • Landscaping — grounds, gardens, paths, exterior maintenance.
  • Appliance — kitchen appliances, washers, dryers, refrigerators.
  • Pest control — insect, rodent, or wildlife issues.
  • Other — anything that does not fit the above categories.

Priority levels

  • Low — cosmetic or non-urgent issues that can be addressed when convenient.
  • Normal — standard maintenance that should be completed within a reasonable timeframe.
  • High — important issues that affect guest or owner experience and should be prioritized.
  • Urgent — critical problems that require immediate attention (e.g. burst pipe, power failure, security issue).

Status workflow

Jobs follow this lifecycle:

  • Open — the job has been logged and is awaiting action.
  • Scheduled — the job has been assigned a date and/or team member.
  • In progress — work is actively being done.
  • Completed — the job is finished.
  • Cancelled — the job is no longer needed.

Assigning jobs to team members

When creating or editing a job you can assign it to any team member in your organization. Assigned members can see their jobs from the dashboard and the jobs list.

Due dates and completion tracking

Set a due date on each job to ensure timely resolution. The dashboard highlights overdue and upcoming jobs so nothing falls through the cracks.

Tip: Use the priority system consistently across your team. Reserve "Urgent" for genuine emergencies so it retains its meaning.

09

Recurring maintenance (job series)

Creating recurring maintenance templates

For maintenance that happens on a regular schedule — such as monthly HVAC filter checks or weekly pool inspections — you can create a job series. A series acts as a template: you define the job details once, and the system creates individual jobs automatically on schedule.

Frequency settings

Job series support the following frequencies:

  • Weekly — a new job is created every week on a specified day of the week.
  • Monthly — a new job is created every month on a specified day of the month.

How jobs are materialized from series

The system automatically generates individual maintenance jobs from each active series according to the configured schedule. These materialized jobs appear in the regular jobs list and follow the same status workflow (open, scheduled, in progress, completed, cancelled).

Day of week / day of month settings

For weekly series, you choose which day of the week the job should be created (Monday through Sunday). For monthly series, you choose which day of the month (1 through 28) the job should appear.

Tip: Recurring maintenance helps you stay on top of preventive work. It is far cheaper to maintain equipment on schedule than to repair it after a failure.

10

Annual fee assessments

What fee assessments do

Strata schemes, timeshare operators, and vacation clubs typically charge owners an annual maintenance levy. ResortStrata's Fee Assessment feature lets you issue a whole year's worth of these invoices in one operation — one invoice per unit, sent to that unit's primary owner.

Prerequisites

Before running an assessment, each unit you want billed must have:

  • At least one active ownership stake covering some portion of the assessment period.
  • An annual fee amount set (on the unit record).

Units without either of these are skipped when the draft is created. If a unit has multiple owners, one fee-assessment line is generated per owner, proportional to their share and their days held during the period. If a unit has instalments enabled, those lines are further split.

Seasonal / fiscal-year billing

Each resort has a fiscal year start configured on the resort edit page (default: 1 January). For timeshares that bill on a 1 November – 31 October cycle, or a 1 April – 31 March fiscal year, set the month and day accordingly. When you create an assessment, the period dates default from the first resort's fiscal year configuration — so a resort on 1 Nov will auto-fill a 2026-11-01 to 2027-10-31 period when you pick year 2026. You can override these dates per assessment if a specific run covers a shorter or non-standard window.

Creating a fee assessment run

Navigate to Fees and click New Assessment. Provide:

  • Year label — the calendar year the period starts in (e.g. 2026). The system derives the display label automatically: a 1 Nov 2026 – 31 Oct 2027 period shows as 2026–2027; a 1 Jan – 31 Dec 2026 period just shows as 2026.
  • Period start and period end — the exact service window this assessment covers. These pre-fill from your first resort's fiscal year but can be edited.
  • Issue date — the date invoices should be dated.
  • Due date — when the first instalment is expected.
  • Instalments and cadence — split each owner's annual share across multiple invoices. The default is 1 × annual (one invoice per owner on the due date); choosing e.g. 4 × quarterly generates four invoices per owner with due dates 3 months apart starting from the due date you entered. Rounding remainders land on the earliest instalment so the owner's share always totals exactly their billable amount.
  • Currency — defaults to your organization currency.
  • Notes — optional internal notes about this run.

Each generated invoice's line-item description includes the period explicitly — e.g. "Annual maintenance fee 2026–2027 (1 Nov 2026 – 31 Oct 2027) — Unit 4A" — so owners can see exactly what window they're paying for. The run starts in draft status. You can review the computed total, which units are included, and which owners will receive invoices before committing.

Issuing the run

Click Issue on a draft run. The system creates one invoice per included unit, with a single line item for the unit's annual fee, billed to the unit's primary owner. Each invoice is auto-numbered using your organization's invoice sequence.

Once issued, the run is locked — you can no longer edit its contents. The generated invoices appear in the regular Invoices list and behave like any other invoice: PDF download, email, pay link, Stripe checkout.

Send-all

From the run detail page, click Send all to email every generated invoice in a single batch. Each recipient gets their own personalised email and secure pay link.

Tracking collection

The Reports area includes a Fee Collection Rate report that, per assessment run, shows how many invoices are paid versus outstanding, the dollar value collected versus billed, and a per-unit grid of payment status.

Tip: Run a small test assessment on one or two test units before issuing the full year. Verify the invoice totals, numbering, and email content end-to-end before sending to everyone.

11

Invoicing

Creating draft invoices with line items

Navigate to Invoices and click Create Invoice. Invoices start in draft status, allowing you to build them up before sending. Add one or more line items to each invoice, specifying the service or charge.

Invoice fields

  • Bill-to contact — the client who will receive and pay this invoice.
  • Resort — the resort the charges relate to.
  • Unit — the specific unit, if applicable.
  • Description — free-text description for each line item.
  • Quantity — the number of items or units of service.
  • Unit amount — the price per item or unit of service.
  • Tax — the tax amount or percentage applied to the line item.

Invoice numbering

Each invoice is assigned a number automatically in the form INV-1, INV-2, INV-3, and so on. Numbering is sequential per organization — every organization has its own independent counter that starts at 1, so two different organizations can each have their own INV-1 without any clash. Numbers are monotonic (never reused, never go backwards), which means that if an invoice is later deleted, the next new invoice still gets the next number up — you will not see duplicates, and the sequence stays stable for audit.

Invoice lifecycle

Invoices move through three stages:

  • Draft — the invoice is being prepared. You can add, edit, or remove line items freely.
  • Sent — the invoice has been delivered to the client. It appears in your outstanding invoices until paid.
  • Paid — payment has been received and confirmed.

Generating PDFs

You can generate a PDF of any invoice for your records or to attach to correspondence. The PDF includes your organization details, the bill-to contact, all line items, and the total amount due.

Emailing invoices to clients

From the invoice detail page, click Send Invoice to email it directly to the bill-to contact. The email includes a secure payment link that allows the client to view the invoice and pay online. This link is HMAC-signed and time-limited for security.

Tip: Review each invoice carefully while it is in draft. Once sent, the client will see exactly what you have entered, including descriptions, quantities, and amounts.

12

Payments

Connecting your Stripe account

To accept card payments through ResortStrata, you need to connect your own Stripe account. Navigate to Settings > Payments and enter:

  • Publishable key — your Stripe publishable API key (starts with pk_).
  • Secret key — your Stripe secret API key (starts with sk_). This is stored encrypted in our database.
  • Webhook secret — the signing secret for your Stripe webhook endpoint (starts with whsec_). This is also stored encrypted.

How card payments work

When a client clicks the payment link in their invoice email, they are taken to a payment page hosted by ResortStrata. If you have Stripe configured, the client can pay by card. Clicking "Pay now" creates a Stripe Checkout session and redirects the client to Stripe's secure hosted payment page. After successful payment, the client is redirected back and the invoice is marked as paid.

When Stripe is enabled, a Pay Now button also appears on the invoice PDF itself — useful for owners who open the attached PDF before the email body, or who save the PDF and come back to it later. The button opens the same secure, HMAC-signed pay link.

Per-resort finance & branding

Bank-transfer details and the invoice logo are configured per resort, not per organization. Open a resort from Resorts, click the Finance & branding tab, and you can set:

  • Invoice logo — a PNG, JPEG, SVG, or WebP image (max 512 KB). Appears at the top of the invoice PDF, on the public pay page, and in the invoice email. Each resort can have its own brand on its invoices.
  • Bank transfer on / off — toggle to show or hide the bank-transfer block on this resort's invoices.
  • Heading — a short title above the bank instructions (e.g. "Bank Transfer Details").
  • Instructions — the free-text block containing account name, sort code / routing / IBAN, reference format, and any other payer guidance.

Bank-transfer instructions display on the PDF, the public pay page, and the invoice email — alongside the Pay Now button when Stripe is enabled.

Permission: payments.bank_instructions controls access to the per-resort Finance tab, the same permission that used to gate the old organization-level bank form.

Payment page

The payment page is a public page — clients do not need a ResortStrata account to view it. The link is unique to each invoice, HMAC-signed, and has an expiry time for security. On this page the client can see the invoice details and choose to pay by card or bank transfer.

Webhook configuration

For payment confirmations to be processed automatically, you must set up a webhook endpoint in your Stripe dashboard pointing to your ResortStrata webhook URL. When Stripe confirms a successful payment, the webhook handler automatically marks the corresponding invoice as paid. The same webhook also listens for refunds: when a charge is refunded in Stripe, a matching credit note is created automatically against the original invoice.

Credit notes and refunds

To credit a client back against an invoice — whether for an overpayment, a correction, or a write-off — click the Credit button next to a sent or paid invoice on the Invoices page. Enter the amount to credit (capped at the invoice total) and an optional reason. A credit note is issued with its own monotonic per-organization number (CN-1, CN-2, …) and linked to the original invoice.

Refunds processed in Stripe automatically create a matching credit note — no manual action required. The credit is recorded with the Stripe refund ID so duplicate webhook deliveries don't double-credit the account.

The owner's statement of account shows credit notes in the transaction log as negative rows and subtracts them from the outstanding balance. For accounting exports, credit notes are included as ACCRECCREDIT rows in the Xero-compatible CSV.

Late fees and automatic reminders

Staff with the fees.manage permission can configure a late-fee policy from Settings > Invoicing:

  • Grace period — number of days past the due date before a fee is applied (default 7).
  • Flat late fee — a fixed amount added as a "Late fee" line to the invoice.
  • Interest rate — an optional percentage of the outstanding total, added on top of the flat fee.

When late fees are enabled, the nightly command app:invoices:apply-late-fees finds invoices that are past their grace period, adds the computed "Late fee" line to each, emails the bill-to contact a reminder, and marks the invoice as reminded so it is not charged twice. Run the command from your cron at a quiet time each day (early morning is typical). Use --dry-run to preview what would happen without applying anything.

Accounting export

Reports > Accounting export downloads a CSV of every non-draft invoice and credit note issued in a date range, in the column layout Xero (and most other tools that accept a Xero-shaped invoice import) expect. Each line item is a separate row with the same InvoiceNumber; credit notes appear with InvoiceType = ACCRECCREDIT and negative amounts. The AccountCode column defaults to 200 ("Sales") — the accountant typically remaps this on import to match their own chart of accounts.

Tip: Test your Stripe integration using Stripe's test mode keys before going live. This lets you verify the full payment flow without processing real charges.

13

Email broadcasting

Composing broadcast emails

Navigate to Email and click New Broadcast. The composer includes a rich text editor that supports formatting such as bold, italic, headings, links, lists, and a Small text size for fine print like copyright, disclaimers, and terms. Content pasted from Word or Google Docs is automatically sanitised to remove stale styles and hidden markup.

Audience selection

Every broadcast is sent to a mailing list. Pick the list from the dropdown at the top of the composer. Only contacts on that list with valid email addresses and marketing opt-in enabled will receive the email. See Mailing Lists for how to build and manage them.

Starting from a template

If you have email templates set up, the composer shows a "Start from template" picker at the top. Choosing a template prefills the subject and body; you're free to edit either before sending. Templates save time for recurring messages like welcome notes, reminders, and annual fee notifications.

Merge tags

Subjects and bodies support MailChimp-style merge tags that are expanded per recipient at send time:

  • *|FNAME|* (or *|FIRSTNAME|*) — the recipient's first name.
  • *|LNAME|* (or *|LASTNAME|*) — the recipient's last name.
  • *|EMAIL|* — the recipient's email address.
  • *|ORG_NAME|* — your organization's name.
  • *|UNSUB:click here|* — an unsubscribe link with the given anchor text.

You can also use conditional blocks so the email reads well when a field is missing. For example:

*|IF:FNAME|*Hi *|FNAME|*,*|ELSE|*Hello,*|END:IF|*

Always hit Send Test to Me first to confirm merges render the way you expect.

Default Reply-To

Your organization has a default reply-to email address configured in Email > Settings. When owners reply to any broadcast, their replies land in that inbox rather than a no-reply address.

Attachments

Drag and drop files directly into the attachments area in the composer (or click to browse). Each file uploads in the background immediately — you'll see a per-file progress bar that completes with a green ✓ when the file is stored on the server. The Send, Save draft, and Send test to me buttons are disabled while any upload is still in flight, so you cannot accidentally dispatch a broadcast before its attachments are fully received.

Total attachment size is capped at 5 MB across all files. Supported types include PDF, DOCX, XLSX, JPG, PNG, GIF, WEBP, TXT, and CSV. Remove an attachment at any time with the × button next to it.

When you edit an existing draft, attachments that have already been saved to that draft appear in the same drop zone with a green ✓ marker, so you don't re-upload duplicates.

Test emails

Before sending, use Send Test to Me to email the broadcast to your own address. Attachments, merge tags, and unsubscribe links are all included so you see exactly what recipients will see. Test sends bypass the normal queue and go out immediately.

Draft saving and editing

Broadcasts can be saved as drafts and edited later. You can also delete a draft or a completed broadcast from your broadcast history. Attachments you uploaded in a compose session but didn't save are discarded when you reload or navigate away — only a saved draft preserves them.

Email templates

Navigate to Email > Templates to create and manage reusable email templates. Each template has a name, subject, and body, all of which support the same rich-text editor and merge tags as a broadcast. When composing, choose a template to prefill the subject and body. Templates belong to your organization and are shared across your staff.

Sending to hundreds of recipients

Large broadcasts are dispatched asynchronously via a background worker, so the UI never hangs while emails are being sent. You can navigate away from the page as soon as you click Send; progress continues in the background.

Delivery, open, bounce, and complaint tracking

Every outgoing email is tracked through Amazon SES. Your broadcast detail page shows:

  • Sent — dispatched to the mail provider.
  • Delivered — accepted by the recipient's mail server.
  • Bounced — permanently (invalid address) or temporarily (mailbox full). Permanent bounces automatically clear the contact's marketing opt-in so they will not be retried.
  • Complained — marked as spam by the recipient. This also clears marketing opt-in.
  • Opened and Clicked — captured via SES open/click tracking on the outgoing messages.
  • Send failed — the mail provider rejected the message at the point of send (e.g. invalid address format). These are listed in the delivery log with the error message so you can follow up individually; they do not count towards the recipient total on the broadcast summary.

Reliability of large broadcasts

If the background worker crashes or is restarted mid-send, the broadcast is automatically put back into draft status rather than being stuck in "sending" forever, and the next run only emails recipients who were not already processed — nobody gets two copies. This means you can safely re-issue a broadcast that got interrupted without needing to rebuild the audience list.

Unsubscribe

Every broadcast email includes a one-click unsubscribe link keyed to an unguessable token unique to the recipient. Clicking it immediately clears the contact's marketing opt-in; they won't receive future broadcasts. The email also sets the standard List-Unsubscribe header so mail clients like Gmail show a prominent unsubscribe button.

Trial accounts

To prevent platform misuse, broadcasts on a free trial can only be sent to your built-in Test Group — a mailing list capped at up to 5 activated staff members (see Mailing Lists). You can still compose, save drafts, send test emails to your own address, and send real deliveries to your Test Group. Sending to any other mailing list is blocked server-side until you subscribe. Only staff who have clicked the activation link in their invite email count toward the Test Group — invited-but-not-activated staff do not receive trial broadcasts.

Tip: Always send a test email first. Check it on both desktop and mobile, and click the unsubscribe link to confirm it lands on the expected page.

14

Owner self-service portal

What the owner portal is

Owners can log in to their own limited portal at /portal/my to see only the information that relates to them. They never see other owners, internal operational data, or your staff tools. This reduces phone calls to your office for routine "what do I owe?" and "when's my next week?" questions.

Inviting an owner to the portal

Open a contact record and click Invite to portal. The contact receives an email with a secure invitation link. When they follow it they set their own password and are signed in immediately. From that point forward they can log in at the normal portal login URL using their email address and password.

What an owner sees

The owner portal is automatically scoped to the contact record linked to their user account. An owner sees:

  • My dashboard — a summary of their units, upcoming bookings, and unpaid invoices.
  • My bookings — every reservation on any of their owned units, with dates, type, status, and guest details.
  • New booking — create a new owner-type reservation on their own unit (subject to overlap checks).
  • My invoices — every invoice billed to them, with pay links for anything unpaid.
  • Statement of account — a running-balance view with outstanding-by-age breakdown (current / 1–30 / 31–60 / 61–90 / 90+ days), paid year-to-date, all-time totals, and every charge and payment line ordered by date.
  • My profile — edit their name, email, and phone.

Data isolation

Owner portal queries are always filtered by the signed-in user's linked contact record. An owner physically cannot retrieve, view, or modify records belonging to other owners, even by altering URLs. This is enforced at the query level, not merely via UI hiding.

Owners who are also staff

A single user account can be both an owner (linked contact) and a staff member (linked to a permission group). Such users see a toggle in the sidebar letting them switch between the full staff portal and the owner self-service view.

Payments from the owner portal

The Pay now button on an owner's invoice uses the same secure, HMAC-signed pay link flow as invoice emails. Payment is processed through your connected Stripe account exactly as it would be on the public pay page.

Once the payment clears (Stripe webhook confirms it), the invoice is automatically marked paid and an itemised receipt email is sent to the bill-to address — referencing the invoice number, amount, and payment date, and listing the line items. Receipts are queued asynchronously and are idempotent, so a webhook retry from Stripe will not produce a duplicate email.

Tip: Consider inviting a handful of friendly owners to the portal first and asking for feedback before rolling out a bulk invite. This helps you catch anything surprising in your specific tenancy before it reaches everyone.

15

Reports

Reports library

ResortStrata ships with four pre-built reports covering the operational and financial questions most resort teams need to answer routinely. Every report has an on-screen view with filter form and summary KPIs, plus one-click CSV export that streams the underlying rows for use in spreadsheets or finance software.

Occupancy by resort / period

Navigate to Reports > Occupancy. Filters: date range, resort (optional). Output: per-resort breakdown of nights booked by type (owner, rental, blocked, maintenance). Useful for understanding utilisation and the owner-vs-rental mix.

Aged receivables

Reports > Receivables. Filters: as-of date (defaults to today). Output: unpaid invoices bucketed by age — current, 0-30 days overdue, 31-60, 61-90, and 90+. Each bucket totals by currency so you can see exactly what's outstanding and how stale it is.

Maintenance & servicing stats

Reports > Maintenance. Filters: date range. Output: total jobs, breakdown by category, status, and priority, plus average days-to-complete for finished jobs. Helps spot recurring problem areas and measure team response times.

Fee collection rate

Reports > Fee Collection. Select an assessment run (year) to see paid vs outstanding counts and dollar amounts, the collection percentage, and a per-unit grid showing owner, amount, invoice number, and payment status. Essential for AGM reporting and provisions planning.

CSV export

Every report has an Export CSV button that streams the full detail rows as a CSV file. The file opens directly in Excel, Google Sheets, or any accounting package that accepts CSV input.

Tip: Schedule a recurring calendar reminder (monthly or quarterly) to export the Receivables and Fee Collection reports — this makes trend-spotting far easier than relying on ad-hoc reviews.

16

Staff & permissions

Inviting staff

Navigate to Settings > Staff and click Invite Staff. Enter their first name, last name, email address, and pick one or more permission groups to assign on invitation. The person receives an invitation email with a secure activation link. They click the link, set their own password, and at that point become an activated member of your organization with the selected permissions.

Until they click their activation link, invited staff appear as pending — they can't log in, and they don't count toward the Test Group for trial broadcasts. You can re-send an invite from the staff list if their original email was lost.

Editing existing staff

From the staff list click Edit next to any person to update their first name, last name, and permission group assignments. Changes take effect immediately on their next request.

Permission groups

Access within ResortStrata is controlled through permission groups. A permission group is a named collection of permissions that can be assigned to staff. Typical examples:

  • Housekeeping — servicing.view/edit, housekeeping.view/edit.
  • Reservations desk — reservations.view/edit, contacts.view, occupancy.view.
  • Finance — invoices.view/send, fees.manage, reports.view, billing.manage.
  • Manager — broad access across the entire organization.

Available permissions

The following permissions can be included in a group:

  • resorts.view / resorts.edit — view or manage resorts and units.
  • contacts.view / contacts.edit — view or manage contacts and tags.
  • occupancy.view / occupancy.edit — view or manage base occupancy allocations.
  • reservations.view / reservations.edit — view or manage the reservation / PMS workflow (check-in, check-out, cancellation).
  • housekeeping.view / housekeeping.edit — view or change the housekeeping status board.
  • servicing.view / servicing.edit — view or manage servicing tasks.
  • jobs.view / jobs.edit — view or manage maintenance jobs.
  • fees.manage — configure and issue annual fee assessments.
  • invoices.view — view invoices.
  • invoices.send — send invoices to clients.
  • email.broadcast — compose and send broadcast emails, and manage email templates and mailing lists.
  • reports.view — access the reports library and CSV exports.
  • billing.manage — access billing settings and manage the subscription.
  • users.manage — invite, edit, and remove staff, and assign permission groups.
  • groups.manage — create, edit, and delete permission groups.
  • payments.stripe_credentials — view and update Stripe API credentials.
  • payments.bank_instructions — edit bank transfer instructions.
  • support.manage — create and manage support tickets.

Creating and editing permission groups

Go to Settings > Permission Groups and click Create Group. Give the group a name and select the permissions it should include. You can edit or delete groups at any time — changes take effect immediately for everyone assigned to that group.

Assigning groups to staff

From the staff list, click Edit on a person. Check one or more permission groups and save. A staff member's effective permissions are the union of all permissions from all assigned groups.

Note: New permissions introduced in recent releases (fees.manage, reservations.*, housekeeping.*, reports.view) are not added to existing groups automatically. Review your groups and add the new permissions where appropriate before users will see the corresponding sidebar items.

Resort-scoped access

By default every staff member can see every resort in the organization. For multi-resort organizations, the staff edit page has a Resort access section — tick "Restrict to specific resorts" and choose which resorts this member should work in. Regional concierges, per-site housekeeping crews, and single-resort reservation desks are the common use cases.

When a restriction is active, the following pages automatically filter themselves to only the allowed resorts:

  • Resorts — list + edit + delete (staff can't open a resort they aren't scoped to; they get a 403).
  • Units — all unit pages nested under a resort.
  • Reservations list and the "new reservation" unit picker.
  • Occupancy allocations list and the "new allocation" unit picker.
  • Servicing task list and the "new task" unit picker.
  • Maintenance jobs list and the "new job" resort picker.
  • Housekeeping status board.

Not yet filtered by resort restriction (visible to any staff member with the relevant permission): the Invoices list, Fee assessments, Reports, and Dashboard stats. Those areas are intentionally cross-resort for now — finance and admin roles typically need a whole-org view. This is a planned follow-up.

Changes to a staff member's resort access are recorded in the audit log as staff.resort_access_changed with before/after lists.

Removing staff

To remove a staff member from your organization, go to their profile in the staff list and click Remove. This revokes their access to all organization data immediately.

Tip: Follow the principle of least privilege — give staff only the permissions they need for their role. This reduces risk and keeps your data secure.

17

Billing & subscription

Trial period

New organizations receive a 30-day free trial with full access to all features. You can see how many days remain on your trial from the Billing page.

Per-room pricing model

Pricing is based on the total number of units across all resorts in your organization. There is a minimum of 5 units for billing purposes. If you add more units, your subscription adjusts accordingly.

Supported currencies

ResortStrata supports subscriptions in USD, GBP, and EUR. Choose your preferred currency when subscribing.

Payment methods

ResortStrata accepts two payment methods for your subscription:

  • Card payment (Stripe) — available in GBP, USD, and EUR. Charges are processed instantly.
  • Direct Debit (GoCardless) — available in GBP only (UK BACS scheme). Mandate setup takes 2–5 working days; once active, payments take roughly 3 working days to clear.

From the Billing page, click Subscribe on the method that suits you. Card payments redirect to a Stripe Checkout session; Direct Debit redirects to a GoCardless mandate-authorisation page where you confirm bank details and authorise future payments.

Switching payment methods

You can switch between Card and Direct Debit at any time from the Billing page. To prevent double-billing, the new payment method takes effect at your next renewal date: your current method will be charged once more on that date, and the new method takes over from the cycle after.

If you initiate a Direct Debit setup close to your renewal date, the new method may take an extra cycle to become active — bank mandates need a few working days to authorise. The Billing page shows your switch status while it is in flight, including the renewal date the new method takes effect on.

You can cancel a pending switch at any time before the renewal date by clicking the link in the in-progress banner on the Billing page.

What happens when your subscription expires

If your trial ends without subscribing, or if your paid subscription lapses, portal access is restricted to the Billing page only. You will not lose any data — it remains safely stored — but you will need to subscribe or renew before you can access other portal features again.

Tip: Subscribe before your trial ends to avoid any disruption. You can cancel at any time from the Billing page.

18

Support tickets

Creating support tickets

If you need help or encounter an issue, navigate to Support and click New Ticket. Provide the following information:

  • Subject — a brief summary of your issue or question.
  • Description — detailed information about what you are experiencing, including steps to reproduce if applicable.
  • Urgency — how urgently you need a response.
  • Category — the area of the platform the issue relates to.

Viewing ticket details and message history

Click on any ticket in your support list to view its full details and the complete message history. All communication between you and the support team is recorded in the ticket thread.

Replying to tickets

Use the reply form at the bottom of the ticket detail page to send additional messages. Provide any requested information or follow-up details to help resolve your issue quickly.

Closing tickets

Once your issue is resolved, you can close the ticket. Closed tickets remain in your history for reference but are no longer active.

Tip: Include as much detail as possible when creating a ticket — screenshots, error messages, and steps to reproduce all help the support team resolve issues faster.

19

Audit log

Every money-touching action in ResortStrata is recorded to a per-organization audit log. Staff with the users.manage permission can view it under Settings > Audit log. The log is append-only — entries cannot be edited or deleted from the UI.

What's recorded

Each entry captures the who, what, and when:

  • Actor — the staff member who performed the action (or system for automated events like Stripe webhooks and the late-fee job). The actor's name and email are snapshotted so the entry remains readable even if the user is later removed.
  • Action — a dotted identifier like invoice.sent, invoice.paid, credit_note.issued, credit_note.stripe_refund, invoice.late_fee_applied, late_fees.policy_changed, staff.invited, or staff.removed.
  • Target — the entity the action affected, plus a human label (e.g. invoice number, credit-note number, contact name).
  • Summary — one-line plain-English description.
  • IP address — the request IP that initiated the action, when available.
  • Details — structured JSON context for forensic replay (e.g. before/after values for policy changes, Stripe refund IDs, fee-cents and days-overdue for late fees).

Filtering and browsing

The log page shows the most recent 50 entries, newest first, paginated. Filter by action prefix (e.g. invoice. to see every invoice event, credit_note. for credits) or target type (e.g. Invoice, Membership).

20

Security

Password requirements

All user passwords must be at least 8 characters long. We recommend using a strong, unique password that combines letters, numbers, and symbols.

Password reset flow

If you forget your password, click Forgot password on the sign-in page. Enter your email address and you will receive a password reset link. This link is time-limited for security — use it promptly.

Two-factor authentication (2FA)

Every user can opt into time-based one-time password (TOTP) 2FA from Settings > My account. Click Enable 2FA, scan the QR code with any compatible authenticator app (Google Authenticator, 1Password, Authy, Bitwarden), and enter a code to confirm setup.

On future sign-ins, after the correct password is entered, you'll be asked for the current 6-digit code from your app. If the code matches (±30 seconds of clock drift), you're signed in; otherwise the sign-in is rejected.

Recovery codes are generated when you enable 2FA — a set of 10 one-time codes you should save somewhere safe (print them, store them in a password manager). If you lose access to your authenticator device, enter one of these codes instead of a 6-digit TOTP code on the 2FA prompt. Each code works once. Once you run out of codes, turn 2FA off and on again (while still logged in) to generate a new set.

To turn 2FA off, open Settings > My account while signed in and click Turn off 2FA. This reverts the account to password-only. Turning 2FA on and off is captured in the audit log as 2fa.enabled / 2fa.disabled.

Session security

Your portal session is secured with industry-standard practices. Sessions expire after a period of inactivity, and all session cookies are transmitted over HTTPS only.

Login throttling

To protect against brute-force attacks, the system enforces login throttling: after 5 failed login attempts within a 15-minute window, further attempts are temporarily blocked. Wait for the cooldown period to pass before trying again.

CSRF protection

All forms in the portal are protected with CSRF (Cross-Site Request Forgery) tokens. This prevents malicious websites from submitting actions on your behalf.

Encrypted storage for Stripe credentials

Your Stripe API keys and webhook secrets are stored using encryption at rest. They are never displayed in full after initial entry and are only decrypted when needed to process a payment.

HMAC-signed invoice payment links

Payment links sent to clients are signed using HMAC (Hash-based Message Authentication Code). Each link includes a signature and an expiry timestamp. This ensures that links cannot be forged or tampered with, and that they become invalid after a set period.

Organization data isolation

All data in ResortStrata is strictly isolated by organization. Users in one organization can never see or access data belonging to another organization. This isolation is enforced at the application level across all queries and actions.

Tip: Use a unique, strong password for your ResortStrata account and do not share your login credentials with others. Use the team invitation system to grant access to colleagues instead.

21

Multi-organization

Switching between organizations

If you belong to more than one organization — for example, if you manage properties for multiple companies — you can switch between them using the organization switcher in the portal sidebar. Clicking on a different organization changes your context immediately.

How organization context works

When you select an organization, all portal data — resorts, contacts, invoices, jobs, and everything else — is scoped to that organization. The sidebar, dashboard, and all list views reflect only the data belonging to your currently selected organization.

Data isolation between organizations

Each organization's data is completely separate. Contacts, resorts, invoices, team members, and settings from one organization are never visible when you are working in another. This ensures privacy and prevents cross-contamination of data between different business entities.

Tip: Check which organization you are viewing before creating records. The organization name is displayed in the sidebar so you always know your current context.