In brief
- WooCommerce Bookings models a bookable product with a duration, availability rules with numeric priority, resources (staff, rooms, equipment), person types with their own prices, and six booking statuses; it syncs with Google Calendar.1
- Every booking can be exported to CSV with its product, resource, start and end, status, customer, order and order item IDs, person counts and cost, and read through the REST API at /wp-json/wc-bookings/v1.23
- Shopify has no booking engine. Sesami prices by resources ($19 for 5, $129 for 20, $299 for 40 per month), BTA by monthly bookings (free for 10, $25 for 50, $49.95 for 350, $110 for 1,000 with API access) and Easy Appointment Booking by features ($0 to $39 per month).456
- None of the three listings mentions importing existing bookings. Past bookings migrate as order history; future bookings are re-created in the app, by API where the plan allows it, or by hand, and the WooCommerce calendar stays open until the last of them has been copied.456
What a booking store contains
A bookable product in WooCommerce Bookings is defined by its duration unit and whether blocks are fixed or customer-defined, by availability rules that carry a numeric priority and can cover specific dates, time slots or ranges, and optionally by resources, which the documentation describes as "staff, equipment, venues, or anything you need", and by person types such as adults and children with different costs.1 Pricing can vary by period and by person or resource. A booking itself moves through unpaid, pending confirmation, confirmed, paid, complete and cancelled.1
That is four kinds of data, and only one of them is a product: the catalog of bookable products, the availability and resource setup, the bookings themselves, and the orders that paid for them. A product migration moves the first and the last. The middle two are the work.
What you can export
Bookings → All Bookings has an export with batched processing and a download link. The CSV carries the booking ID, product ID, resource ID, start and end dates, status slug, customer ID (0 for guests), order ID and order item ID, person counts as a JSON object per person type, cost and attendance status, plus customer timezone and the Google Calendar event ID.2 The same data is available through the REST API, where a booking has start, end, status, customer_id, order_id, order_item_id, product_id, resource_id, person_counts, all_day, cost and google_calendar_event_id; the API also lists bookable products, resources and slots.3
Availability rules and resource definitions are product settings rather than bookings, so they come out with the bookable product through the products endpoint, and are rebuilt in the app's own terms.
Booking apps on Shopify
| App | Priced by | Plans | Notable | Rating |
|---|---|---|---|---|
| Sesami | Resources | $19 (5 resources), $129 (20), $299 (40, multi-location) per month | Appointments, rentals, classes, reservations; Google Calendar, Shopify POS, Klaviyo; ticketing and check-in4 | 4.6, 266 reviews4 |
| BTA Appointment Booking | Monthly bookings | Free (10), $25 (50), $49.95 (350), $110 (1,000, API access) per month | Appointments, rentals, tickets, classes; Google, Outlook and iCal sync; deposits and SMS from Premium; staff accounts per plan5 | 4.7, 405 reviews5 |
| Easy Appointment Booking | Features | Free, $15, $29 (multiple events, Google Calendar, Zoom), $39 (waitlist, deposits, Outlook) per month | Services, classes, events, tours; staff portal; intake questions; Shopify Flow6 | 4.9, 546 reviews6 |
From the Shopify App Store listings on 19 Sep 2026; plans change often. Match the pricing axis to your business: a salon with eight staff is a resource count, a tour operator is a bookings-per-month count. vendor-published
How the concepts map
| WooCommerce Bookings | Shopify booking app | Notes |
|---|---|---|
| Bookable product | Product with a booking widget or an event/service in the app | The Shopify product carries price and checkout; the app carries time |
| Duration and block type | Service duration, slot length | Customer-defined durations map to rental-style apps better than appointment apps |
| Availability rules with priority | Working hours, blackout dates, per-resource schedules | Rebuilt; priorities become rule order in most apps |
| Resources | Staff, team members, rooms | The unit Sesami prices on |
| Person types and costs | Group bookings, ticket types, variants | Per-person pricing often becomes product variants |
| Booking statuses | App statuses plus order payment status | "Pending confirmation" is app-level approval; "unpaid" is a Shopify order state |
| Google Calendar sync | App calendar sync | Reconnected in the app; old event IDs are not reused |
| Deposits and balances | App deposits, draft orders or partial payments | Half-paid bookings need a decision per booking |
The future-bookings problem
Past bookings are history and travel with the orders. Future bookings are live commitments, and there is no import path for them: the three listings above describe calendar sync, reminders and deposits, but not importing bookings from another system.456 They have to be re-created, one of three ways.
- Through the app's API, where the plan includes it (BTA's Business plan lists API access5). A script reads the WooCommerce export and creates each future booking against the migrated customer and product.
- By hand, from the CSV, when the number of future bookings is small. A salon with 60 appointments in the next fortnight is an afternoon.
- By letting them run out, honouring existing bookings on WooCommerce while new bookings open on Shopify, and closing WooCommerce once the last old booking is complete. This avoids re-creation entirely but means two calendars for a few weeks.
Freeze the calendar before you copy it
Whichever route, stop new bookings on WooCommerce at a fixed moment, export, then re-create. Copying while the calendar is still open is how a slot gets sold twice.
Cutover plan
- Count bookings by status and by date: how many are in the future, how many are pending confirmation or unpaid, how many carry deposits.
- Pick the app on the pricing axis that matches your model, and check it can express your availability rules and person types before anything is migrated.
- Migrate products, customers and orders as usual, so every future booking has a customer and a product to attach to.
- Rebuild availability, resources and services in the app, and reconnect calendar sync.
- Freeze bookings on WooCommerce, export, re-create the future ones by API or by hand, and reconcile the count.
- Tell customers with future bookings that their appointment stands and where to manage it now.
- Keep WooCommerce read-only until the last migrated booking has passed, as the record of what was promised.
Future bookings are counted, copied and reconciled, not left to chance.
- Bookings counted by status, date and deposit before you commit
- App chosen on the axis you actually pay for
- Availability, resources and person types rebuilt
- Future bookings re-created and reconciled to the export
- Customers with open bookings told what changes
- Preview before you pay
What does not transfer
- Booking IDs and Google Calendar event IDs. New bookings get new identifiers; keep the export as the cross-reference.
- Availability rule priorities as such; most apps express the same outcome with ordered rules or blackout dates.
- "Pending confirmation" as a state on the order. Approval moves into the app; the Shopify order is simply paid or unpaid.
- The REST API's create-booking endpoint is marked incomplete in WooCommerce's own documentation, so the WooCommerce side is export-only in practice.3
Frequently asked questions
Does Shopify have built-in bookings or appointments?
No. Booking on Shopify is provided by apps such as Sesami, BTA Appointment Booking and Easy Appointment Booking, which add services, availability, staff or resources and calendar sync on top of Shopify products and checkout.
Can existing bookings be imported into a Shopify booking app?
None of the three listings we compared describes importing bookings from another platform. Future bookings are re-created through the app's API where the plan includes one, by hand from the WooCommerce CSV export, or by honouring them on WooCommerce until they run out.
What does the WooCommerce Bookings export contain?
Booking ID, product ID, resource ID, start and end dates, status, customer ID, order ID and order item ID, person counts as JSON, cost and attendance, plus customer timezone and Google Calendar event ID. The same fields are available through the REST API at /wp-json/wc-bookings/v1.
How are booking apps on Shopify priced?
On different axes. Sesami charges by resources, from $19 per month for 5 to $299 for 40. BTA charges by monthly bookings, from free for 10 to $110 for 1,000. Easy Appointment Booking charges by features, from free to $39 per month. Pick the axis that matches how your business grows.
What happens to deposits and half-paid bookings?
Each one needs a decision: settle the balance on WooCommerce before cutover, or re-create the booking on Shopify with the remaining balance as a draft order or the app's deposit feature. Counting them first avoids surprises.
What about resources like staff and rooms?
They are rebuilt in the app as staff, team members or rooms with their own schedules. Sesami prices per resource, so the count matters for the plan.
Sources
- WooCommerce. WooCommerce Bookings documentation: bookable products, availability rules, resources, persons, statuses, calendar. plugin vendor
- WooCommerce. Import and export bookings: CSV columns and rules. plugin vendor
- WooCommerce. Bookings REST API reference. plugin vendor
- Sesami Inc. Sesami Booking Platform, Shopify App Store listing, 19 Sep 2026. vendor-published
- BTA Commerce. BTA Appointment Booking App, Shopify App Store listing, 19 Sep 2026. vendor-published
- Servicify. Easy Appointment Booking App, Shopify App Store listing, 19 Sep 2026. vendor-published
- Mufatech. WooCommerce → Shopify plugin map, dataset v3.
Mufatech Studio migrates stores to Shopify. Plan availability, limits and plugin behaviour are quoted from the linked documentation as of September 2026 and can change; check the source before acting on a limit.