Overview
Documentation

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 sellHow it works
Rooms, villas, apartmentsEach is an "accommodation" linked to a Shopify product.
Nightly staysGuests pick check-in/check-out. Price is calculated per night.
Add-onsOptional services like breakfast, cleaning or airport pickup.
Across channelsiCal 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

  1. Install from the Shopify App Store.
  2. Create an accommodation. Accommodations → Add. Set capacity, add at least one unit.
  3. Connect a Shopify product. In the accommodation editor, click Select product.
  4. Set a price. Rates → create a rate plan, add a base nightly rate. No rate? The product price is used as a fallback.
  5. Add storefront blocks. Theme editor → Add block → Reservation form and Accommodation details.
  6. Test. Book a stay end to end. The paid order appears as a confirmed booking.
TipOpen Getting started in the menu for a live checklist that tracks each step and links straight to it.

Plans & limits

FreeStandardPremiumBusiness
Accommodations1525Unlimited
Units / accommodation210UnlimitedUnlimited
Bookings / month15150750Unlimited
Seasons & booking rulesNoYes StandardYes PremiumYes
Channel sync (iCal)NoNoYes PremiumYes
Request to bookYesYesYesYes
Discounts & membershipsYesYesYesYes

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

  1. Accommodations → Add accommodation.
  2. Connect a Shopify product (see next section).
  3. Set capacity: max adults, children, and (if enabled) babies.
  4. Add at least one Active unit.
  5. Save.
SectionWhat it controls
Product mappingThe Shopify product the guest pays for.
StatusActive (bookable), Inactive, Maintenance, or Archived.
LocationA saved address for the map block and location search.
Details & amenitiesAttributes (size, beds, view) and amenity checkboxes.
Booking modeInstant checkout or Request to book. See Request to book.
ServicesWhich add-ons this room offers.
UnitsPhysical inventory. 2 units means 2 guests can book the same dates.
Good to knowA type with no active unit can never be booked. Set a unit to Maintenance to stop bookings without deleting its history.

Connecting Shopify products

  1. In the accommodation editor, under Product mapping, click Select product.
  2. Pick the product (its first variant is used).
  3. 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.

Good to knowThe product must be Active, published, and not a gift card. If a product isn't bookable, guests see a clear message instead of a broken form.

Checkout thumbnail

"This is a physical product"Result at checkout
Off (recommended)Product image shows next to the booking.
OnShopify 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.

  1. Locations → Add location. Fill in city (required), address, country, and optionally latitude/longitude for the map pin.
  2. 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 isHow to set it up
AmenitiesFacilities shown as icons (Wi-Fi, pool, parking).Amenities menu → add with label, icon, sort order. Then tick per accommodation.
AttributesFacts 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:

  1. 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.
  2. 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.

DetailControlExample
Amenities, or any detail a room holds several ofButtons, 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/NoCannot 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.
TipChoosing values under two different filters narrows to rooms that match both. Capacity is already handled by the Guests field, so there is no need to make it an attribute.

Rate plans

A rate plan is a pricing package. Most properties have one or two (e.g. "Flexible" and "Saver").

  1. Rates → Rate plans → New rate plan.
  2. Name it. Toggle Refundable if applicable.
  3. 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.

ViewUse it for
MonthOne accommodation as a seven-column calendar. The default — prices sit under the weekday they apply to.
YearEvery 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.

TipSet your base rate to the price you charge most of the year, then use seasons for the months that differ. You will have far fewer rows to maintain than pricing every month separately.

Rates & how price is calculated

FieldMeaning
AccommodationWhich room this rate applies to.
SeasonOptional. No season = base rate (the standing price).
Date overrideA price for one exact date. Beats season and base. No multipliers applied.
PriceNightly price.
Base adults / childrenHow many guests the price covers before extras kick in.
Extra adult / childAdded per night for each guest above the included count.
Min / Max nightsRate is only eligible when stay length is within this range.

Price precedence (per night)

  1. Exact date rate → used as-is, no multiplier.
  2. Season rate → higher-priority season wins if overlapping.
  3. Base rate → the fallback when no date or season match.
  4. 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):

Fri: $200 × 1.2 + $30 extra adult$270
Sat: $200 × 1.2 + $30 extra adult$270
Room total$540

Seasons

A named date range Standard you attach pricing to. Create under Seasons.

FieldMeaning
NameInternal label, shown when picking a season on a rate.
Start / EndThe range the season covers.
Repeat every yearMatches the same days every year, so you don't recreate the season each January. The year you entered is then ignored.
PriorityHigher number wins when two seasons overlap. Default 0.
ActiveOnly 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.

TipLayer seasons with priority: "Summer" at 0, "Christmas week" at 10. Christmas rates take over for those specific dates.

Weekend & holiday pricing

Under Settings → Pricing defaults. Apply to season, base and fallback nights. Never to an exact date rate.

MultiplierDefaultApplies to
Weekend1.2×Nights on your chosen weekend days (Sat/Sun by default).
Major holiday2×Dates you list under Major holiday dates.
Minor holiday1.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.

TipWant a fixed price for a specific date? Use a date override rate instead of listing it as a holiday.

Services (add-ons)

Optional extras Standard guests add while booking. Create under Services, then assign to accommodations.

Pricing typeCharged asExample
Per bookingFlat fee, onceCleaning: $50
Per night× nightsParking: $10/night
Per guest× guestsWelcome drink: $5/person
Per guest per night× guests × nightsBreakfast: $15/person/night

Common fees

FeeSet it up as
Pet fee (once)Per booking, flat amount.
Pet fee (nightly)Per night.
Tourist / city taxPer guest per night. Turn Taxable off to avoid taxing a tax.
Cleaning feePer 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:

SettingWhereScope
Price, pricing typeServices → the serviceShop-wide. Every accommodation offering this service uses this price.
RequiredAccommodations → a room → ServicesPer 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.

SetupGuest seesUse it when
Price 0 + RequiredIncludedThe cost is already in your nightly rate. The guest is paying for it, just not as a separate line.
Price 0, not requiredFreeA genuine freebie the guest opts into. Costs them nothing either way.
ExampleSet it up asWhy
Breakfast in the ratePrice 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 ratePrice 0, Required → “Included”Same reasoning: the transfer is priced into the package the guest booked.
Late checkout, offered freePrice 0, not required → “Free”Optional, and it genuinely costs nothing. The guest chooses whether to take it.
Welcome drink on arrivalPrice 0, not required → “Free”A gift, not part of the rate. Nothing changes if the guest declines.
Breakfast sold separatelyPrice 15, per guest per nightCharged 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.

AccommodationPrice for this accommodationRequiredGuest sees
Standard roomblankno$15 — they choose
VIP suite0yesIncluded
Garden room10no$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.

SettingWhat the guest can orderUse 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 chooseAny 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:

ChargeWhat it doesExample
Full pricePays the service price.Adults: $12
Percent of full priceA share of it, rounded per person.Children at 50%: $6
Fixed amountIts own price, ignoring the service price.Teens: $9
Not chargedFree, but still counted and listed.Infants eat, and your kitchen needs the number.
Not offeredLeft 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.

ExampleAdultsChildrenInfants
Breakfast, kids half priceFull pricePercent 50Not charged
Kids clubNot offeredFixed amountNot offered
Spa entry, 16+Full priceNot offeredNot offered
Tourist tax, under-18s exemptFixed amountNot offeredNot offered
Airport transferSame price for everyone——
TipLeave it on Same price for everyone unless you actually charge differently. That is how every add-on behaves by default, and it is right for most of them — a transfer seat costs the same whoever sits in it.

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.

RuleEffect
Min / Max stayFewest and most nights allowed.
Check-in / Check-out daysRestrict arrivals or departures to certain weekdays.
Min / Max advanceHow far ahead a guest must, or can, book.
BufferEmpty days before/after each booking (e.g. for cleaning).
Same-day bookingWhether guests can book for today.
Require guest detailsName, email and phone required on the storefront.
Request to bookReview 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.

TypeDefault agesNotes
Adults18+Always shown. Cannot be removed — something has to cover your oldest guests.
Children3–17Always shown.
Babies0–2Row 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.

TipTo host infants free but still know how many are coming: switch the Babies row on, set its ages to suit (0–2, or 0–3), and leave both takes a place in the room and charged unticked. Guests get a third counter, you see the number on every booking, and nothing is charged for it.

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:

RuleWhy
No gaps, no overlapsAn 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 limitSomething 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.

TipThree types today — Adults, Children and an optional Babies row — because the booking form has three counters. A fourth type such as “Teens 13–17” needs its own counter on the form to be reachable by a guest, and arrives with it.

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 formWhat it prices
Adults · 18+Your Adults price
Children · 3\u201317Your Children price
Babies · 0\u20132Your 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:

TypeAgesBreakfast
Babies0–2Not charged
Children3–1250%
Teens13–1775%
Adults18+Full price
TipSet your ranges to match the policy you already publish. If your adults start at 13, say so on Guest types — 0–2, 3–12, 13+ — and the form will print “13+” next to Adults for every guest who reads it.
Good to knowA guest type you have not given a price gets the full price, not a free one. If babies should eat free, set their row on the add-on to Not charged rather than leaving it blank.

Storefront blocks

Theme editor → Add block → pick a Foxlendar block. No code. Inherits your theme fonts and colors.

BlockPageWhat it does
Availability searchHome / landingDates + guests + location search. Lists matching rooms.
Accommodations gridCollection / landingA grid of bookable rooms with capacity and starting price.
Reservation formProductDate picker, live price, Book now button. The only block guests book from.
Accommodation detailsProductCapacity, amenities and attributes.
Availability calendarProductMonth calendar with open/blocked nights and nightly prices.
Location mapProductMap 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

  1. Guest picks dates and services. Price updates live.
  2. Foxlendar validates server-side: product is bookable, room is active, capacity fits, a unit is free, rules pass.
  3. "Book now" creates a Shopify draft order with the exact price locked. Guest goes to Shopify Checkout.
  4. Order paid → confirmed booking, unit assigned, services attached.
  5. Order cancelled or refunded → booking cancelled, unit released.
Good to knowA booking is created only when payment completes. Abandoned checkouts never produce a booking.

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.

Good to knowAvailability and capacity are still checked when the order is placed. If a suggested combination sells out between the search and checkout, that's caught server-side like any other booking.

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

  1. Guest submits. Same validation as instant booking. Email required.
  2. Room is held. Real unit reserved, calendar shows amber, channel dates blocked.
  3. You review under Requests: guest details, message, stay, total.
  4. Approve: invoice emailed to the guest. Set a custom room price or change the discount first.
  5. Guest pays → booking confirmed on the held unit.
  6. 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.

Good to knowAfter approval the hold window no longer applies. The guest has an invoice and the room stays theirs until they pay or you decline.

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

  1. Switch the card On.
  2. Send to — up to 10 addresses, separated by commas.
  3. Send test to prove it arrives before you rely on it.
  4. Remind unpaid after — the first reminder. Default 2 days.

What gets sent

EmailWhenContains
New requestA guest submitsGuest, reference, room, dates, nights, total, their message, and a link that opens the request
Unpaid reminder2, 4 and 8 days after you approve, then no moreEvery 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.

Good to knowNothing is sent to guests here. These emails are for your team. The guest's invoice goes out through Shopify, under your own branding.
TipNothing arriving? Check the spam folder first and whitelist the sender shown under the Send to field. Mail from a new sender often lands there for the first few messages.

Request a Quote

You price a stay and send the guest a payment link Premium. Under Quotes.

  1. New quote. Pick accommodation, dates, guests. Override the room total if needed.
  2. Create quote. Draft order created. Invoice emailed if you added an email, otherwise copy the link.
  3. Guest pays → booking created with a unit assigned.
Good to knowA quote does not hold the room. The same dates can still be booked by someone else until the guest pays.

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 dateReschedule stay
Arrival date passed, nobody checked the guest inRecord departure + Reschedule stay
Checked in, not paid yetRecord departure + Change check-out
Checked in, paidRecord 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.
TipChecking in is optional. If you never use it, both dates stay editable. After the booked arrival date the change screen warns you that nobody has recorded the guest, but it never blocks you.

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
PaidNothing 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 yetThe total is recalculated for the nights actually stayed, and the guest is emailed a new invoice. Their old payment link stops working.
Not approved yetThe 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.

TipCharging a different figure? Enter it in Room total (optional). Extras are still added on top, and any discount the guest holds still comes off your figure. Leave it blank to use your rate card. It is also the way through when no rate covers the shorter length.

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.

Good to knowFoxlendar never moves money on its own. To collect or return a difference on a paid booking, do it on the Shopify order or raise a separate quote.
Good to knowIf Shopify refuses a new invoice, the change is still saved and the screen tells you the guest is holding the old payment link. Resend the invoice from the booking.

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.
TipA closure longer than 12 months is flagged. Usually that means a year was mistyped — and because closures are published to your channel feeds, a wrong year stops the room selling everywhere at once.

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.

  1. Pick the accommodation or unit to sync.
  2. Choose the channel and auto-sync interval (15 min to daily).
  3. Import URL: paste the channel's iCal link to pull their bookings in as availability blocks.
  4. 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.

TipBooking.com. Booking.com no longer accepts iCal links from stores or personal sites; it only takes links from a short list of large travel sites. To sync your availability with Booking.com, connect a channel manager such as Sirvoy, Guesty Lite or Beds24, which link through Booking.com's own connection instead.

Discounts

Open Discounts in the menu. Each discount is one offer with its own rules.

Create a discount

  1. Click New discount.
  2. Pick the type: Percentage off, Fixed amount off, or Free nights (cheapest nights waived).
  3. Choose who gets it:
AudienceWhat happens
AutomaticApplied to any stay that meets the conditions. Guests see it without doing anything.
Promo codeGuest types a code on the booking form. Case-insensitive.
MembershipTied to a tier. Guest presents their member code or picks the tier from a list (if you enable that).
Staff onlyNever shown on the storefront. You apply it by hand when approving a request.
  1. Set conditions (all optional): stay length, offer/travel window, lead time, check-in day, which rooms and rate plans.
  2. Set limits: total uses and uses per guest. Blank = unlimited.
  3. 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

  1. Open Memberships → Tiers → New tier.
  2. Name it (e.g. "Student", "ASOR member", "Corporate").
  3. Set validity in months. Blank = never expires.
  4. Save, then go to Discounts and create a discount with audience Membership pointed at this tier.

Verification

MethodHow it worksWhen to use
CodeMember types the code issued at approval.Default. Safest option.
EmailA booking from the member's email is enough.Only if you review every request before payment. Risky on instant checkout.
Claim listGuest 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

  1. Guest applies from the storefront (or you add them with Add member).
  2. Application shows as Awaiting review.
  3. Click Approve: a code is issued, the member can start booking.
  4. Or Reject: they can apply again later.

Membership statuses

StatusWhat it means
ActiveCode works. Member gets the tier rate.
ExpiredPast the validity period. Code stops working. You can renew.
RevokedYou pulled it. Code stops immediately. Existing bookings keep their discount.
TipNeed to add someone who's already verified? Click Add member. They skip the application step and get a code right away.

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

  1. Open a request and click Approve.
  2. 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.
  3. Check Change the discount before invoicing.
  4. Pick the correct discounts from the list (all your active discounts are shown, including staff-only ones).
  5. The new total is calculated for you. Click Approve and send invoice.

What each choice does

You doResult
Leave the checkbox uncheckedInvoice the discount the guest already has. No change.
Check it and pick discountsGuest's discount is replaced with what you picked.
Check it and pick nothingGuest's discount is removed. Full price.
TipYour finance manager can use this to apply or remove discounts without manually calculating a revised room price. Staff-only discounts (goodwill, negotiated rates) only appear here.

Combination & settings

Two settings under Settings → Discounts. Both are off by default.

SettingOff (default)On
Let members also use a promo codeGuest 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 formGuest 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

  1. Guest picks dates. Only tiers whose discount qualifies for that stay appear. A 31+ night tier is hidden on a 5-night stay.
  2. Guest selects a tier (e.g. "Student — 15%"). This is a claim, not proof.
  3. The request arrives with a warning: "Nothing has verified this."
  4. 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.

  1. Open the Shopify theme editor.
  2. Click the Accommodation page or Reservation form block.
  3. 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.

GroupWhat you configure
GeneralTimezone, check-in/check-out times.
Guest policyAdult/child/baby labels, ages, baby capacity and pricing rules.
Booking rulesMin/max stay, buffer, advance windows, same-day, require details, request to book, hold window.
Price displayCurrency code (240 USD), symbol before ($240) or after (240 $).
Pricing defaultsWeekend and holiday multipliers and date lists.
ServicesEnable services storefront-wide. Require at least one per booking.
Multi-room bookingLet a guest book more than one room in one checkout. Off by default.
DiscountsMember + promo stacking (off). Guest claim list on form (off, Request to book only).
TipPer-accommodation values override these defaults. A room with its own minimum stay or its own rate always wins.

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.

Still need a hand?
Email [email protected] with your store URL and a short description.