Foxlendar guide
Turn your Shopify store into a booking engine for rooms, villas, apartments and rentals. No code, no separate payment provider.
Overview
Foxlendar adds date-based bookings to Shopify. Guests pick dates on your product page and pay through normal Shopify Checkout. You manage everything from the app dashboard.
| What you sell | How it works |
|---|---|
| Rooms, villas, apartments | Each is an "accommodation" linked to a Shopify product. |
| Nightly stays | Guests pick check-in/check-out. Price is calculated per night. |
| Add-ons | Optional services like breakfast, cleaning or airport pickup. |
| Across channels | iCal sync with Airbnb, Booking.com and Vrbo Premium. |
Prices and dates are locked server-side on a Shopify draft order. Guests cannot change them at checkout. Bookings stay in sync when an order is paid, cancelled or refunded.
Core concepts
Accommodation
A bookable type, like "Deluxe Double" or "Ocean Villa". Holds capacity, amenities, pricing and a link to a Shopify product.
Unit
A physical instance. "Apartment A1" and "A2" are two units of the same accommodation. Two units means two guests can book the same dates.
Product mapping
The link between an accommodation and the Shopify product the customer pays for.
Rate plan
A pricing package: "Flexible" or "Saver". When a room has rates under more than one plan, guests choose.
Season
A date range (e.g. "Summer peak") with its own pricing. When seasons overlap, higher priority wins.
Rate
The nightly price for an accommodation under a plan, optionally for a season or single date.
Booking rule
Min/max stay, allowed check-in days, advance windows, buffer. Can apply per room or per season.
Service
An add-on (breakfast, parking, cleaning) with its own pricing model.
Block
Dates made unavailable (maintenance, owner stay, or imported from another channel).
Quick start
- Install from the Shopify App Store.
- Create an accommodation. Accommodations → Add. Set capacity, add at least one unit.
- Connect a Shopify product. In the accommodation editor, click Select product.
- Set a price. Rates → create a rate plan, add a base nightly rate. No rate? The product price is used as a fallback.
- Add storefront blocks. Theme editor → Add block → Reservation form and Accommodation details.
- Test. Book a stay end to end. The paid order appears as a confirmed booking.
Plans & limits
| Free | Standard | Premium | Business | |
|---|---|---|---|---|
| Accommodations | 1 | 5 | 25 | Unlimited |
| Units / accommodation | 2 | 10 | Unlimited | Unlimited |
| Bookings / month | 15 | 150 | 750 | Unlimited |
| Seasons & booking rules | No | Yes Standard | Yes Premium | Yes |
| Channel sync (iCal) | No | No | Yes Premium | Yes |
| Request to book | Yes | Yes | Yes | Yes |
| Discounts & memberships | Yes | Yes | Yes | Yes |
Hitting a limit is explained inline and points you to upgrade. Going over your monthly booking allowance does not block checkout. Moving to a smaller plan holds back extra accommodations (nothing is deleted); upgrading restores them at once.
Accommodations & units
Create an accommodation
- Accommodations → Add accommodation.
- Connect a Shopify product (see next section).
- Set capacity: max adults, children, and (if enabled) babies.
- Add at least one Active unit.
- Save.
| Section | What it controls |
|---|---|
| Product mapping | The Shopify product the guest pays for. |
| Status | Active (bookable), Inactive, Maintenance, or Archived. |
| Location | A saved address for the map block and location search. |
| Details & amenities | Attributes (size, beds, view) and amenity checkboxes. |
| Booking mode | Instant checkout or Request to book. See Request to book. |
| Services | Which add-ons this room offers. |
| Units | Physical inventory. 2 units means 2 guests can book the same dates. |
Connecting Shopify products
- In the accommodation editor, under Product mapping, click Select product.
- Pick the product (its first variant is used).
- Save.
Name, description and images come from the product. Foxlendar never copies them, so nothing goes out of sync. Use Edit in Shopify on the mapping card to change them at the source.
Checkout thumbnail
| "This is a physical product" | Result at checkout |
|---|---|
| Off (recommended) | Product image shows next to the booking. |
| On | Shopify asks for shipping. Booking falls back to a plain line, no thumbnail. |
Flip this from the accommodation editor. Foxlendar turns it off automatically the first time you connect a product.
Locations
A saved address you create once and reuse across accommodations. Powers the map block and the storefront location filter.
- Locations → Add location. Fill in city (required), address, country, and optionally latitude/longitude for the map pin.
- Open an accommodation → Location section → pick the location.
The location filter appears once you have two or more accommodations with different locations. Skip this entirely if you don't need a map or location search.
Amenities & attributes
| What it is | How to set it up | |
|---|---|---|
| Amenities | Facilities shown as icons (Wi-Fi, pool, parking). | Amenities menu → add with label, icon, sort order. Then tick per accommodation. |
| Attributes | Facts like size, bed type, view. | Attributes menu → add with a type (Text, Number, Yes/No, Select). Fill in values per accommodation. |
Both render through the Accommodation details block.
Letting guests filter by an attribute
Guests can narrow the search results by your own details — view, bed type, size, amenities. Two steps, in this order:
- Fill the detail in on your accommodations. Accommodations → open one → set the value. Reuse the same wording across rooms: the filter is built from the values actually in use, so "Garden" on four rooms is one choice, while four different spellings are four.
- Settings → Search filters. Tick what guests may filter by, then Save. Everything filterable is in that one list, including Amenities. Nothing is on until you tick it.
Done when: the row reads Ready in that list. The filter then appears above the search results, after a guest searches.
What each detail becomes
You do not choose the control. It follows from the detail, so a guest is never offered a combination no room can satisfy.
| Detail | Control | Example |
|---|---|---|
| Amenities, or any detail a room holds several of | Buttons, several at once. Narrows to rooms that have all of them. | Wi-Fi + Pool |
| A detail a room holds one of (view, bed type, category) | Buttons, one at a time. Picking another replaces it. | Garden / City / Ocean |
| A small whole count (bedrooms, bathrooms) | At-least thresholds. | 2+ / 3+ |
| An amount (size, and anything measured) | Min and max fields, bounded by what you actually have. | 1,200 – 2,400 sq ft |
| Yes/No | Cannot be filtered. Still shows in the details block. | — |
For an amount, write the unit the same way on every accommodation ("1,200 sq ft", "120 m²"). Foxlendar reads the number, keeps your wording for the label, and understands both metric and imperial units.
If a row will not switch on
A greyed-out row says why. There are two reasons:
- Fewer than two different values — every room matches already, so the filter would narrow nothing. Fill the detail in on more accommodations.
- More than 12 different values — too many buttons to be a filter. Reuse wording where you can, or use numbers for anything measured.
Rate plans
A rate plan is a pricing package. Most properties have one or two (e.g. "Flexible" and "Saver").
- Rates → Rate plans → New rate plan.
- Name it. Toggle Refundable if applicable.
- Add rates inside the plan (covered next).
A plan holds what a price means — refundable or not, stay-length limits, extra-guest charges. The nightly amounts live on the price calendar.
If a room has rates under more than one active plan, the storefront shows a plan selector. One plan means no selector.
Price calendar
Rates opens on the price calendar: what each accommodation costs per night, and where that price came from. Every figure is produced by the same engine that quotes a guest, so what you see here is what checkout charges.
| View | Use it for |
|---|---|
| Month | One accommodation as a seven-column calendar. The default — prices sit under the weekday they apply to. |
| Year | Every accommodation against all twelve months. Use it to see whether your rooms are priced consistently across the year. |
Each cell names where its price came from — Season, Holiday, Weekend, or Set for this date. Use the month dropdown to jump up to a year ahead.
Changing prices
- One night — click the cell, type a price, Save. Click it again to remove that price and fall back to the season or base rate.
- Many nights — Change prices. Set a price, or raise/lower by an amount or a percent, over a date range. Tick weekdays to hit only Fridays and Saturdays, for example.
An increase is worked out once against the current price and saved as an ordinary price per night. Nothing compounds later, so a night's price is always the number on screen.
Rates & how price is calculated
| Field | Meaning |
|---|---|
| Accommodation | Which room this rate applies to. |
| Season | Optional. No season = base rate (the standing price). |
| Date override | A price for one exact date. Beats season and base. No multipliers applied. |
| Price | Nightly price. |
| Base adults / children | How many guests the price covers before extras kick in. |
| Extra adult / child | Added per night for each guest above the included count. |
| Min / Max nights | Rate is only eligible when stay length is within this range. |
Price precedence (per night)
- Exact date rate → used as-is, no multiplier.
- Season rate → higher-priority season wins if overlapping.
- Base rate → the fallback when no date or season match.
- Shopify product price → final fallback.
Season, base and fallback nights get the weekend or holiday multiplier. Per-guest extras are added on top.
Example
Base $200/night, 2 adults included, extra adult $30/night. Weekend 1.2×. 3 adults book Fri–Sun (2 nights):
Seasons
A named date range Standard you attach pricing to. Create under Seasons.
| Field | Meaning |
|---|---|
| Name | Internal label, shown when picking a season on a rate. |
| Start / End | The range the season covers. |
| Repeat every year | Matches the same days every year, so you don't recreate the season each January. The year you entered is then ignored. |
| Priority | Higher number wins when two seasons overlap. Default 0. |
| Active | Only active seasons affect pricing. |
A repeating season can cross the new year — enter 21 December to 6 January and it covers December and January every year. It cannot be longer than a year; that is what the base rate is for. Existing seasons are not repeating until you tick the box, so nothing reprices on its own.
Weekend & holiday pricing
Under Settings → Pricing defaults. Apply to season, base and fallback nights. Never to an exact date rate.
| Multiplier | Default | Applies to |
|---|---|---|
| Weekend | 1.2× | Nights on your chosen weekend days (Sat/Sun by default). |
| Major holiday | 2× | Dates you list under Major holiday dates. |
| Minor holiday | 1.5× | Dates you list under Minor holiday dates. |
Enter holiday dates as YYYY-MM-DD, one per line. Only one multiplier per night, in this order: major holiday > minor holiday > weekend.
Services (add-ons)
Optional extras Standard guests add while booking. Create under Services, then assign to accommodations.
| Pricing type | Charged as | Example |
|---|---|---|
| Per booking | Flat fee, once | Cleaning: $50 |
| Per night | × nights | Parking: $10/night |
| Per guest | × guests | Welcome drink: $5/person |
| Per guest per night | × guests × nights | Breakfast: $15/person/night |
Common fees
| Fee | Set it up as |
|---|---|
| Pet fee (once) | Per booking, flat amount. |
| Pet fee (nightly) | Per night. |
| Tourist / city tax | Per guest per night. Turn Taxable off to avoid taxing a tax. |
| Cleaning fee | Per booking, flat amount. |
Mark a service as Required on an accommodation to charge it automatically on every booking. A service can optionally link to a Shopify product for a checkout thumbnail.
Where price and Required live
These are two different screens, and the split matters:
| Setting | Where | Scope |
|---|---|---|
| Price, pricing type | Services → the service | Shop-wide. Every accommodation offering this service uses this price. |
| Required | Accommodations → a room → Services | Per accommodation. The same service can be required on one room and optional on another. |
Required means “always charged”, not “free”. Ticking it on a paid service charges every booking for that room automatically, whether or not the guest selects it. It is how you collect a cleaning fee or city tax — not how you give something away.
Services at no charge
Set the price to 0. The storefront then shows a word instead of an amount, and which word depends on the Required tick on that accommodation — because the two mean different things to a guest.
| Setup | Guest sees | Use it when |
|---|---|---|
| Price 0 + Required | Included | The cost is already in your nightly rate. The guest is paying for it, just not as a separate line. |
| Price 0, not required | Free | A genuine freebie the guest opts into. Costs them nothing either way. |
| Example | Set it up as | Why |
|---|---|---|
| Breakfast in the rate | Price 0, Required → “Included” | You built breakfast into the room price. Saying “Free” would suggest it costs nothing, which is not true — it is bundled. |
| Airport transfer in a package rate | Price 0, Required → “Included” | Same reasoning: the transfer is priced into the package the guest booked. |
| Late checkout, offered free | Price 0, not required → “Free” | Optional, and it genuinely costs nothing. The guest chooses whether to take it. |
| Welcome drink on arrival | Price 0, not required → “Free” | A gift, not part of the rate. Nothing changes if the guest declines. |
| Breakfast sold separately | Price 15, per guest per night | Charged on top, so it shows the amount rather than a word. |
Both appear in the guest’s price breakdown so they can see what their stay covers, even though neither adds to the total. This follows standard hotel wording: “breakfast included” means bundled into the rate, while “free Wi-Fi” means no charge at all.
Paid on most rooms, included on one
The common case: breakfast costs $15 in your standard rooms, but your VIP suite sells at a rate that already covers it. One service, two prices — set Price for this accommodation on the room that differs.
| Accommodation | Price for this accommodation | Required | Guest sees |
|---|---|---|---|
| Standard room | blank | no | $15 — they choose |
| VIP suite | 0 | yes | Included |
| Garden room | 10 | no | $10 — they choose, cheaper here |
Blank means “use the service’s own price”, so rooms you never touch keep charging the normal amount. Enter 0 only where the rate already covers it.
Do not tick Required and leave the price blank expecting it to be free. That charges every booking for that room the full $15 automatically — the opposite of including it. Required controls whether it is charged; the price field controls how much.
Quantity limit
For Per guest and Per guest per night pricing, decide how many a guest may order.
| Setting | What the guest can order | Use it for |
|---|---|---|
| Limit to the number of guests (default) | Up to one per person on the booking. Fewer is still allowed. | Breakfast, dinner, spa entry — anything consumed once per person. |
| Let the guest choose | Any amount up to the Maximum quantity you set. | Things you genuinely sell by the piece: a bottle of wine, extra towels. |
Breakfast for two of your three guests is a normal request, so the limit only stops them going above the headcount. If a guest lowers the number of people after picking an add-on, the add-on comes down with it.
Different prices per guest type
Children at half price, infants free. Set it up once on the add-on and the guest still sees a single line, with the breakdown underneath:
| Charge | What it does | Example |
|---|---|---|
| Full price | Pays the service price. | Adults: $12 |
| Percent of full price | A share of it, rounded per person. | Children at 50%: $6 |
| Fixed amount | Its own price, ignoring the service price. | Teens: $9 |
| Not charged | Free, but still counted and listed. | Infants eat, and your kitchen needs the number. |
| Not offered | Left out completely. | A 16+ spa entry: children never appear on it. |
Not charged and Not offered are not the same thing. Both cost nothing, but the first keeps the guest on your lists and the second removes them. An infant who eats breakfast free is still a place setting; a child who cannot enter the spa is not. If no guest type qualifies — a 16+ add-on on a booking with no adults — the add-on simply does not appear.
| Example | Adults | Children | Infants |
|---|---|---|---|
| Breakfast, kids half price | Full price | Percent 50 | Not charged |
| Kids club | Not offered | Fixed amount | Not offered |
| Spa entry, 16+ | Full price | Not offered | Not offered |
| Tourist tax, under-18s exempt | Fixed amount | Not offered | Not offered |
| Airport transfer | Same price for everyone | — | — |
The guest types and their ages come from Guest types & capacity, so “who counts as a child” is defined once and used everywhere. The percentage is rounded per person, and the admin shows you the resulting amount as you type it — so you see what 50% of an odd price really is before a guest does.
On the invoice each charged type gets its own line (“Breakfast (Adults) ×6”, “Breakfast (Children) ×3”), which is also what gives your kitchen a cover count per type rather than one total.
Booking rules
Defaults for all rooms: Settings → Booking rules. Per-room or per-season overrides: Booking rules in the menu Standard.
| Rule | Effect |
|---|---|
| Min / Max stay | Fewest and most nights allowed. |
| Check-in / Check-out days | Restrict arrivals or departures to certain weekdays. |
| Min / Max advance | How far ahead a guest must, or can, book. |
| Buffer | Empty days before/after each booking (e.g. for cleaning). |
| Same-day booking | Whether guests can book for today. |
| Require guest details | Name, email and phone required on the storefront. |
| Request to book | Review before payment. See Request to book. |
The storefront date picker enforces these live. Disallowed dates are greyed out with a message.
Guest types & capacity
Settings → Guest policy is the one place you define who you sell to: the name of each guest type and the ages it covers. The age text guests read on the booking form (“3–17”, “18+”) is generated from those numbers, so your wording and your prices can never say different things.
| Type | Default ages | Notes |
|---|---|---|
| Adults | 18+ | Always shown. Cannot be removed — something has to cover your oldest guests. |
| Children | 3–17 | Always shown. |
| Babies | 0–2 | Row is off by default. Enable it in Settings, then choose whether babies take a place in the room and whether they are charged. |
Capacity is set per accommodation (max adults, children, babies). A guest count that exceeds it is rejected with a clear message.
Setting your own age ranges
The defaults follow the common convention that under 18 is a child. They are a starting point, not a reading of any label — check them against your own policy. If your adults start at 13, set the rows to 0–2, 3–12 and 13+, and every guest who reads the form sees “13+” beside Adults.
Two rules the form enforces, because prices depend on them:
| Rule | Why |
|---|---|
| No gaps, no overlaps | An age in no type has no price. An age in two types has a price that depends on the order the rows happen to be in. |
| The oldest type has no upper limit | Something has to cover your oldest guests, so that row's To age is not yours to set. |
You cannot rename a type out of existence while an add-on still prices it — if you switch the Babies row off and an add-on charges babies, the save is refused and the message names the add-on so you can clear it first.
How a guest's type is decided
By the counter the guest uses. Each guest type is one row on the booking form, with its age range printed beside the name, and the number the guest puts on that row is what gets priced.
| On the booking form | What it prices |
|---|---|
| Adults · 18+ | Your Adults price |
| Children · 3\u201317 | Your Children price |
| Babies · 0\u20132 | Your Babies price, if the row is enabled |
The guest reads the range and picks their own row. Foxlendar does not ask each child’s age on top of that, and deliberately so: the same fact entered twice can disagree with itself, and a booking form that asks the same thing again is a form more people abandon.
If one children’s price is not enough
Split the bracket instead of asking for ages. A property that charges a 15-year-old more than a 5-year-old wants two types, not one type and a question:
| Type | Ages | Breakfast |
|---|---|---|
| Babies | 0–2 | Not charged |
| Children | 3–12 | 50% |
| Teens | 13–17 | 75% |
| Adults | 18+ | Full price |
Storefront blocks
Theme editor → Add block → pick a Foxlendar block. No code. Inherits your theme fonts and colors.
| Block | Page | What it does |
|---|---|---|
| Availability search | Home / landing | Dates + guests + location search. Lists matching rooms. |
| Accommodations grid | Collection / landing | A grid of bookable rooms with capacity and starting price. |
| Reservation form | Product | Date picker, live price, Book now button. The only block guests book from. |
| Accommodation details | Product | Capacity, amenities and attributes. |
| Availability calendar | Product | Month calendar with open/blocked nights and nightly prices. |
| Location map | Product | Map with pin and directions (Google or OpenStreetMap). |
Block settings
Click a block in the theme editor to set what it shows. On the Reservation form that includes Show heading — untick it to drop the title above the form — plus the guest picker, check-in/check-out times, optional services and the price summary.
Appearance
Theme editor → App embeds (puzzle-piece icon) → enable Foxlendar appearance. Set accent color, button text color, corner radius and spacing for all Foxlendar blocks.
How a booking is created
- Guest picks dates and services. Price updates live.
- Foxlendar validates server-side: product is bookable, room is active, capacity fits, a unit is free, rules pass.
- "Book now" creates a Shopify draft order with the exact price locked. Guest goes to Shopify Checkout.
- Order paid → confirmed booking, unit assigned, services attached.
- Order cancelled or refunded → booking cancelled, unit released.
Multi-room booking
Off by default. Turn it on in Settings → Multi-room booking. Once on, it works on every product that shows the booking form.
A guest can then put more than one room in a single order — several of the same room, or a mix of different ones — same dates, one checkout. The rooms are held together, so there's no second trip through checkout hoping the other room is still free. A couple can book a Deluxe for themselves and a Standard Double for the kids and pay once.
Room combinations in search
When a group is too big for any single room, the search results suggest a combination that fits instead of showing "no availability". Search for six and you might get a Family Cottage (sleeps 4) plus a Standard Double (sleeps 2); the guest books both in one go.
This only shows up when no single room fits, so it doesn't clutter ordinary searches. It needs multi-room booking switched on, since the guest has to be able to book the whole combination together.
Request to book
Turn on in Settings → Booking rules, or per accommodation under Booking mode. Available on all plans. Built for long stays, group bookings and student housing.
The flow
- Guest submits. Same validation as instant booking. Email required.
- Room is held. Real unit reserved, calendar shows amber, channel dates blocked.
- You review under Requests: guest details, message, stay, total.
- Approve: invoice emailed to the guest. Set a custom room price or change the discount first.
- Guest pays → booking confirmed on the held unit.
- Or decline: room released, any existing invoice deleted.
Per accommodation
Each accommodation can override the shop setting: Always request, Always instant, or Follow shop setting (default). Vet long stays and let day rooms sell themselves.
Hold window
Hold requests for sets how long before auto-decline. Default 48 hours. Set to 0 to hold indefinitely.
Staff notifications
Email your team when a request arrives, and again while an approved request is still unpaid. Under Requests, in the Staff notifications card.
Set it up
- Switch the card On.
- Send to — up to 10 addresses, separated by commas.
- Send test to prove it arrives before you rely on it.
- Remind unpaid after — the first reminder. Default 2 days.
What gets sent
| When | Contains | |
|---|---|---|
| New request | A guest submits | Guest, reference, room, dates, nights, total, their message, and a link that opens the request |
| Unpaid reminder | 2, 4 and 8 days after you approve, then no more | Every request still awaiting payment, with the nights each one is holding |
One email per event, however many rooms or requests it covers: a six-room enquiry is one email, and three unpaid requests coming due together are one digest rather than three messages.
The reminder schedule
Your number sets the first reminder; the second and third follow at double and quadruple that. With the default 2 you get day 2, 4 and 8, counted from the day that request was approved — each request has its own schedule. After the third, Foxlendar stops.
Set it to 0 for no reminders. You still get the new-request email.
Replies
Mail comes from Foxlendar's own address, but the reply-to is the guest — so your team can answer them straight from the inbox without opening the app.
Request a Quote
You price a stay and send the guest a payment link Premium. Under Quotes.
- New quote. Pick accommodation, dates, guests. Override the room total if needed.
- Create quote. Draft order created. Invoice emailed if you added an email, otherwise copy the link.
- Guest pays → booking created with a unit assigned.
Changing stay dates
Plans change after a booking is made. Two questions decide what you can do: has anyone checked the guest in, and has the money been collected.
| Buttons on the booking | |
|---|---|
| Before the arrival date | Reschedule stay |
| Arrival date passed, nobody checked the guest in | Record departure + Reschedule stay |
| Checked in, not paid yet | Record departure + Change check-out |
| Checked in, paid | Record departure |
Only the buttons that apply are shown, and each one leads to a screen that will accept what it offers.
Checking a guest in
The Arrival card on the booking records when the guest actually turned up. Pick the date and time, then Check in. Today, the time defaults to now. For an earlier day it defaults to your check-in time, since you will rarely know the exact minute.
- Once a guest is checked in, the arrival date is locked. Moving it would re-price nights already slept. Only the check-out can still change.
- A guest let in early can be checked in before the booked date. A departure can then be recorded from that day.
- An arrival cannot be in the future, after the booked check-out, or after a recorded departure.
- Checked in the wrong booking? Clear check-in unlocks the arrival date again.
Checking in never changes availability or money. A guest who arrives two days late does not give back the first two nights: the room was held for them, so those nights could not have been sold.
Guest leaves early
Use Record departure and pick the day they actually left. The unused nights go straight back on sale, on the calendar and on your connected channels. The booked dates are never rewritten. They stay as the record of what was agreed, and the departure sits beside them, which is what lets you undo it.
What happens to the money depends on whether it has been collected:
| Money | |
|---|---|
| Paid | Nothing changes. No refund is calculated, because none is owed: no hotel or OTA returns nights a guest chose not to use. To refund as a gesture, do it from the Shopify order. |
| Approved, not paid yet | The total is recalculated for the nights actually stayed, and the guest is emailed a new invoice. Their old payment link stops working. |
| Not approved yet | The total is recalculated. No invoice exists yet, so nothing is sent. The guest sees the new figure when you approve. |
For an unpaid stay, the screen shows the current total beside the new one before you save. It also flags when a shorter stay falls into a different rate plan band. Leave after 28 nights of a 35-night booking on a “31+ nights” rate, and the stay is priced on your 1–30 night rate. That can cost more than the original booking.
Wrong guest or wrong day? Open Manage early departure and clear it. For an unpaid stay, the total returns to the full booked stay. Clearing asks for the nights back, so it is refused if somebody has booked them in the meantime. The screen says so rather than double-booking the room.
Moving the dates
Use Reschedule stay to move both dates, or Change check-out for a checked-in guest who is not paid yet. This creates a new agreement, longer or shorter. Use it when the plan changes. When the guest has simply left, use Record departure instead. The screen shows, before you save:
- Nights before and after, and the current total beside the new one.
- The price per night and where each came from: your base rate, a season, a weekend rule.
- Any discount the guest holds, re-applied to the new nights. A fellowship or member rate is kept, not quietly dropped.
- A warning when the new length crosses a rate plan band.
- Any booking rule the new dates break, such as a minimum stay or the gap you keep between stays.
- Nights in the new range that another booking already holds, listed by date.
A broken booking rule can be overridden: tick Book these dates anyway and save. The override is recorded in the booking's history. A night that another booking already holds cannot be overridden, because that would sell the room twice.
Not paid yet: the price follows the dates. For an approved request the old invoice is deleted and a new one is emailed, so the guest cannot pay the old figure for the new stay. Paid: the amount collected does not move. If the new dates are worth less and your rate plan is non-refundable, nothing is owed. Any other difference has to be written off explicitly before the change saves, and who did it is recorded.
Guest wants to stay longer
If the guest is not paid yet, or has not been checked in, move the check-out with the button on the booking. The gap you keep between stays is checked against the next booking, not against the guest's own nights. A guest who has paid and is checked in gets a new booking for the extra nights, in the same room if it is free.
When a change is refused
- The stay has ended. Those dates are history now. Create a new booking.
- The guest is checked in. The arrival date is locked. Clear the check-in if it was recorded by mistake.
- An early departure is recorded. Clear it first, then move the dates.
- Cancelled, declined or refunded. There is no stay left to change.
- No price for those dates. Add a nightly rate for that length, or enter a room total when recording a departure. Saving with no price would set the total to zero.
Every change is written to the booking's history: check-ins, departures, old and new dates, the amounts before and after, any rule overridden or difference waived, and whether the invoice was reissued.
Managing bookings
Dashboard
Tabs: All, Confirmed, Cancelled. Search by guest name, email, phone or order number. A Needs unit badge flags oversold bookings.
Calendar
Month / Week / Day view, grouped by accommodation or by unit. Color-coded bars. Click for guest details, total, and links to the booking and Shopify order.
Closing dates
You never need a reservation to block a date. Drag across the days on an accommodation's row, or use Close dates for any range — including one that runs past the month on screen. Add a reason, and a note only you see.
- Closed ranges appear as striped bars. Click one to change its dates or note, or to reopen it.
- Dates booked on a connected channel appear too, in a different colour, and are read-only here — reopening one would put a sold night back on sale. Change those on the channel.
- The end date is a check-out date. To close only the night of the 15th, choose the 15th as the first night and the 15th as the last; the calendar shows you which day it reopens.
- Seasonal closure, lower down the page, closes every active accommodation for a range in one step.
Manual booking
Add booking for phone or walk-in. Creates a paid Shopify order (offline payment) and a confirmed booking.
Cancelling & refunds
- Cancelling releases the unit. Foxlendar never auto-refunds.
- Issue refunds from the Shopify order.
- Audit history records every change and who made it.
Channel sync (iCal)
Keep availability in sync with Airbnb, Booking.com, Vrbo and others Premium. Under Channel sync.
- Pick the accommodation or unit to sync.
- Choose the channel and auto-sync interval (15 min to daily).
- Import URL: paste the channel's iCal link to pull their bookings in as availability blocks.
- Export URL: Foxlendar gives you a feed to paste into the other channel.
You can also block dates manually for maintenance or owner stays. Blocked dates are never bookable.
Discounts
Open Discounts in the menu. Each discount is one offer with its own rules.
Create a discount
- Click New discount.
- Pick the type: Percentage off, Fixed amount off, or Free nights (cheapest nights waived).
- Choose who gets it:
| Audience | What happens |
|---|---|
| Automatic | Applied to any stay that meets the conditions. Guests see it without doing anything. |
| Promo code | Guest types a code on the booking form. Case-insensitive. |
| Membership | Tied to a tier. Guest presents their member code or picks the tier from a list (if you enable that). |
| Staff only | Never shown on the storefront. You apply it by hand when approving a request. |
- Set conditions (all optional): stay length, offer/travel window, lead time, check-in day, which rooms and rate plans.
- Set limits: total uses and uses per guest. Blank = unlimited.
- Save.
Example
You run two eligibility-based discounts on stays of 1 to 30 nights: ASOR members get 10%, students get 15%. Create two discounts, set each to Membership audience, point each at its tier, and set max nights to 30. Done. No need to duplicate your standard rate plan.
Good to know
- A cancelled or declined booking always returns its use.
- A discount that has been used on bookings cannot be deleted. Deactivate it instead.
- Exclusive (default): when several qualify, the guest gets whichever saves the most.
- Combinable: stacks with other combinable discounts, each applied to what the last left.
Membership tiers
A tier defines a group of people and what rate they get. Discounts are attached to tiers, not to individual members.
Create a tier
- Open Memberships → Tiers → New tier.
- Name it (e.g. "Student", "ASOR member", "Corporate").
- Set validity in months. Blank = never expires.
- Save, then go to Discounts and create a discount with audience Membership pointed at this tier.
Verification
| Method | How it works | When to use |
|---|---|---|
| Code | Member types the code issued at approval. | Default. Safest option. |
| A booking from the member's email is enough. | Only if you review every request before payment. Risky on instant checkout. | |
| Claim list | Guest picks from a list on the form. Staff verify before invoicing. Enable in Settings. | Request to book only. |
One tier can have multiple discounts with different conditions. For example: a 10% short-stay rate and a 15% long-stay rate, both under "ASOR member". The booking form only shows the tier when at least one of its discounts qualifies for the selected stay.
Membership inbox
Memberships in the menu is where you manage applications and active members.
Review an application
- Guest applies from the storefront (or you add them with Add member).
- Application shows as Awaiting review.
- Click Approve: a code is issued, the member can start booking.
- Or Reject: they can apply again later.
Membership statuses
| Status | What it means |
|---|---|
| Active | Code works. Member gets the tier rate. |
| Expired | Past the validity period. Code stops working. You can renew. |
| Revoked | You pulled it. Code stops immediately. Existing bookings keep their discount. |
Staff discount selector
When approving a booking request, you can verify, change or remove the guest's discount before the invoice goes out.
Step by step
- Open a request and click Approve.
- You see what discount the guest currently has. If they picked a membership rate from the form, a warning says it hasn't been verified.
- Check Change the discount before invoicing.
- Pick the correct discounts from the list (all your active discounts are shown, including staff-only ones).
- The new total is calculated for you. Click Approve and send invoice.
What each choice does
| You do | Result |
|---|---|
| Leave the checkbox unchecked | Invoice the discount the guest already has. No change. |
| Check it and pick discounts | Guest's discount is replaced with what you picked. |
| Check it and pick nothing | Guest's discount is removed. Full price. |
Combination & settings
Two settings under Settings → Discounts. Both are off by default.
| Setting | Off (default) | On |
|---|---|---|
| Let members also use a promo code | Guest gets whichever single discount saves more. | Member keeps their rate AND can add a promo code on top. |
| Let guests pick a membership rate on the booking form | Guest must type a member code. | A list of tiers appears on the form. Request to book only. Staff verify before invoicing. |
How the claim list works
- Guest picks dates. Only tiers whose discount qualifies for that stay appear. A 31+ night tier is hidden on a 5-night stay.
- Guest selects a tier (e.g. "Student — 15%"). This is a claim, not proof.
- The request arrives with a warning: "Nothing has verified this."
- You check the guest's eligibility and approve, swap, or remove the discount.
Instant-checkout rooms never show the list, regardless of this setting.
Editable message help text
You can customise the text below the guest message field on the booking form.
- Open the Shopify theme editor.
- Click the Accommodation page or Reservation form block.
- Fill in Message field help text.
Leave it blank to keep the default. Example: "Please include your institutional affiliation, purpose of stay, and any discount eligibility."
Settings reference
Settings in the menu. Changes save from the bar at the top.
| Group | What you configure |
|---|---|
| General | Timezone, check-in/check-out times. |
| Guest policy | Adult/child/baby labels, ages, baby capacity and pricing rules. |
| Booking rules | Min/max stay, buffer, advance windows, same-day, require details, request to book, hold window. |
| Price display | Currency code (240 USD), symbol before ($240) or after (240 $). |
| Pricing defaults | Weekend and holiday multipliers and date lists. |
| Services | Enable services storefront-wide. Require at least one per booking. |
| Multi-room booking | Let a guest book more than one room in one checkout. Off by default. |
| Discounts | Member + promo stacking (off). Guest claim list on form (off, Request to book only). |
FAQ
Do I need to write any code?
No. Everything is configured in the app admin and added to your storefront through Shopify's theme editor blocks. No theme code editing is required.
How do I change the colors or corner style of the booking blocks?
In the theme editor, open App embeds (the puzzle-piece icon) and enable "Foxlendar appearance". You can set the accent color, button text color, corner radius and spacing for every Foxlendar block. By default the blocks inherit your theme's fonts and colors.
How do guests pay? Do I need Stripe or a separate payment provider?
No separate provider. Guests pay through your normal Shopify Checkout. Foxlendar creates a Shopify order with the exact price locked in, so there are no extra payment keys to set up.
Can two guests book the same room type on the same dates?
Yes, if that accommodation has more than one unit. Each booking is allocated its own unit. When all units are taken for a date range, those dates show as unavailable.
What stops a customer from editing the price or dates at checkout?
The price and dates are written onto a Shopify draft order as fixed custom line items server-side. The customer cannot change the amount, quantity or dates at checkout.
How does 'Request to book' differ from 'Request a Quote'?
Request to book is guest-initiated: the guest fills in the form on the storefront and you review it. The room is held from the moment they submit. Request a Quote is merchant-initiated: you build the quote yourself from the admin and send the guest a payment link. A quote does not hold the room. Use Request to book when you want to vet guests before they pay; use Request a Quote when you are negotiating a price.
Can I use Request to book for some accommodations only?
Yes. The Settings switch is the shop-wide default; each accommodation has its own Booking mode field (under Capacity) that can override it in either direction — always request, always instant, or follow the shop setting. So you can vet long stays and group rooms while a day room still checks out instantly. New accommodations follow the shop setting until you change them.
Does a booking request hold the room?
Yes. A request reserves a real unit the instant it is submitted and blocks those dates on the calendar and on connected channels. The hold lasts until you approve (then the guest pays), decline, or the hold window expires — whichever comes first.
What happens if I don't answer a request in time?
The request is declined automatically after the hold window (48 hours by default, configurable in Settings → Booking rules). The room is released. Set the hold window to 0 to hold indefinitely until you answer.
Can I change the price when I approve a request?
Yes. Enter a custom room total before you approve. Add-ons stay itemised at the amount the guest was quoted; only the room charge changes.
When is a booking actually created?
Only when the Shopify order is paid. In instant-book mode the guest pays at checkout. In Request to book mode the guest pays the invoice you sent when you approved. Either way, no payment means no booking.
What happens if a date gets oversold?
If somehow no unit is free at the moment payment completes, the paid booking is still created (never lost) and flagged with a “Needs unit” badge. You assign a free unit, or cancel and refund from the Shopify order.
Does cancelling or refunding the Shopify order update the booking?
Yes. Cancelling the order cancels the booking and releases the unit. A full refund marks the booking refunded. Foxlendar never auto-refunds money. You control refunds from the Shopify order.
Can I take a booking myself from the admin (phone or walk-in)?
Yes. Add booking creates a paid Shopify order (offline payment) and a confirmed booking, and Shopify emails the guest a confirmation when you provide an email.
Can I send a customer a price to pay later instead of charging now?
Yes, on Premium and up. Use Quotes → New quote to build a priced draft order, then send the customer the payment link (Shopify emails it automatically if you add their email). The booking is created automatically when they pay.
Does creating a quote hold the dates?
No. A quote is an unpaid draft order, so it doesn't reserve a unit or block the dates. The unit is assigned and the dates are taken only when the customer pays the invoice.
Can I sync with Airbnb, Booking.com or Vrbo?
Yes, on the Premium plan. Channel sync imports calendars from channels like Airbnb and Vrbo as availability blocks, and gives you an export feed to paste into them. Booking.com is the exception: it no longer accepts iCal links from stores like this. To sync with Booking.com, connect a channel manager (such as Sirvoy, Guesty Lite or Beds24) that has a direct Booking.com connection.
How do discounts work?
Create an offer under Discounts, set the type (percentage, fixed amount or free nights), choose who gets it (automatic, promo code, membership or staff only) and add conditions like stay length, dates or lead time. The engine checks every condition server-side and only applies the discount when they're all met.
Can a guest use both a promo code and a membership rate?
By default, no — the guest gets whichever single discount saves the most. Turn on "Let members also use a promo code" in Settings → Discounts to let them stack. When stacked, each discount applies to what the last left (declining basis), not additive.
Can guests pick a membership rate without a code?
Yes, if you turn on "Let guests pick a membership rate on the booking form" in Settings → Discounts. The list only appears on Request to book accommodations so staff verify the claim before the invoice is sent. It never shows on instant checkout.
What happens to a membership discount when the tier doesn't qualify for the stay?
It's hidden. The booking form only shows tiers whose discount passes every condition (stay length, dates, lead time, usage limits). A 31+ night tier won't appear on a 5-night stay.
Can staff change the discount when approving a request?
Yes. The approval modal shows what discount the guest has and lets you check "Change the discount before invoicing" to pick a different one from all your active discounts. The new total is calculated for you.
Can I customise the text below the guest message field?
Yes. In the theme editor, click the Accommodation page or Reservation form block and fill in "Message field help text". Leave it blank to keep the default translated text.
Troubleshooting
The reservation form doesn't appear on my product page
Confirm three things: the product is connected to an accommodation (Accommodations → Shopify product mapping), the accommodation Status is Active, and the Reservation form block has been added to that product template in the theme editor.
A date shows as unavailable when I expect it to be open
A date is blocked if every unit is already booked or marked unavailable for it, a manual block or imported channel block covers it, or a booking rule forbids it (for example no check-in on that weekday, or it falls outside the advance-booking window). Check the accommodation's units, Channel sync blocks, and Booking rules. If you use Request to book, also check the Requests page: an unanswered request holds its room, and the calendar shows it in amber.
Prices look wrong on the storefront
Open the price calendar under Rates — it shows every night at the price a guest actually pays, and each cell names where that price came from (Season, Holiday, Weekend, or Set for this date). That usually answers it on sight. The order of precedence is: a price set for that exact date, then a season rate, then the base rate, then the Shopify product price as a last resort. Weekend and holiday multipliers apply to season, base and fallback nights only, never to a price you set for a specific date.
“This room can't accommodate that many guests”
The guest count exceeds the accommodation's capacity. Increase Adults/Children (and Total capacity) on the accommodation, or reduce guests. Note that babies only count toward capacity if you enabled that in Settings → Guest policy.
I can't add more accommodations
Each plan has an accommodation limit. Free: 1, Standard: 5, Premium: 25, and Business: unlimited. Open Plans & billing to upgrade for a higher limit and more monthly bookings.
Some of my accommodations disappeared from my storefront
Your plan's accommodation allowance is what the storefront sells. If you have more accommodations than your plan covers — usually after moving to a smaller plan — the oldest ones up to your allowance stay on sale and the rest are held back. Open Accommodations: a banner names exactly which ones, and upgrading puts them back on sale immediately. Nothing was deleted, and bookings already taken are unaffected.
401 or session errors in the admin
Reinstall the app from your Shopify admin. The embedded session refreshes automatically once reconnected.
