Foxlendar guide
Turn your Shopify store into a booking engine for rooms, villas, apartments and rentals. No code, no separate payment provider.
Overview
Foxlendar adds date-based bookings to Shopify. Guests pick dates on your product page and pay through normal Shopify Checkout. You manage everything from the app dashboard.
| What you sell | How it works |
|---|---|
| Rooms, villas, apartments | Each is an "accommodation" linked to a Shopify product. |
| Nightly stays | Guests pick check-in/check-out. Price is calculated per night. |
| Add-ons | Optional services like breakfast, cleaning or airport pickup. |
| Across channels | iCal sync with Airbnb, Booking.com and Vrbo Premium. |
Prices and dates are locked server-side on a Shopify draft order. Guests cannot change them at checkout. Bookings stay in sync when an order is paid, cancelled or refunded.
Core concepts
Accommodation
A bookable type, like "Deluxe Double" or "Ocean Villa". Holds capacity, amenities, pricing and a link to a Shopify product.
Unit
A physical instance. "Apartment A1" and "A2" are two units of the same accommodation. Two units means two guests can book the same dates.
Product mapping
The link between an accommodation and the Shopify product the customer pays for.
Rate plan
A pricing package: "Flexible" or "Saver". When a room has rates under more than one plan, guests choose.
Season
A date range (e.g. "Summer peak") with its own pricing. When seasons overlap, higher priority wins.
Rate
The nightly price for an accommodation under a plan, optionally for a season or single date.
Booking rule
Min/max stay, allowed check-in days, advance windows, buffer. Can apply per room or per season.
Service
An add-on (breakfast, parking, cleaning) with its own pricing model.
Block
Dates made unavailable (maintenance, owner stay, or imported from another channel).
Quick start
- Install from the Shopify App Store.
- Create an accommodation. Accommodations → Add. Set capacity, add at least one unit.
- Connect a Shopify product. In the accommodation editor, click Select product.
- Set a price. Rates → create a rate plan, add a base nightly rate. No rate? The product price is used as a fallback.
- Add storefront blocks. Theme editor → Add block → Reservation form and Accommodation details.
- Test. Book a stay end to end. The paid order appears as a confirmed booking.
Plans & limits
| Free | Standard | Premium | Business | |
|---|---|---|---|---|
| Accommodations | 1 | 5 | 25 | Unlimited |
| Units / accommodation | 2 | 10 | Unlimited | Unlimited |
| Bookings / month | 15 | 150 | 750 | Unlimited |
| Seasons & booking rules | No | Yes Standard | Yes Premium | Yes |
| Channel sync (iCal) | No | No | Yes Premium | Yes |
| Request to book | Yes | Yes | Yes | Yes |
| Discounts & memberships | Yes | Yes | Yes | Yes |
Hitting a limit is explained inline and points you to upgrade. Going over your monthly booking allowance does not block checkout. Moving to a smaller plan holds back extra accommodations (nothing is deleted); upgrading restores them at once.
Accommodations & units
Create an accommodation
- Accommodations → Add accommodation.
- Connect a Shopify product (see next section).
- Set capacity: max adults, children, and (if enabled) babies.
- Add at least one Active unit.
- Save.
| Section | What it controls |
|---|---|
| Product mapping | The Shopify product the guest pays for. |
| Status | Active (bookable), Inactive, Maintenance, or Archived. |
| Location | A saved address for the map block and location search. |
| Details & amenities | Attributes (size, beds, view) and amenity checkboxes. |
| Booking mode | Instant checkout or Request to book. See Request to book. |
| Services | Which add-ons this room offers. |
| Units | Physical inventory. 2 units means 2 guests can book the same dates. |
Connecting Shopify products
- In the accommodation editor, under Product mapping, click Select product.
- Pick the product (its first variant is used).
- Save.
Name, description and images come from the product. Foxlendar never copies them, so nothing goes out of sync. Use Edit in Shopify on the mapping card to change them at the source.
Checkout thumbnail
| "This is a physical product" | Result at checkout |
|---|---|
| Off (recommended) | Product image shows next to the booking. |
| On | Shopify asks for shipping. Booking falls back to a plain line, no thumbnail. |
Flip this from the accommodation editor. Foxlendar turns it off automatically the first time you connect a product.
Locations
A saved address you create once and reuse across accommodations. Powers the map block and the storefront location filter.
- Locations → Add location. Fill in city (required), address, country, and optionally latitude/longitude for the map pin.
- Open an accommodation → Location section → pick the location.
The location filter appears once you have two or more accommodations with different locations. Skip this entirely if you don't need a map or location search.
Amenities & attributes
| What it is | How to set it up | |
|---|---|---|
| Amenities | Facilities shown as icons (Wi-Fi, pool, parking). | Amenities menu → add with label, icon, sort order. Then tick per accommodation. |
| Attributes | Facts like size, bed type, view. | Attributes menu → add with a type (Text, Number, Yes/No, Select). Fill in values per accommodation. |
Both render through the Accommodation details block and optionally in search filters.
Rate plans
A rate plan is a pricing package. Most properties have one or two (e.g. "Flexible" and "Saver").
- Rates → New rate plan.
- Name it. Toggle Refundable if applicable.
- Add rates inside the plan (covered next).
If a room has rates under more than one active plan, the storefront shows a plan selector. One plan means no selector.
Rates & how price is calculated
| Field | Meaning |
|---|---|
| Accommodation | Which room this rate applies to. |
| Season | Optional. No season = base rate (the standing price). |
| Date override | A price for one exact date. Beats season and base. No multipliers applied. |
| Price | Nightly price. |
| Base adults / children | How many guests the price covers before extras kick in. |
| Extra adult / child | Added per night for each guest above the included count. |
| Min / Max nights | Rate is only eligible when stay length is within this range. |
Price precedence (per night)
- Exact date rate → used as-is, no multiplier.
- Season rate → higher-priority season wins if overlapping.
- Base rate → the fallback when no date or season match.
- Shopify product price → final fallback.
Season, base and fallback nights get the weekend or holiday multiplier. Per-guest extras are added on top.
Example
Base $200/night, 2 adults included, extra adult $30/night. Weekend 1.2×. 3 adults book Fri–Sun (2 nights):
Seasons
A named date range Standard you attach pricing to. Create under Seasons.
| Field | Meaning |
|---|---|
| Name | Internal label, shown when picking a season on a rate. |
| Start / End | The range the season covers. |
| Priority | Higher number wins when two seasons overlap. Default 0. |
| Active | Only active seasons affect pricing. |
Weekend & holiday pricing
Under Settings → Pricing defaults. Apply to season, base and fallback nights. Never to an exact date rate.
| Multiplier | Default | Applies to |
|---|---|---|
| Weekend | 1.2× | Nights on your chosen weekend days (Sat/Sun by default). |
| Major holiday | 2× | Dates you list under Major holiday dates. |
| Minor holiday | 1.5 × | Dates you list under Minor holiday dates. |
Enter holiday dates as YYYY-MM-DD, one per line. Only one multiplier per night, in this order: major holiday > minor holiday > weekend.
Services (add-ons)
Optional extras Standard guests add while booking. Create under Services, then assign to accommodations.
| Pricing type | Charged as | Example |
|---|---|---|
| Per booking | Flat fee, once | Cleaning: $50 |
| Per night | × nights | Parking: $10/night |
| Per guest | × guests | Welcome drink: $5/person |
| Per guest per night | × guests × nights | Breakfast: $15/person/night |
Common fees
| Fee | Set it up as |
|---|---|
| Pet fee (once) | Per booking, flat amount. |
| Pet fee (nightly) | Per night. |
| Tourist / city tax | Per guest per night. Turn Taxable off to avoid taxing a tax. |
| Cleaning fee | Per booking, flat amount. |
Mark a service as Required on an accommodation to charge it automatically on every booking. A service can optionally link to a Shopify product for a checkout thumbnail.
Booking rules
Defaults for all rooms: Settings → Booking rules. Per-room or per-season overrides: Booking rules in the menu Standard.
| Rule | Effect |
|---|---|
| Min / Max stay | Fewest and most nights allowed. |
| Check-in / Check-out days | Restrict arrivals or departures to certain weekdays. |
| Min / Max advance | How far ahead a guest must, or can, book. |
| Buffer | Empty days before/after each booking (e.g. for cleaning). |
| Same-day booking | Whether guests can book for today. |
| Require guest details | Name, email and phone required on the storefront. |
| Request to book | Review before payment. See Request to book. |
The storefront date picker enforces these live. Disallowed dates are greyed out with a message.
Guest types & capacity
Settings → Guest policy. Name your guest types and set their ages. These labels appear in the guest picker on the storefront.
| Type | Default age | Notes |
|---|---|---|
| Adults | 13+ | Always shown. |
| Children | 2–12 | Always shown. |
| Babies | Under 2 | Off by default. Enable to add a baby row, then choose whether babies count toward capacity and pricing. |
Capacity is set per accommodation (max adults, children, babies). A guest count that exceeds it is rejected with a clear message.
Storefront blocks
Theme editor → Add block → pick a Foxlendar block. No code. Inherits your theme fonts and colors.
| Block | Page | What it does |
|---|---|---|
| Availability search | Home / landing | Dates + guests + location search. Lists matching rooms. |
| Accommodations grid | Collection / landing | A grid of bookable rooms with capacity and starting price. |
| Reservation form | Product | Date picker, live price, Book now button. The only block guests book from. |
| Accommodation details | Product | Capacity, amenities and attributes. |
| Availability calendar | Product | Month calendar with open/blocked nights and nightly prices. |
| Location map | Product | Map with pin and directions (Google or OpenStreetMap). |
Appearance
Theme editor → App embeds (puzzle-piece icon) → enable Foxlendar appearance. Set accent color, button text color, corner radius and spacing for all Foxlendar blocks.
How a booking is created
- Guest picks dates and services. Price updates live.
- Foxlendar validates server-side: product is bookable, room is active, capacity fits, a unit is free, rules pass.
- "Book now" creates a Shopify draft order with the exact price locked. Guest goes to Shopify Checkout.
- Order paid → confirmed booking, unit assigned, services attached.
- Order cancelled or refunded → booking cancelled, unit released.
Request to book
Turn on in Settings → Booking rules, or per accommodation under Booking mode. Available on all plans. Built for long stays, group bookings and student housing.
The flow
- Guest submits. Same validation as instant booking. Email required.
- Room is held. Real unit reserved, calendar shows amber, channel dates blocked.
- You review under Requests: guest details, message, stay, total.
- Approve: invoice emailed to the guest. Set a custom room price or change the discount first.
- Guest pays → booking confirmed on the held unit.
- Or decline: room released, any existing invoice deleted.
Per accommodation
Each accommodation can override the shop setting: Always request, Always instant, or Follow shop setting (default). Vet long stays and let day rooms sell themselves.
Hold window
Hold requests for sets how long before auto-decline. Default 48 hours. Set to 0 to hold indefinitely.
Request a Quote
You price a stay and send the guest a payment link Premium. Under Quotes.
- New quote. Pick accommodation, dates, guests. Override the room total if needed.
- Create quote. Draft order created. Invoice emailed if you added an email, otherwise copy the link.
- Guest pays → booking created with a unit assigned.
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.
Manual booking
Add booking for phone or walk-in. Creates a paid Shopify order (offline payment) and a confirmed booking.
Cancelling & refunds
- Cancelling releases the unit. Foxlendar never auto-refunds.
- Issue refunds from the Shopify order.
- Audit history records every change and who made it.
Channel sync (iCal)
Keep availability in sync with Airbnb, Booking.com, Vrbo and others Premium. Under Channel sync.
- Pick the accommodation or unit to sync.
- Choose the channel and auto-sync interval (15 min to daily).
- Import URL: paste the channel's iCal link to pull their bookings in as availability blocks.
- Export URL: Foxlendar gives you a feed to paste into the other channel.
You can also block dates manually for maintenance or owner stays. Blocked dates are never bookable.
Discounts
Open Discounts in the menu. Each discount is one offer with its own rules.
Create a discount
- Click New discount.
- Pick the type: Percentage off, Fixed amount off, or Free nights (cheapest nights waived).
- Choose who gets it:
| Audience | What happens |
|---|---|
| Automatic | Applied to any stay that meets the conditions. Guests see it without doing anything. |
| Promo code | Guest types a code on the booking form. Case-insensitive. |
| Membership | Tied to a tier. Guest presents their member code or picks the tier from a list (if you enable that). |
| Staff only | Never shown on the storefront. You apply it by hand when approving a request. |
- Set conditions (all optional): stay length, offer/travel window, lead time, check-in day, which rooms and rate plans.
- Set limits: total uses and uses per guest. Blank = unlimited.
- Save.
Example
You run two eligibility-based discounts on stays of 1 to 30 nights: ASOR members get 10%, students get 15%. Create two discounts, set each to Membership audience, point each at its tier, and set max nights to 30. Done. No need to duplicate your standard rate plan.
Good to know
- A cancelled or declined booking always returns its use.
- A discount that has been used on bookings cannot be deleted. Deactivate it instead.
- Exclusive (default): when several qualify, the guest gets whichever saves the most.
- Combinable: stacks with other combinable discounts, each applied to what the last left.
Membership tiers
A tier defines a group of people and what rate they get. Discounts are attached to tiers, not to individual members.
Create a tier
- Open Memberships → Tiers → New tier.
- Name it (e.g. "Student", "ASOR member", "Corporate").
- Set validity in months. Blank = never expires.
- Save, then go to Discounts and create a discount with audience Membership pointed at this tier.
Verification
| Method | How it works | When to use |
|---|---|---|
| Code | Member types the code issued at approval. | Default. Safest option. |
| A booking from the member's email is enough. | Only if you review every request before payment. Risky on instant checkout. | |
| Claim list | Guest picks from a list on the form. Staff verify before invoicing. Enable in Settings. | Request to book only. |
One tier can have multiple discounts with different conditions. For example: a 10% short-stay rate and a 15% long-stay rate, both under "ASOR member". The booking form only shows the tier when at least one of its discounts qualifies for the selected stay.
Membership inbox
Memberships in the menu is where you manage applications and active members.
Review an application
- Guest applies from the storefront (or you add them with Add member).
- Application shows as Awaiting review.
- Click Approve: a code is issued, the member can start booking.
- Or Reject: they can apply again later.
Membership statuses
| Status | What it means |
|---|---|
| Active | Code works. Member gets the tier rate. |
| Expired | Past the validity period. Code stops working. You can renew. |
| Revoked | You pulled it. Code stops immediately. Existing bookings keep their discount. |
Staff discount selector
When approving a booking request, you can verify, change or remove the guest's discount before the invoice goes out.
Step by step
- Open a request and click Approve.
- You see what discount the guest currently has. If they picked a membership rate from the form, a warning says it hasn't been verified.
- Check Change the discount before invoicing.
- Pick the correct discounts from the list (all your active discounts are shown, including staff-only ones).
- The new total is calculated for you. Click Approve and send invoice.
What each choice does
| You do | Result |
|---|---|
| Leave the checkbox unchecked | Invoice the discount the guest already has. No change. |
| Check it and pick discounts | Guest's discount is replaced with what you picked. |
| Check it and pick nothing | Guest's discount is removed. Full price. |
Combination & settings
Two settings under Settings → Discounts. Both are off by default.
| Setting | Off (default) | On |
|---|---|---|
| Let members also use a promo code | Guest gets whichever single discount saves more. | Member keeps their rate AND can add a promo code on top. |
| Let guests pick a membership rate on the booking form | Guest must type a member code. | A list of tiers appears on the form. Request to book only. Staff verify before invoicing. |
How the claim list works
- Guest picks dates. Only tiers whose discount qualifies for that stay appear. A 31+ night tier is hidden on a 5-night stay.
- Guest selects a tier (e.g. "Student — 15%"). This is a claim, not proof.
- The request arrives with a warning: "Nothing has verified this."
- You check the guest's eligibility and approve, swap, or remove the discount.
Instant-checkout rooms never show the list, regardless of this setting.
Editable message help text
You can customise the text below the guest message field on the booking form.
- Open the Shopify theme editor.
- Click the Accommodation page or Reservation form block.
- Fill in Message field help text.
Leave it blank to keep the default. Example: "Please include your institutional affiliation, purpose of stay, and any discount eligibility."
Settings reference
Settings in the menu. Changes save from the bar at the top.
| Group | What you configure |
|---|---|
| General | Timezone, check-in/check-out times. |
| Guest policy | Adult/child/baby labels, ages, baby capacity and pricing rules. |
| Booking rules | Min/max stay, buffer, advance windows, same-day, require details, request to book, hold window. |
| Price display | Currency code (240 USD), symbol before ($240) or after (240 $). |
| Pricing defaults | Weekend and holiday multipliers and date lists. |
| Services | Enable services storefront-wide. Require at least one per booking. |
| Discounts | Member + promo stacking (off). Guest claim list on form (off, Request to book only). |
FAQ
Do I need to write any code?
No. Everything is configured in the app admin and added to your storefront through Shopify's theme editor blocks. No theme code editing is required.
How do I change the colors or corner style of the booking blocks?
In the theme editor, open App embeds (the puzzle-piece icon) and enable "Foxlendar appearance". You can set the accent color, button text color, corner radius and spacing for every Foxlendar block. By default the blocks inherit your theme's fonts and colors.
How do guests pay? Do I need Stripe or a separate payment provider?
No separate provider. Guests pay through your normal Shopify Checkout. Foxlendar creates a Shopify order with the exact price locked in, so there are no extra payment keys to set up.
Can two guests book the same room type on the same dates?
Yes, if that accommodation has more than one unit. Each booking is allocated its own unit. When all units are taken for a date range, those dates show as unavailable.
What stops a customer from editing the price or dates at checkout?
The price and dates are written onto a Shopify draft order as fixed custom line items server-side. The customer cannot change the amount, quantity or dates at checkout.
How does 'Request to book' differ from 'Request a Quote'?
Request to book is guest-initiated: the guest fills in the form on the storefront and you review it. The room is held from the moment they submit. Request a Quote is merchant-initiated: you build the quote yourself from the admin and send the guest a payment link. A quote does not hold the room. Use Request to book when you want to vet guests before they pay; use Request a Quote when you are negotiating a price.
Can I use Request to book for some accommodations only?
Yes. The Settings switch is the shop-wide default; each accommodation has its own Booking mode field (under Capacity) that can override it in either direction — always request, always instant, or follow the shop setting. So you can vet long stays and group rooms while a day room still checks out instantly. New accommodations follow the shop setting until you change them.
Does a booking request hold the room?
Yes. A request reserves a real unit the instant it is submitted and blocks those dates on the calendar and on connected channels. The hold lasts until you approve (then the guest pays), decline, or the hold window expires — whichever comes first.
What happens if I don't answer a request in time?
The request is declined automatically after the hold window (48 hours by default, configurable in Settings → Booking rules). The room is released. Set the hold window to 0 to hold indefinitely until you answer.
Can I change the price when I approve a request?
Yes. Enter a custom room total before you approve. Add-ons stay itemised at the amount the guest was quoted; only the room charge changes.
When is a booking actually created?
Only when the Shopify order is paid. In instant-book mode the guest pays at checkout. In Request to book mode the guest pays the invoice you sent when you approved. Either way, no payment means no booking.
What happens if a date gets oversold?
If somehow no unit is free at the moment payment completes, the paid booking is still created (never lost) and flagged with a “Needs unit” badge. You assign a free unit, or cancel and refund from the Shopify order.
Does cancelling or refunding the Shopify order update the booking?
Yes. Cancelling the order cancels the booking and releases the unit. A full refund marks the booking refunded. Foxlendar never auto-refunds money. You control refunds from the Shopify order.
Can I take a booking myself from the admin (phone or walk-in)?
Yes. Add booking creates a paid Shopify order (offline payment) and a confirmed booking, and Shopify emails the guest a confirmation when you provide an email.
Can I send a customer a price to pay later instead of charging now?
Yes, on Premium and up. Use Quotes → New quote to build a priced draft order, then send the customer the payment link (Shopify emails it automatically if you add their email). The booking is created automatically when they pay.
Does creating a quote hold the dates?
No. A quote is an unpaid draft order, so it doesn't reserve a unit or block the dates. The unit is assigned and the dates are taken only when the customer pays the invoice.
Can I sync with Airbnb, Booking.com or Vrbo?
Yes, on the Premium plan. Channel sync imports those calendars as availability blocks and exports your Shopify bookings back via an iCal feed, so dates stay aligned across channels.
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
Foxlendar prices each night by precedence: an exact date rate, then a season rate, then the base rate, then the Shopify variant price as a fallback. Weekend and holiday multipliers only apply to season, base and fallback nights, never to an exact date rate. Check the room's rates under Rates and the multipliers under Settings → Pricing defaults.
“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.
