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, Vrbo and other channels that accept a feed 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.
The admin and the storefront are translated into 10 languages: English, Danish, German, Spanish, French, Italian, Dutch, Portuguese, Swedish and Hungarian. Both follow your store language, so there is nothing to pick.
Core concepts
The words the app uses, in the order you meet them.
Accommodation
A bookable type, like "Deluxe Double" or "Ocean Villa". Holds capacity, amenities and the link to a Shopify product.
Unit
A physical instance. "Apartment A1" and "A2" are two units of one accommodation, so two guests can hold the same dates.
Shopify product mapping
The product the guest actually buys. Name, description and images come from it, so nothing drifts out of sync.
Price calendar
Where nightly amounts live, and the one place that shows why a night costs what it costs.
Rate plan
What a price means: how much is taken at checkout, and what you promise if the guest cancels. Not the amount.
Rate
One row of money for one accommodation: the nightly price, the guests it covers, the stay lengths it is allowed on.
Season, also called a holiday or period
A named date range with its own prices. You create one under Holidays & special periods; “Season” is the word you then see when picking it on a rate, scoping a booking rule, or reading a calendar cell. Two names, one thing. A monthly price is a season too, kept below any you name yourself.
Deposit and balance
Take part of the stay at checkout and the rest at your desk. The remainder is the balance, and your desk marks it collected when it arrives.
Cancellation policy
Free cancellation with a cut-off, or non-refundable. The deposit is the cancellation fee, so there is no separate fee.
Guest type
Adults, children and an optional babies row, each with the ages it covers. Three counters on the booking form.
Service
An add-on such as breakfast, parking or city tax, with its own pricing model.
Booking rule
Stay length, allowed check-in days, advance windows, the gap you keep between stays. Shop-wide, or per room.
Closed dates
Nights you take off sale for maintenance or an owner stay. Dates imported from a connected channel show here too, and are read-only.
Request to book
The guest submits instead of paying. The room is held while you review, then you invoice.
Quote
A price you build and send as a payment link. It holds nothing until the guest pays.
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. Getting started → Add Foxlendar blocks to your theme → add Accommodation page for a complete product page in one block, or just Reservation form to start. See Storefront blocks.
- 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 per accommodation | 2 | 10 | Unlimited | Unlimited |
| Bookings per month | 15 | 150 | 750 | Unlimited |
| Days with their own price | 5 | Unlimited | Unlimited | Unlimited |
| Nightly rates, add-on services | Yes | Yes | Yes | Yes |
| Seasons, booking rules, discounts | No | Yes | Yes | Yes |
| Memberships, quotes, request to book, channel sync | No | No | Yes | Yes |
Hitting a limit is explained where you hit it, with the upgrade beside it. Two of these behave more gently than a limit usually does.
- Bookings per month is a soft cap. You are warned as you approach it and again when you pass it, and checkout is never blocked. A guest with a card out always gets through. It counts bookings you actually got, so a cancellation, a request still awaiting review, and a request you declined or let expire all cost you nothing. Strangers filling in your form cannot push you towards an upgrade.
- Days with their own price counts the dates you treat as exceptions: nights you priced on their own, plus the dates covered by a holiday or special period that carries a price. It is a set, so two rules over 25 December spend one day, and a rule repeating every year spends its days once rather than once a year. Editing a day you already own is free.
Your monthly grid, your base rate and the weekend factor are free on every plan. They are the shape of your year rather than exceptions to it, and twelve month cells would swallow a small allowance on sight.
Moving to a smaller plan
Nothing is deleted, and coming back switches everything on exactly as you left it. The Moving to screen lists what stops before you confirm: accommodations past the new allowance come off sale, oldest kept first, and seasons, booking rules and discounts stop applying if the new plan does not include them.
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, two units meaning two guests can hold the same dates. Each takes a Unit name, so use the number your staff actually say: “A1”, “Room 204”. |
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.
- Open Locations, then Add location.
- Fill in the address. Only City and Country are required.
- Open an accommodation, find the Location section, and pick it.
| Field | Meaning |
|---|---|
| Name | Optional short label such as “Beachfront villa”. Left blank, it is built from the address. |
| Address line 1 | Street address. |
| Address line 2 | Optional second line. |
| City | Required. |
| Region / state | Optional. |
| Postal code | Optional. |
| Country | Required. |
| Country code | Two-letter ISO code, such as US or VN. |
| Phone | Optional. Shown on the booking, or kept for your own reference. |
| Latitude | Optional, and Longitude with it. Drops the map pin on the storefront. Enter both or leave both blank. |
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. | Open Amenities and add one with a label and a Default icon, or upload a Custom icon of your own. Then tick it per accommodation. |
| Attributes | Facts like size, bed type, view. | Open Attributes and add one with a type: Text, Number, Yes/No or Select. Tick Visible in details or Visible in highlights to choose where it shows, then 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 answers two questions about money: how much the guest pays now, and what you promise if they cancel. The nightly amounts live on the price calendar. The plan holds everything else.
One plan is enough for most properties. Add a second when you want to sell the same room two ways, the usual pair being a flexible rate and a cheaper non-refundable one. Give a room rates under two active plans and the booking form grows a selector so guests compare price against policy. One plan, no selector.
Create a plan
- Open Rates, then Rate plans, then New rate plan.
- Name it. Guests read this name, so “Flexible” beats “Plan 2”.
- Answer the two money questions below.
- Add nightly prices under Accommodation rates. See Rates & how price is calculated.
The What guests see panel on the right redraws as you edit. The amounts in it are a worked example on a round total, but the sentence about cancelling is the live one a guest will read. Check it before you save.
What the guest pays at checkout
| Choice | Charged now | Collected at your property |
|---|---|---|
| Pay in full at checkout | The whole stay | Nothing |
| Deposit at checkout | The share you set | The balance |
Deposits round down, so they never exceed the share you set. 30% of $99.99 charges $29.
The balance shows on the booking and on the calendar until your desk marks it collected.
Worked example
A $719.50 stay on a 30% deposit:
You collect 29.88%, not 30%. Rounding always goes down, so the figure you publish is a ceiling you never cross. The one exception protects the other end: a percentage that works out below $1 still charges $1, because a $0 deposit is not a deposit.
What you promise about cancelling
| Choice | Guest cancels in time | Guest cancels late, or not at all |
|---|---|---|
| Free cancellation | Refunded in full | You keep the money |
| Non-refundable | No refund | You keep the money |
Choosing Free cancellation asks How late can a guest cancel for free? Pick Right up to arrival, or 24, 48 or 72 hours, or 7 days before. Need another figure? Choose the custom option and type hours into Cut-off. Each option names hours and days together, and the screen shows the exact date and time your guest will read.
A non-refundable rate stays quiet on the booking form. The term is attached to the room at checkout and stays on the order, so guests still agree to it before paying.
Give guests a way to use it
A policy on its own is just words. Paste the cancellation link into your confirmation email and a guest cancelling inside the window is refunded automatically, with the room back on sale the same second.
Delete rate plan is blocked while accommodation rates still sit under it, so clear those first. Switching the plan off under Availability is usually what you wanted anyway: it stops being offered to new guests and leaves every price intact.
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. The month dropdown jumps up to a year ahead.
Price a whole year in four steps
Start wide, then narrow. Each step only overrides the one before it, so you never undo your own work.
- Set your standing price. In the Year view the Normally column is what a night costs when nothing else applies. Price that first.
- Lift the months that differ. Click the month cells, type one price, then Set price. Shift-click for a run, or click a month heading to take the whole column. It repeats every year until you change it, and Clear price sends a month back to Normally.
- Add the periods that do not line up with a month. Christmas week, or Easter, which moves. See Weekend & holiday pricing.
- Fix single nights by hand. In the Month view, click a cell, type a price, Save. Click it again to remove it.
For a block of dates rather than one night, use Change prices: set an amount, or raise and lower by a figure or a percent, across a range. Tick weekdays to catch only Fridays and Saturdays. An increase is worked out once against the current price and saved as an ordinary nightly price, so nothing compounds later and a night is always the number on screen.
Worked example
A guesthouse charging $120 most of the year, $180 in July and August, and $250 over Christmas week:
Two month cells and one period, rather than 365 nights typed by hand. A Saturday in July still picks up your weekend factor, because a month price is a season and seasons can be multiplied. A night you type by hand cannot, so reach for step 4 only when you mean “this exact figure, nothing on top”.
Seasons, holidays and special periods
A named date range Standard with its own prices. Open What sets your prices beside the calendar, then Manage on Holidays & special periods.
| Field | Meaning |
|---|---|
| Name | Internal label, shown when picking a season on a rate. |
| Start date, End date | The range it covers. Or list individual days, for something like Easter that moves. |
| Multiply the nightly price by | Use this instead of typing a price per room when the period is simply dearer, for example 1.5 over Christmas. |
| Repeat every year | Same days every year, so you don't recreate it each January. The year you entered is 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: 21 December to 6 January covers both months every year. It cannot be longer than a year — that is what the base rate is for.
Prices per accommodation for one season live on their own page, opened from that same list.
Rates & how price is calculated
A rate is one row of money for one accommodation: the nightly price, the guests it covers, and the stay lengths it may be used on. A rate plan holds as many as you need.
Add your first rate
- Open Rates, then Rate plans, then the plan you want to price.
- Under Accommodation rates, choose Add accommodation rate. Once the list is long, Filter by accommodation narrows it to one room.
- Pick the accommodation. Leave Season on Base rate.
- Enter the price and how many guests it already includes, then save.
The booking form starts quoting that price immediately. Everything below is for the nights that should cost something else.
Which price wins
Every night is priced on its own. Foxlendar takes the first match going down this list.
- Date override — a price you typed onto that one calendar date. The calendar labels it Set for this date.
- Season price — any season covering the night. Highest Priority wins when two overlap.
- Base rate — the plan’s standing price, shown as Normally on the calendar.
- Shopify product price — the variant price, used when no rate reached the night at all.
Then at most one factor, never two: a holiday or special period if one covers the night, otherwise the weekend factor. Step 1 is exempt. A price you typed onto a single date is your final word on it, so nothing is applied on top.
Stay length is checked before any of it. A rate whose Minimum or Maximum nights rules out the booked stay is dropped from the list entirely, so a two-night stay never sees a rate written for a week. Drop every rate that way and the night falls to step 4.
Two seasons over the same night: the higher Priority wins. A holiday factor replaces the weekend one rather than stacking with it, so a Saturday inside Christmas week is charged once. See Weekend & holiday pricing.
Fields
| Field | Meaning |
|---|---|
| Accommodation | The room this rate prices. |
| Season | Leave on Base rate for your standing price. |
| Date override | One calendar date, priced on its own. Beats season and base. |
| Price | What one night costs. |
| Base adults included, Base children included | Guests the price already covers. |
| Extra adult, Extra child | Charged per night for each guest past that count. |
| Minimum nights, Maximum nights | The stay lengths this rate may be used on. Blank means no limit. |
0 to charge for all of them. The plan flags this for you: “aren’t charging their extra-guest price”.Worked example
Base rate $200, two adults included, extra adult $30. Weekend factor 1.2 on Saturday and Sunday, which is the default. Three adults stay Friday to Sunday, so you are pricing Friday night and Saturday night.
Note where the brackets fall on Saturday. Extra guests are added to the nightly price first, and the factor multiplies the result, so the third adult costs $36 that night instead of $30.
Weekend & holiday pricing
A factor charges more for a night without you pricing that night. Both kinds live in the What sets your prices panel beside the price calendar. They used to be in Settings, which is why Settings still points here.
| Covers | Set | |
|---|---|---|
| Weekends | The weekdays you pick, every week. Saturday and Sunday unless you change them. | One factor, 1.2 by default. |
| Holidays & special periods | A date range or a list of single days you name, like Christmas or Easter. | A factor per period. Higher priority wins when two overlap. |
A night gets one factor at most. A holiday replaces the weekend uplift rather than stacking on it, so a Saturday inside Christmas week is raised once. Which one applied is named on the calendar cell. For where factors sit against your rates, see Which price wins.
Add a holiday
- Open What sets your prices, then + Add a holiday or period.
- Name it, add the dates, and set what to multiply the price by.
- Save. The nights now read Holiday on the calendar.
Use a list of single days for something that moves, like Easter. Use a range for a block you keep year after year.
Exempt one accommodation from weekends
The weekend factor is shop-wide, so switching it off switches it off everywhere. To drop it for a few rooms only, choose Edit on the Weekends row, then All accommodations except… and pick them.
An apartment house priced flat all week needs this while your hotel rooms still charge more on a Saturday. The exempt accommodation keeps its base, month and season prices, and its calendar stops labelling those nights “Weekend”.
Services (add-ons)
Extras a guest adds while booking: breakfast, parking, a cleaning fee, city tax. Included on every plan.
- Open Services and add one. Name it, set the price and the pricing type.
- Open an accommodation, then Services, and tick the ones that room offers.
| Pricing type | Charged | Fits |
|---|---|---|
| Per booking | Once, flat | Cleaning fee, pet fee, airport transfer |
| Per night | × nights | Parking at $10 a night |
| Per guest | × guests | Welcome drink |
| Per guest per night | × guests × nights | Breakfast, tourist tax |
The type decides what the price multiplies by. Three guests, four nights, and everything priced at $10:
| Also on the service | What it does |
|---|---|
| Guest unit label | What the storefront calls the per-person quantity. “Guests” by default; “People” or “Covers” if that reads better. |
| Night unit label | The per-period equivalent. “Nights” by default, “Days” for something like parking. |
| Sequence | Sort order in the add-on list, so your best seller sits at the top. |
| Active | Switching a service off stops it being offered. It also stops any mandatory charge you had ticked on an accommodation. |
Two screens, and the split matters
| Setting | Where | Scope |
|---|---|---|
| Price, pricing type | Services → the service | Shop-wide. Every room offering it uses this price. |
| Price for this accommodation | Accommodations → a room → Services | Overrides the price on that room only. Blank means use the shop-wide one. |
| Required | Accommodations → a room → Services | Per room. Required on one, optional on another. |
Charging nothing
Set the price to 0 and the guest reads a word instead of an amount. Which word depends on the Required tick, because the two say different things.
| Setup | Guest sees | Means |
|---|---|---|
| 0 and Required | Included | Already in the nightly rate. Breakfast on a half-board rate, a transfer in a package. |
| 0, not required | Free | A genuine freebie they opt into. Late checkout, a welcome drink. |
Both still appear in the price breakdown, so a guest can see what the stay covers even though neither adds to the total.
Paid on most rooms, included on one
Breakfast costs $15, except in the VIP suite where the rate already covers it. One service, three outcomes:
| 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 |
Leave the override blank on rooms you never want to think about. Enter 0 only where the rate already covers it.
Quantity limit
For Per guest and Per guest per night, decide how many a guest may order.
| Setting | They can order | Fits |
|---|---|---|
| Limit to the number of guests (default) | Up to one per person on the booking, and fewer is fine. | Breakfast, dinner, spa entry. |
| Let the guest choose | Any amount up to your Maximum quantity. Leave it empty for no limit of your own. | Things sold by the piece: a bottle of wine, extra towels. |
Breakfast for two of three guests is a normal request, so the limit only stops them going above the headcount. Lower the party size after picking an add-on and the add-on comes down with it.
Charging children less than adults? That is its own job, in Add-on prices per guest type.
Add-on prices per guest type
Children at half price, infants free. Switch Price by guest type to Different price per guest type and set a charge per type. The guest still sees one line, with the breakdown under it.
| 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. |
| Example | Adults | Children | Infants |
|---|---|---|---|
| Breakfast, kids half price | Full price | Percent 50 | Not charged |
| Spa entry, 16+ | Full price | Not offered | Not offered |
| Kids club | Not offered | Fixed amount | Not offered |
Who counts as a child comes from Guest types & capacity, so the ages are set once. A percentage is rounded per person, and the admin shows you the resulting amount as you type, which is how you catch what 50% of an odd price really is before a guest does.
Each charged type gets its own invoice line, “Breakfast (Adults) ×6” beside “Breakfast (Children) ×3”. Your kitchen gets a cover count per type rather than one total.
Worked example
Two adults and one child, three nights. Breakfast $15 per guest per night with children at 50%. City tax $2 per guest per night, under-18s exempt, Required. One cleaning fee of $40 per booking.
The child pays half for breakfast and nothing for city tax, because the tax is set to Not offered for children rather than to zero. Each guest type gets its own line, so your kitchen reads six adult covers and three child covers off the invoice. The cleaning fee ignores guests and nights entirely, being per booking. The guest chose breakfast; city tax and cleaning were charged whether they wanted them or not.
Booking rules
Your defaults for every room live in Settings → Booking rules. To override them for one room or one season, create a rule Standard:
- Open Booking rules in the menu, then New booking rule.
- Set Scope: an Accommodation and a Season. Leave either as all to cover everything.
- Fill in only the fields you want to change. Blank means “follow the default”.
- Create booking rule. The strictest rule that applies wins.
| Rule | Effect |
|---|---|
| Minimum stay | Fewest nights allowed. |
| Maximum stay | Most nights allowed. |
| Allowed check-in days | Restrict arrivals to certain weekdays. |
| Allowed check-out days | Restrict departures to certain weekdays. |
| Minimum advance days, Maximum advance days | How far ahead a guest must, or can, book. |
| Booking buffer days | Empty days kept before and after each booking, for cleaning or a turnaround. |
| Same-day booking | Whether guests can book for today. |
| Require guest contact details | On instant booking this adds a phone field, the one detail Shopify checkout cannot make mandatory on a stay. On Request to book, which already asks for all three, it makes name and phone mandatory rather than email alone. |
| Request to book | Review before payment. See Request to book. |
The storefront date picker enforces these live, greying out dates it will not take and saying why. A rule’s Scope is an Accommodation and a Season, either of which can be left as all, so one rule can cover every room in your high season. Delete booking rule removes it and those dates go back to whatever the shop-wide defaults allow.
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. |
Set it up
- Open Settings, then Guest policy.
- Check the ages against the policy you already publish. Change them if your adults do not start at 18.
- Hosting infants? Switch the Babies row on, then decide whether they take a place in the room and whether they are charged.
- Save, then set capacity per accommodation: max adults, children and babies. A party larger than that is refused with a message naming the room.
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–17 | Your Children price |
| Babies · 0–2 | Your Babies price, if the row is enabled |
The guest reads the range and picks their own row. Foxlendar never asks each child’s age on top of that. The same fact entered twice can disagree with itself, and a form that asks again is a form more people abandon.
If one children’s price is not enough
Move the boundary rather than adding a type. You have three counters, so put them where your price actually changes. A property charging a 15-year-old like an adult sets Adults to 13+, which leaves Children covering only the younger bracket:
| Type | Ages | Breakfast |
|---|---|---|
| Babies | 0–2 | Not charged |
| Children | 3–12 | 50% |
| Adults | 13+ | Full price |
Three prices is the ceiling, because the booking form has three counters. Need a fourth band, teens at 75% between children and adults, and the honest answer is that it is not available yet. Decide which side of your boundary teenagers fall on.
Storefront blocks
Foxlendar reaches your storefront through theme blocks — no code, and they inherit your theme’s fonts and colors. Quickest way to add them: Getting started → Add Foxlendar blocks to your theme, where every block has an Add to theme button that places it for you.
- Open Getting started, then Add Foxlendar blocks to your theme.
- Decide between one layout block and the individual ones, as below.
- Click Add to theme on what you chose. Each opens the theme editor with the block ready to place.
- Save in the theme editor. Theme edits do not save themselves.
- Open a product page and take a test booking.
Choose one layout, not both
Accommodation page is a whole product page in one block: title, gallery, highlights, description, amenities, details and the reservation form, in a sidebar layout with a sticky booking panel. Add it, switch off what you don’t want, and you’re done.
Or add the blocks below one at a time to control their order. Don’t do both — everything would appear twice, including two booking forms.
Product page blocks
| Block | What it does | In Accommodation page |
|---|---|---|
| Reservation form | Dates, guests, live price, Book now. The only block guests can book from. Show heading hides the title above it when your page already has one. | Yes |
| Accommodation title | The accommodation name. Heading level and typography. | Yes |
| Accommodation gallery | Photos, with aspect ratio, spacing and an optional lightbox. | Yes |
| Accommodation highlights | Attributes you ticked Visible in highlights, plus capacity. Visible in details is the separate tick that feeds the details block. | Yes |
| Accommodation description | The description, optionally collapsed behind “Read more”. | Yes |
| Accommodation amenities | The amenities assigned to this accommodation. | Yes |
| Accommodation details | Size, bedrooms and bathrooms. | Yes |
| Availability calendar | Open and blocked nights by month, with nightly prices. | No — add separately |
| Location map | Map with a pin, on Google Maps or OpenStreetMap. | No — add separately |
These nine work on a product page only. Click a block in the theme editor to change what it shows.
Home and collection page blocks
| Block | What it does |
|---|---|
| Availability search | Search by dates, guests and location, and list matching rooms. Can fill a hero image or video. |
| Accommodations grid | A grid of bookable rooms with capacity and starting price. |
Appearance
Foxlendar appearance styles every block at once. It is an app embed rather than a block, so switch it on from the same page in the app, or in the theme editor under App embeds (the puzzle-piece icon).
| Setting | Options |
|---|---|
| Colour scheme | Light, Dark, or Follow visitor’s device, which tracks whatever their phone or laptop is set to. |
| Accent color | Buttons and highlights. |
| Button text color | Light for a dark accent, dark for a light one. Set it for contrast. |
| Corner radius | Blocks and inputs have their own. 0 is square. |
| Spacing, letter spacing | Fine-tuning to sit against your theme. |
Leave the embed off and every block inherits your theme’s fonts and colours instead.
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
The guest asks instead of paying, and you decide Premium. Built for long stays, group bookings and student housing.
Switch it on in the Request to book card on the Requests page, along with the hold window. Both used to sit in Settings, which now just points here. Then override it per room under Booking mode on the accommodation, in either direction.
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
On the accommodation, How guests book this accommodation overrides the shop setting three ways: Always send a request for approval, Always allow instant checkout, or Follow shop setting, which names the current one so you are never guessing. Vet long stays and let day rooms sell themselves.
Hold window
Auto-decline after sets the hours a request may wait. Default 48. Set it to 0 and the request is held until somebody answers: nothing releases the room on its own.
A declined or expired request keeps its contact details for 90 days, long enough to answer “why was I refused?”, then they are scrubbed. The request itself stays in your history. Declined and awaiting-review requests never count against your monthly booking allowance.
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. Commas, semicolons or one per line all work, so paste straight out of a spreadsheet. A typo is named back to you rather than reported as “invalid”, so you never have to bisect the list yourself.
- 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.
Guest cancellation link
Guests cancel from their own confirmation email. In-window cancellations are refunded automatically. Later ones free the room to re-let, and you keep the deposit.
Step 1 — take a deposit on the rate
In Rate plans, set Deposit at checkout (30% is common) and Free cancellation with a cut-off (72 hours is common).
Step 2 — add the link to your confirmation email
- Settings → Notifications → Customer notifications.
- Open Order confirmation, then Edit code.
- Paste the snippet below (see where to paste it).
- Save.
You only do this once. Shopify has no API for editing notification templates, so Foxlendar cannot paste it for you.
{% assign fox = attributes["_foxlendar_cancel"] %}
{% if fox %}
<p><a href="{{ shop.url }}/apps/foxlendar/cancel?t={{ fox }}">
Cancel this reservation
</a></p>
{% endif %}The {% if %} keeps the link off order confirmations that are not bookings, so a store selling other things is unaffected.
Where to paste it
Straight after the line <p>{{ email_body }}</p>. It appears once, and puts the link above the View your order button.
Click inside the code box and use the editor's own search, or copy the whole template into a text editor, change it there, and paste it back.
If searching is more trouble than it is worth, scroll to {% capture email_body %} near the top and paste this version instead. The link then sits above the opening message rather than below it.
{% assign fox = attributes["_foxlendar_cancel"] %}
{% if fox %}<a href="{{ shop.url }}/apps/foxlendar/cancel?t={{ fox }}">Cancel this reservation</a><br><br>{% endif %}What the guest sees
| When they click | The page offers | What happens |
|---|---|---|
| Before the cut-off | Cancel and refund | The deposit goes back to the card they paid with. The room returns to sale immediately. |
| After the cut-off | Cancel without a refund | The room returns to sale and you keep the deposit. This is the cancellation fee. |
| On a non-refundable or pay-in-full rate | Cancel without a refund | The link still works, so a guest can tell you they are not coming and the room goes back on sale. |
| After check-in day | Nothing | Online cancellation has closed; the page sends them to you. |
Every cancellation lands on the booking timeline, so you can tell it was the guest and not your staff. The amount shown to the guest is the amount shown to you, and the refund then follows Shopify’s normal timeline back to the card.
Check the cancellation link
Step 3 — check it on one real booking
- Take a test booking on a deposit rate, arriving well in the future.
- Open the order, then click View email in the timeline.
- Look for Cancel this reservation. Click it to see the guest's page.
If the link does not appear
Paste this next to the snippet, take another test booking, and check View email again. Remove it afterwards.
<p>DEBUG {% for a in attributes %}[{{ a.first }}]{% endfor %}</p>| What DEBUG prints | What it means |
|---|---|
[_foxlendar_cancel] is listed | The booking data is reaching the email. The snippet itself is in the wrong place or was altered — re-paste it. |
| Other names listed, but not that one | The order has no cancellation credential. It was placed before you installed this version, so take a fresh test booking. |
| Nothing listed at all | The order is not a Foxlendar booking, or you are looking at a Send test email rather than a real one. |
Turn off Shopify's own cancellation rules
Shopify has its own self-serve returns and cancellations, under Settings → Policies. It is a different feature, and it can refund money you were entitled to keep.
Leave it off, or write its rules so accommodation is not eligible. Requests that do arrive are not automatic: they show as a banner on the order, under the Customer request filter, and wait for your decision.
Request a Quote
You price a stay and send the guest a payment link Premium. Under Quotes.
- New quote. Pick the accommodation, dates and guests.
- Negotiated a figure? Put it in Custom quote price (optional). Blank uses your rate card.
- Create quote. A Shopify draft order is created, and the invoice is emailed when you gave an address.
- No email? Copy the Quote payment link and send it yourself.
- The guest pays, and the booking appears with a unit assigned.
Changing stay dates
Find your situation, then read that part. Which buttons the booking offers depends on two things: whether anyone checked the guest in, and whether the money is collected.
| What happened | Use | Available |
|---|---|---|
| The guest left before the booked check-out | Record departure | From the booked arrival date onwards |
| The plan changed and the stay is moving | Reschedule stay | Until the guest is checked in |
| A checked-in guest is staying on, unpaid | Change check-out | While checked in and unpaid |
| A checked-in guest has paid and is staying on | A new booking for the extra nights | Always |
Checking a guest in
The Arrival card records when the guest actually turned up. Pick the date and time, then Check in. For today the time defaults to now; for an earlier day it defaults to your check-in time, since you will rarely know the minute.
- Checking in locks the arrival date, because moving it would reprice nights already slept. Only the check-out can still change. Clear check-in unlocks it.
- You can check a guest in before the booked date, and record a departure from that day.
- An arrival cannot be in the future, after the booked check-out, or after a recorded departure.
Checking in never moves availability or money. A guest arriving two days late does not hand back the first two nights: the room was held and could not have been sold.
Guest leaves early
Use Record departure and pick the day they actually left. The unused nights go back on sale at once, on the calendar and on your connected channels. The booked dates are not rewritten: they stay as the record of what was agreed, with the departure beside them, which is what lets you undo it.
| Money | |
|---|---|
| Paid | Nothing changes. Unused nights are not refunded. To refund as a gesture, do it on the Shopify order. |
| Approved, not paid yet | Recalculated for the nights stayed, and a new invoice is emailed. The old payment link stops working. |
| Not approved yet | Recalculated. Nothing is sent, and the guest sees the new figure when you approve. |
Say your 31-plus-nights rate is $60 and your 1–30 night rate is $90. A guest booked 35 nights and leaves after 28:
On an unpaid stay the screen puts the old total beside the new one and flags the band change before you save, so you see this coming. Not the bill you meant to send? Put your own figure in Room total (optional).
Manage early departure clears a mistake, and an unpaid total returns to the full booked stay. Clearing asks for those nights back, so it is refused once somebody else has booked them.
Moving a stay rather than shortening it is a different job, in Moving or extending a stay.
Moving or extending a stay
Moving the dates
Reschedule stay moves both dates. Change check-out moves one, for a checked-in guest who has not paid. Either way you are writing a new agreement, so use it when the plan changed, not when the guest simply left.
- Open the booking and choose Reschedule stay.
- Enter the New dates.
- Read What changes. Nothing is saved yet.
- Clear anything it flags, or tick the box to override it.
- Save. The guest’s invoice is reissued if they have not paid.
Before you save, that panel shows:
- Nights before and after, the old total beside the new one, and each night’s price with where it came from.
- The guest’s discount, re-applied to the new nights. A member rate survives the move.
- A warning when the new length crosses a rate plan band.
- Any booking rule the new dates break, and any night another booking already holds, listed by date.
Tick Book these dates anyway to override a broken rule; the override goes into the booking’s history. A night another booking holds cannot be overridden, because that sells the room twice.
| What happens to the money | |
|---|---|
| Not paid yet | The price follows the dates. On an approved request the old invoice is deleted and a new one emailed, so nobody pays yesterday’s figure for tomorrow’s stay. |
| Paid | The amount collected does not move. Cheaper new dates on a non-refundable plan owe nothing; any other difference must be waived explicitly before the change saves, and who waived it is recorded. |
Worked example, on a paid booking
The guest paid $900 and wants different dates. What the screen asks of you depends only on what those dates are worth:
The third row is the one to read twice. Ticking Waive the difference does not collect the $150, it records that you chose to let it go, with your name against it. Actually want the money? Take it on the Shopify order or raise a separate quote, then come back and move the dates.
Every change lands in the booking’s history: check-ins, departures, old and new dates, amounts before and after, rules overridden, differences waived, and whether the invoice went out again.
Guest wants to stay longer
Not paid, or not checked in: move the check-out from the booking. The gap you keep between stays is measured against the next booking, not against the guest’s own nights. Paid and checked in: make 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.
Managing bookings
Dashboard
Tabs: All, Confirmed, Cancelled. Search by guest name, email, phone or order number. A Needs unit badge flags oversold bookings.
Calendar
Three controls decide what you are looking at. Layout is Timeline or Month grid. Range is Month, Week or Day. Rows is Accommodation types or Units, and the Unassigned row holds bookings still waiting for one.
Click a bar for guest details, the total, and links to the booking and the Shopify order. On the timeline you can also click a rate or rule cell to edit it in place.
| Bar | Means |
|---|---|
| Confirmed | Paid, with a unit assigned. |
| Awaiting review | An unanswered booking request, holding its room until you decide. |
| Closed by you | A range you took off sale. Striped. |
| Booked on a channel | Imported over iCal. Read-only here. |
| Balance to collect | A deposit booking with money still owed. The bar carries a Due marker for the amount. |
Collecting a deposit balance
A deposit rate leaves money to take at your property. The booking shows it as Due at the property, and the calendar marks the bar until it is settled.
When the guest pays, open the booking and choose Mark balance as collected. The amount is printed on the button, because pressing it asserts the whole balance arrived. Took only part of it? Leave it alone until the rest is in. Undo reverses it if you tapped it on the wrong booking.
Closing dates
You never need a reservation to take a night off sale.
- Drag across the days on an accommodation’s row. For a range running past the month on screen, use Close dates instead.
- Check First closed night and Last closed night, and the Reopens on date it works out for you.
- Add a Reason, and a Note only you see.
- Close dates to save.
- 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 step with Airbnb, Vrbo and other iCal channels Premium. Open Channel sync.
- Add connection, then set Accommodation or unit — what this calendar represents.
- Pick the Channel: Airbnb, Vrbo, TripAdvisor, HomeAway, Booking.com or Generic iCal for anything else.
- Name it under Connection name, for example “Airbnb - Ocean Villa”, so a list of six is readable later.
- Set Auto-sync interval, from every 15 minutes to daily.
- Paste their link into Import iCal URL. Their reservations then arrive as closed dates. Leave it empty if you only want to hand out an export feed.
- Copy the export URL Foxlendar gives you and paste that into the other channel.
| Connection shows | Means |
|---|---|
| Two-way sync | You import theirs and they import yours. |
| Export only | No import URL set, so nothing comes in. |
| Not synced | Configured but never run. Use Sync now. |
One calendar per room. Airbnb and Vrbo give one calendar per listing, so each maps directly to one accommodation or unit. The Manual blocks card lower down covers maintenance and owner stays: these publish to your export feed, so a room you take off sale stops selling on every channel at once.
Imported dates read Booked on a channel on your calendar and cannot be reopened here, because reopening one would put a sold night back on sale. Change the reservation on the channel instead. To take nights off sale yourself, use Close dates.
Discounts
Open Discounts in the menu Standard. Each discount is one offer with its own rules.
Create a discount
New discount, then work down the five cards. Only the first two are compulsory.
The offer
| Field | Meaning |
|---|---|
| Name | What the guest reads on their quote and invoice. |
| Description | Optional, shown beside the discount on the invoice. |
| Discount type | Percentage, fixed amount, or Free nights. Free nights waives the cheapest nights of the stay, so pair it with a minimum-nights condition. |
| Value | The percent, the amount, or the number of nights. |
| Applies to | Room only, or room plus add-ons. Most hotel offers discount the room only. |
Who can get it
| How guests obtain it | What happens |
|---|---|
| Automatic | Any stay meeting the conditions gets it, with nothing for the guest to do. |
| Promo code | The guest types your Promo code on the booking form. Case and dashes are ignored. |
| Membership | Tied to a Membership tier. Only members with an approved, unexpired membership in that tier qualify. |
| Staff only | Never appears on the storefront. You apply it by hand when approving a request. For goodwill and negotiated rates. |
Conditions
Leave anything blank to place no restriction. Everything you do set must be met. The two date windows are the pair people mix up:
| Field | Meaning |
|---|---|
| Offer window: Bookable from, Bookable until | When the discount may be booked. Checked against today, so this is your campaign period. |
| Travel window: Stays from, Stays until | Which stays qualify. Checked against the check-in date, so this is your low season. |
| Minimum nights, Maximum nights | Blank for any stay length. |
| How far ahead: At least (days ahead), At most (days ahead) | Days between today and check-in. A minimum makes it early-bird, a maximum makes it last-minute. |
| Check-in days | Select none to allow any weekday. |
| Accommodations | Select none to include every room. |
| Rate plans | Select none to include every plan. |
Usage caps, stacking and worked numbers are in Discount limits & combining.
Discount limits & combining
Limits
| Field | Meaning |
|---|---|
| Total uses allowed | Blank for unlimited. A cancelled or declined booking gives its use back. |
| Uses allowed per guest | Counted by email address. |
Combination
| Field | Meaning |
|---|---|
| Combines | Ticking Allow this to combine with other combinable discounts lets it stack with others that also allow it. Off, the default, means the discount runs alone. |
| Exclusive | The state when that box is off. |
| Priority | Higher runs first when discounts combine, and breaks the tie when two save the same amount. |
Whatever you set, a guest is always given whichever outcome saves them the most. Combining is an option you make available, not a result you force. The shop-wide member-plus-promo switch is separate and lives in Settings.
Two member rates, no duplicate rate plans
You give ASOR members 10% and students 15%, on stays up to 30 nights. Create two discounts, set both to Membership, point each at its tier, and set max nights to 30. That is all. You do not duplicate your standard rate plan to hold a second price.
Worked example
A five-night stay at $100, $100, $120, $200 and $200, so $720 of room. The guest holds a 10% member rate and types a SPRING20 code worth 20%. You also run a free-nights offer giving one night on five.
Stacking off, which is the default, the guest gets SPRING20 alone at $144 because it saves the most. Stacking on, the pair still has to beat every single offer, and here it does.
Two details worth knowing before a guest finds them. Stacked percentages are not added: 10% and 20% is not 30%, because the second applies to what the first left, which is why this comes to $201.60 rather than $216. And a free night waives your cheapest night, the industry norm, so a guest cannot aim the offer at your $200 Saturday.
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 Premium. Discounts are attached to tiers, not to individual members.
Create a tier
- Open Memberships, then New tier.
- Name it: “Student”, “ASOR member”, “Corporate”.
- Save, then open Discounts and create one with Membership pointed at this tier. A tier on its own is worth nothing until a discount hangs off it.
| Field | Meaning |
|---|---|
| Name | What members and your staff call this group. |
| Short code | Optional prefix for the codes you issue, so a member code reads STUDENT-4K7QP2. |
| Description | Optional. |
| Valid for (months) | Counted from the moment you approve an application. Blank means it never expires. |
Verification
How a guest proves they belong. The tier list shows which one is in force: Code only or Email accepted.
| Method | How it works | When to use |
|---|---|---|
| Code only | The member types the code issued when you approved them. | The default, and the safe one. |
| Email accepted | Ticking Accept the member’s email address as proof, instead of their code lets a booking from that address through on its own. | Only where you review every request before taking payment. |
| Claim from the form | The guest picks the tier from a list instead of proving anything, and your staff check it before invoicing. Switched on in Settings. | Request to book rooms only. It never appears on instant checkout. |
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 and check-out times. |
| Guest policy | Guest type names, their ages, and whether babies take a place or are charged. See Guest types & capacity. |
| Booking rules | Defaults for every room: stay length, buffer, advance windows, same-day, required details, request to book and its hold window. See Booking rules. |
| Multi-room booking | Let a guest book several rooms in one checkout. Off by default. See Multi-room booking. |
| Search filters | Which of your own details guests may filter by. Nothing is on until you tick it. See Amenities & attributes. |
| Price display | Currency code (240 USD), or the symbol before ($240) or after (240 $). |
| Pricing defaults | A fallback for rooms with no rate. Weekend and holiday pricing moved to the price calendar. |
| Services | Switch add-ons on storefront-wide, and require at least one per booking. |
| Discounts | Whether members may also use a promo code, and whether guests can pick a membership rate on the form. Both off by default. See Combination & settings. |
Privacy requests
When a customer asks for a copy of their data, Shopify tells Foxlendar and Foxlendar shows you what it holds. The duty to hand it over inside 30 days is yours, not the app’s, so this screen exists to make that quick rather than to do it for you.
There is no menu entry, because the request only exists if someone chose Request customer data on a customer in your Shopify admin. A banner on Bookings appears when one is waiting, with Review requests on it.
- Open the request. It lists the customer, when they asked, and whether the scope is all their orders or a few.
- Read what Foxlendar holds: every booking for that person, with the guest details and notes on each.
- Download JSON, then send it to the customer however you normally reply to them.
The export is built from your bookings the moment you open it, not from a stored copy. It is current, and it is empty once the data has been erased, which is also why a request can honestly show nothing: either they never booked, or the erasure already ran.
Erasing a customer
Ask Shopify to erase a customer and Foxlendar clears their personal fields from your bookings without being asked twice. Booking requests are included even when they never reached checkout, which is the case that normally gets missed: a declined or expired request carries a name, an email and a phone number while having no Shopify customer attached to it at all.
FAQ
Do I need to write any code?
No. Everything is set in the app, and the storefront pieces go in through Shopify's theme editor. Storefront blocks
How do I change the colours or corner style of the booking blocks?
Switch on "Foxlendar appearance" in the theme editor under App embeds. Accent colour, button text, light or dark, corner radius and spacing then apply to every block at once. Leave it off and the blocks inherit your theme. Storefront blocks
Which blocks should I put on a product page?
Either Accommodation page on its own, or the individual blocks. Never both: Accommodation page already contains the form, so you would show two. Availability calendar and Location map sit outside it either way. Storefront blocks
How do guests pay? Do I need Stripe or another provider?
No separate provider. Guests pay through your normal Shopify Checkout, with the price already locked onto the order. How a booking is created
Can two guests book the same room type on the same dates?
Yes, when the accommodation has more than one unit. Each booking takes its own, and the dates close once every unit is gone. Accommodations & units
What stops a customer editing the price or dates at checkout?
Both are written server-side onto a Shopify draft order as fixed line items. The customer cannot change the amount, the quantity or the dates. How a booking is created
How does Request to book differ from Request a Quote?
Request to book is the guest's move: they submit, the room is held, you review. A quote is yours: you build it and send a payment link, and it holds nothing. Vet guests with the first, negotiate a price with the second. Request to book
When is a booking actually created?
When the Shopify order is paid, never before. At checkout for an instant booking, or when the guest pays your invoice for an approved request. How a booking is created
What happens if a date gets oversold?
The paid booking is still created, never lost, and flagged "Needs unit". Assign a free unit, or cancel and refund on the Shopify order. Managing bookings
Does cancelling or refunding the Shopify order update the booking?
Yes. Cancelling cancels the booking and frees the unit, and a full refund marks it refunded. Foxlendar never moves money on its own. How a booking is created
Does creating a quote hold the dates?
No. A quote is an unpaid draft order, so the unit is taken only once the customer pays. Request a Quote
Can I sync with Airbnb, Booking.com or Vrbo?
Airbnb and Vrbo yes, on Premium, over iCal. Booking.com is the exception: it no longer accepts iCal links from stores like this, so you need a channel manager with a direct Booking.com connection, such as Sirvoy, Guesty Lite or Beds24. Channel sync (iCal)
Can a guest use both a promo code and a membership rate?
Not by default: they get whichever single discount saves more. Settings → Discounts can allow stacking, and stacked discounts apply to what the last one left rather than adding up. Combination & settings
Why is a membership tier missing from the booking form?
Its discount failed a condition for that stay. A 31-night tier does not appear on a 5-night booking. Membership tiers
Troubleshooting
The reservation form doesn't appear on my product page
Three things to confirm: the product is connected to an accommodation, the accommodation's Status is Active, and either the Reservation form or the Accommodation page block is on that product template. Getting started → Add Foxlendar blocks to your theme is the quickest way in. Storefront blocks
I see the booking form twice on my product page
You have both Accommodation page and Reservation form on the template, and the first already contains the second. Delete whichever you do not want. Clicking an "Add to theme" button twice does the same thing, because Shopify adds another copy each time. Storefront blocks
A date shows as unavailable when I expect it to be open
Something is holding it: every unit booked or on maintenance, a range you closed, a night imported from a channel, or a booking rule such as no check-in on that weekday. Check the accommodation's units, your closed dates, and your rules. On Request to book, also check the Requests page, because an unanswered request holds its room and shows amber on the calendar. Booking rules
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, which usually answers it on sight. Which price wins
“This room can't accommodate that many guests”
The party is larger than the accommodation's capacity. Raise Adults, Children and Total capacity on the accommodation, or book fewer guests. Babies only count toward capacity if you switched that on. Guest types & capacity
I can't add more accommodations
You are at your plan's limit. Open Plans & billing to raise it. Plans & limits
Some of my accommodations disappeared from my storefront
Your plan's allowance is what the storefront sells, so having more accommodations than it covers holds the newest back. This normally follows a move to a smaller plan. Open Accommodations: a banner names exactly which ones, and upgrading puts them back on sale at once. Nothing was deleted, and bookings already taken are untouched. Plans & limits
401 or session errors in the admin
Reinstall the app from your Shopify admin. The embedded session refreshes once it reconnects.
