Overview
Documentation

Foxlendar guide

Turn your Shopify store into a booking engine for rooms, villas, apartments and rentals. No code, no separate payment provider.

Overview

Foxlendar adds date-based bookings to Shopify. Guests pick dates on your product page and pay through normal Shopify Checkout. You manage everything from the app dashboard.

What you sellHow it works
Rooms, villas, apartmentsEach is an "accommodation" linked to a Shopify product.
Nightly staysGuests pick check-in/check-out. Price is calculated per night.
Add-onsOptional services like breakfast, cleaning or airport pickup.
Across channelsiCal sync with Airbnb, Booking.com and Vrbo Premium.

Prices and dates are locked server-side on a Shopify draft order. Guests cannot change them at checkout. Bookings stay in sync when an order is paid, cancelled or refunded.

Core concepts

Accommodation

A bookable type, like "Deluxe Double" or "Ocean Villa". Holds capacity, amenities, pricing and a link to a Shopify product.

Unit

A physical instance. "Apartment A1" and "A2" are two units of the same accommodation. Two units means two guests can book the same dates.

Product mapping

The link between an accommodation and the Shopify product the customer pays for.

Rate plan

A pricing package: "Flexible" or "Saver". When a room has rates under more than one plan, guests choose.

Season

A date range (e.g. "Summer peak") with its own pricing. When seasons overlap, higher priority wins.

Rate

The nightly price for an accommodation under a plan, optionally for a season or single date.

Booking rule

Min/max stay, allowed check-in days, advance windows, buffer. Can apply per room or per season.

Service

An add-on (breakfast, parking, cleaning) with its own pricing model.

Block

Dates made unavailable (maintenance, owner stay, or imported from another channel).

Quick start

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

Plans & limits

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

Hitting a limit is explained inline and points you to upgrade. Going over your monthly booking allowance does not block checkout. Moving to a smaller plan holds back extra accommodations (nothing is deleted); upgrading restores them at once.

Accommodations & units

Create an accommodation

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

Connecting Shopify products

  1. In the accommodation editor, under Product mapping, click Select product.
  2. Pick the product (its first variant is used).
  3. Save.

Name, description and images come from the product. Foxlendar never copies them, so nothing goes out of sync. Use Edit in Shopify on the mapping card to change them at the source.

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

Checkout thumbnail

"This is a physical product"Result at checkout
Off (recommended)Product image shows next to the booking.
OnShopify asks for shipping. Booking falls back to a plain line, no thumbnail.

Flip this from the accommodation editor. Foxlendar turns it off automatically the first time you connect a product.

Locations

A saved address you create once and reuse across accommodations. Powers the map block and the storefront location filter.

  1. Locations → Add location. Fill in city (required), address, country, and optionally latitude/longitude for the map pin.
  2. Open an accommodation → Location section → pick the location.

The location filter appears once you have two or more accommodations with different locations. Skip this entirely if you don't need a map or location search.

Amenities & attributes

What it isHow to set it up
AmenitiesFacilities shown as icons (Wi-Fi, pool, parking).Amenities menu → add with label, icon, sort order. Then tick per accommodation.
AttributesFacts like size, bed type, view.Attributes menu → add with a type (Text, Number, Yes/No, Select). Fill in values per accommodation.

Both render through the Accommodation details block 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").

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

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

Price precedence (per night)

  1. Exact date rate → used as-is, no multiplier.
  2. Season rate → higher-priority season wins if overlapping.
  3. Base rate → the fallback when no date or season match.
  4. Shopify product price → final fallback.

Season, base and fallback nights get the weekend or holiday multiplier. Per-guest extras are added on top.

Example

Base $200/night, 2 adults included, extra adult $30/night. Weekend 1.2×. 3 adults book Fri–Sun (2 nights):

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

Seasons

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

FieldMeaning
NameInternal label, shown when picking a season on a rate.
Start / EndThe range the season covers.
PriorityHigher number wins when two seasons overlap. Default 0.
ActiveOnly active seasons affect pricing.
TipLayer seasons with priority: "Summer" at 0, "Christmas week" at 10. Christmas rates take over for those specific dates.

Weekend & holiday pricing

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

MultiplierDefaultApplies to
Weekend1.2×Nights on your chosen weekend days (Sat/Sun by default).
Major holidayDates you list under Major holiday dates.
Minor holiday1.5×Dates you list under Minor holiday dates.

Enter holiday dates as YYYY-MM-DD, one per line. Only one multiplier per night, in this order: major holiday > minor holiday > weekend.

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

Services (add-ons)

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

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

Common fees

FeeSet it up as
Pet fee (once)Per booking, flat amount.
Pet fee (nightly)Per night.
Tourist / city taxPer guest per night. Turn Taxable off to avoid taxing a tax.
Cleaning feePer booking, flat amount.

Mark a service as Required on an accommodation to charge it automatically on every booking. A service can optionally link to a Shopify product for a checkout thumbnail.

Booking rules

Defaults for all rooms: Settings → Booking rules. Per-room or per-season overrides: Booking rules in the menu Standard.

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

The storefront date picker enforces these live. Disallowed dates are greyed out with a message.

Guest types & capacity

Settings → Guest policy. Name your guest types and set their ages. These labels appear in the guest picker on the storefront.

TypeDefault ageNotes
Adults13+Always shown.
Children2–12Always shown.
BabiesUnder 2Off 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.

BlockPageWhat it does
Availability searchHome / landingDates + guests + location search. Lists matching rooms.
Accommodations gridCollection / landingA grid of bookable rooms with capacity and starting price.
Reservation formProductDate picker, live price, Book now button. The only block guests book from.
Accommodation detailsProductCapacity, amenities and attributes.
Availability calendarProductMonth calendar with open/blocked nights and nightly prices.
Location mapProductMap with pin and directions (Google or OpenStreetMap).

Appearance

Theme editor → App embeds (puzzle-piece icon) → enable Foxlendar appearance. Set accent color, button text color, corner radius and spacing for all Foxlendar blocks.

How a booking is created

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

Request to book

Turn on in Settings → Booking rules, or per accommodation under Booking mode. Available on all plans. Built for long stays, group bookings and student housing.

The flow

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

Per accommodation

Each accommodation can override the shop setting: Always request, Always instant, or Follow shop setting (default). Vet long stays and let day rooms sell themselves.

Hold window

Hold requests for sets how long before auto-decline. Default 48 hours. Set to 0 to hold indefinitely.

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

Request a Quote

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

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

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.

  1. Pick the accommodation or unit to sync.
  2. Choose the channel and auto-sync interval (15 min to daily).
  3. Import URL: paste the channel's iCal link to pull their bookings in as availability blocks.
  4. Export URL: Foxlendar gives you a feed to paste into the other channel.

You can also block dates manually for maintenance or owner stays. Blocked dates are never bookable.

Discounts

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

Create a discount

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

Example

You run two eligibility-based discounts on stays of 1 to 30 nights: ASOR members get 10%, students get 15%. Create two discounts, set each to Membership audience, point each at its tier, and set max nights to 30. Done. No need to duplicate your standard rate plan.

Good to know

  • A cancelled or declined booking always returns its use.
  • A discount that has been used on bookings cannot be deleted. Deactivate it instead.
  • Exclusive (default): when several qualify, the guest gets whichever saves the most.
  • Combinable: stacks with other combinable discounts, each applied to what the last left.

Membership tiers

A tier defines a group of people and what rate they get. Discounts are attached to tiers, not to individual members.

Create a tier

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

Verification

MethodHow it worksWhen to use
CodeMember types the code issued at approval.Default. Safest option.
EmailA booking from the member's email is enough.Only if you review every request before payment. Risky on instant checkout.
Claim listGuest picks from a list on the form. Staff verify before invoicing. Enable in Settings.Request to book only.

One tier can have multiple discounts with different conditions. For example: a 10% short-stay rate and a 15% long-stay rate, both under "ASOR member". The booking form only shows the tier when at least one of its discounts qualifies for the selected stay.

Membership inbox

Memberships in the menu is where you manage applications and active members.

Review an application

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

Membership statuses

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

Staff discount selector

When approving a booking request, you can verify, change or remove the guest's discount before the invoice goes out.

Step by step

  1. Open a request and click Approve.
  2. You see what discount the guest currently has. If they picked a membership rate from the form, a warning says it hasn't been verified.
  3. Check Change the discount before invoicing.
  4. Pick the correct discounts from the list (all your active discounts are shown, including staff-only ones).
  5. The new total is calculated for you. Click Approve and send invoice.

What each choice does

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

Combination & settings

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

SettingOff (default)On
Let members also use a promo codeGuest gets whichever single discount saves more.Member keeps their rate AND can add a promo code on top.
Let guests pick a membership rate on the booking formGuest must type a member code.A list of tiers appears on the form. Request to book only. Staff verify before invoicing.

How the claim list works

  1. Guest picks dates. Only tiers whose discount qualifies for that stay appear. A 31+ night tier is hidden on a 5-night stay.
  2. Guest selects a tier (e.g. "Student — 15%"). This is a claim, not proof.
  3. The request arrives with a warning: "Nothing has verified this."
  4. You check the guest's eligibility and approve, swap, or remove the discount.

Instant-checkout rooms never show the list, regardless of this setting.

Editable message help text

You can customise the text below the guest message field on the booking form.

  1. Open the Shopify theme editor.
  2. Click the Accommodation page or Reservation form block.
  3. Fill in Message field help text.

Leave it blank to keep the default. Example: "Please include your institutional affiliation, purpose of stay, and any discount eligibility."

Settings reference

Settings in the menu. Changes save from the bar at the top.

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

FAQ

Do I need to write any code?

No. Everything is configured in the app admin and added to your storefront through Shopify's theme editor blocks. No theme code editing is required.

How do I change the colors or corner style of the booking blocks?

In the theme editor, open App embeds (the puzzle-piece icon) and enable "Foxlendar appearance". You can set the accent color, button text color, corner radius and spacing for every Foxlendar block. By default the blocks inherit your theme's fonts and colors.

How do guests pay? Do I need Stripe or a separate payment provider?

No separate provider. Guests pay through your normal Shopify Checkout. Foxlendar creates a Shopify order with the exact price locked in, so there are no extra payment keys to set up.

Can two guests book the same room type on the same dates?

Yes, if that accommodation has more than one unit. Each booking is allocated its own unit. When all units are taken for a date range, those dates show as unavailable.

What stops a customer from editing the price or dates at checkout?

The price and dates are written onto a Shopify draft order as fixed custom line items server-side. The customer cannot change the amount, quantity or dates at checkout.

How does 'Request to book' differ from 'Request a Quote'?

Request to book is guest-initiated: the guest fills in the form on the storefront and you review it. The room is held from the moment they submit. Request a Quote is merchant-initiated: you build the quote yourself from the admin and send the guest a payment link. A quote does not hold the room. Use Request to book when you want to vet guests before they pay; use Request a Quote when you are negotiating a price.

Can I use Request to book for some accommodations only?

Yes. The Settings switch is the shop-wide default; each accommodation has its own Booking mode field (under Capacity) that can override it in either direction — always request, always instant, or follow the shop setting. So you can vet long stays and group rooms while a day room still checks out instantly. New accommodations follow the shop setting until you change them.

Does a booking request hold the room?

Yes. A request reserves a real unit the instant it is submitted and blocks those dates on the calendar and on connected channels. The hold lasts until you approve (then the guest pays), decline, or the hold window expires — whichever comes first.

What happens if I don't answer a request in time?

The request is declined automatically after the hold window (48 hours by default, configurable in Settings → Booking rules). The room is released. Set the hold window to 0 to hold indefinitely until you answer.

Can I change the price when I approve a request?

Yes. Enter a custom room total before you approve. Add-ons stay itemised at the amount the guest was quoted; only the room charge changes.

When is a booking actually created?

Only when the Shopify order is paid. In instant-book mode the guest pays at checkout. In Request to book mode the guest pays the invoice you sent when you approved. Either way, no payment means no booking.

What happens if a date gets oversold?

If somehow no unit is free at the moment payment completes, the paid booking is still created (never lost) and flagged with a “Needs unit” badge. You assign a free unit, or cancel and refund from the Shopify order.

Does cancelling or refunding the Shopify order update the booking?

Yes. Cancelling the order cancels the booking and releases the unit. A full refund marks the booking refunded. Foxlendar never auto-refunds money. You control refunds from the Shopify order.

Can I take a booking myself from the admin (phone or walk-in)?

Yes. Add booking creates a paid Shopify order (offline payment) and a confirmed booking, and Shopify emails the guest a confirmation when you provide an email.

Can I send a customer a price to pay later instead of charging now?

Yes, on Premium and up. Use Quotes → New quote to build a priced draft order, then send the customer the payment link (Shopify emails it automatically if you add their email). The booking is created automatically when they pay.

Does creating a quote hold the dates?

No. A quote is an unpaid draft order, so it doesn't reserve a unit or block the dates. The unit is assigned and the dates are taken only when the customer pays the invoice.

Can I sync with Airbnb, Booking.com or Vrbo?

Yes, on the Premium plan. Channel sync imports 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.

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