Import and Export Bookings

WooCommerce Bookings includes a built-in CSV exporter and importer for bookings. Store managers can download a CSV file containing all, or a filtered subset, of their bookings and can also create or update bookings in bulk by uploading a CSV file directly from the WordPress admin without needing third-party plugins or database access.

The export screen mirrors the WooCommerce core product export experience: a dedicated screen, batched processing with a progress bar, and a download link once the file is ready.

Export Bookings

↑ Back to top

Open the Export page

↑ Back to top

Navigate to WP Admin > Bookings > All Bookings. An Export button appears next to the page title in the list-table toolbar. Click it to open the Export Bookings screen.

Open the Bookings Export page

Configure the export

↑ Back to top

The export form offers the following options:

OptionDescription
Which columns should be exported?Leave empty to export all columns, or pick specific columns to limit the output.
Bookable productsFilter the export to bookings belonging to specific bookable products. Leave empty to include all products. This option is hidden when exporting a manual selection.
Booking statusesFilter by one or more booking statuses. Leave empty to include all statuses. This option is hidden when exporting a manual selection.
Custom date range?Enable it to Export bookings within a date range
Export custom meta?When enabled, appends one additional column for every non-core meta key found on each booking.

Generate and download

↑ Back to top

Click Generate CSV. A progress bar fills as the file is generated in batches. When it reaches 100%, the CSV file downloads automatically.

Export from a filtered Booking list

↑ Back to top

The Export button on the All Bookings page is context-aware. When you have active filters applied to the All Bookings list table (month dropdown, status filter, or product/resource filter), clicking Export carries those filters through to the export screen automatically.

Export a Manual Selection

↑ Back to top

To export only specific bookings:

  1. On the All Bookings list table, tick the checkboxes next to the bookings you want to export.
  2. The Export button at the top (eg: Export N items)
  3. Click it. The Export screen opens with a notice confirming how many bookings you are about to export.
  4. Click Generate CSV.

When exporting a manual selection, the product filter, status filter, and date range options are hidden. The explicit selection takes precedence over all filters.

Import Bookings

↑ Back to top

The importer accepts a CSV file in the same format the exporter produces. A CSV exported from one store can be uploaded directly to another without any manual preparation.

Open the Import page

↑ Back to top

Navigate to WP Admin > Bookings > All Bookings. An Import button appears in the list-table toolbar alongside the Export button. Click it to open the Import Bookings screen.

The importer is also accessible from WP Admin > Tools > Import > WooCommerce Bookings (CSV), which redirects to the same screen.

Open the Bookings Import page

Upload a CSV file

↑ Back to top

On the upload screen, select a CSV or TXT file from your computer. The following options are available:

OptionDescription
Choose a CSV file from your computerSelect the file to upload.
Update existing bookingsWhen enabled, rows with an ID matching an existing booking will update that booking. Rows whose ID does not match any existing booking are skipped rather than creating a new one.

Click Show advanced options to reveal additional settings:

Advanced OptionDescription
Enter the path to a CSV file on your serverProvide a file path instead of uploading a file, if the CSV is already on the server.
CSV DelimiterChange the column separator if your file uses something other than a comma. Defaults to ,.
Use previous column mapping preferencesReuses the column mapping saved from your last import.

Map columns

↑ Back to top

The importer reads the CSV header row and presents a mapping table. Each column in your CSV gets a dropdown where you assign it to a booking field or select Do not import to skip it.

Columns that match the exporter’s default header labels are mapped automatically. If you are uploading a CSV that was produced by the Bookings exporter, the mapping should be complete without any manual adjustment.

The following columns from an exported CSV are not available in the mapping table because the importer does not use them: Product name, Resource name, Persons total, Order status, Customer name, Customer email, and Modified date.

These are read-only values that the exporter resolves at export time.

Import progress

↑ Back to top

The import runs in batches with a progress bar. Once complete, the results screen shows a summary:

  • Bookings imported
  • Bookings updated
  • Bookings skipped
  • Bookings failed
  • Warnings

If any rows had problems, a View import log link appears. Click it to expand two tables: one listing failures and skipped rows with reasons, and one listing warnings for rows that imported but required attention.

CSV Columns Reference

↑ Back to top

The following columns are available in the exporter and importer. Columns marked as export only are resolved at export time and are not available as import fields.

All date and time values are formatted as ISO 8601 with the site’s UTC offset (for example, 2026-05-02T09:00:00-04:00).

ColumnHeader LabelNotes
idIDBooking post ID
statusStatusBooking status slug (e.g. confirmedpaid)
attendance_statusAttendance status
all_dayAll dayyes or no
startStart dateRequired for new bookings on import
endEnd dateRequired for new bookings on import. End must be later than start.
local_timezoneCustomer timezoneTimezone identifier stored at booking time
costCost
product_idProduct IDRequired for new bookings on import
product_nameProduct nameExport only. Resolved from the linked product at export time.
resource_idResource ID
resource_nameResource nameExport only. Resolved from the linked resource at export time.
person_countsPerson countsJSON object mapping person type ID to count (e.g. {"1":2,"2":1})
persons_totalPersons totalExport only. Sum of all person counts.
order_idOrder ID
order_item_idOrder item ID
order_statusOrder statusExport only. Resolved from the linked order at export time.
parent_idParent booking IDSet for sub-bookings
customer_idCustomer user IDWordPress user ID; 0 for guests
woo_customer_idAnalytics customer IDWooCommerce Analytics customer ID
customer_nameCustomer nameExport only. Resolved from the order at export time.
customer_emailCustomer emailExport only. Resolved from the order at export time.
google_calendar_event_idGoogle Calendar event IDSet when the booking is synced to Google Calendar
noteCustomer note
date_createdCreated date
date_modifiedModified dateExport only.
date_cancelledCancelled dateEmpty if not cancelled
meta:<key>Meta: (key)On export, included when Export custom meta is enabled. On import, any meta: column is saved as post meta on the booking.

Permissions

↑ Back to top

The Export button requires both the manage_woocommerce and export capabilities. The Import button requires both the manage_woocommerce and import capabilities. Users without the relevant capability will not see the corresponding button and cannot access the screen directly.

Developer Reference

↑ Back to top

Scope of support:

We are unable to provide support for customizations under our Support Policy. If you need to customize a snippet or extend its functionality, we recommend working with a Woo Agency Partner or a WooCommerce developer on Codeable.

Export Hooks

↑ Back to top

All filter names follow the pattern woocommerce_bookings_export_*

Modify the default export columns

↑ Back to top

Use the woocommerce_bookings_export_default_columns filter to add, remove, or rename columns in the export form and in the generated CSV.

add_filter( 'woocommerce_bookings_export_default_columns', function( array $columns ): array {
// Add a custom column.
$columns['my_custom_field'] = __( 'My Custom Field', 'my-plugin' );

// Remove an existing column.
unset( $columns['google_calendar_event_id'] );

return $columns;
} );

Override the value of a specific column

Use the woocommerce_bookings_export_column_{column_id} filter to control the value written to a specific column for each booking row. When a filter is attached for a given column_id, it takes priority over the built-in resolver.

add_filter( 'woocommerce_bookings_export_column_my_custom_field', function( string $value, WC_Booking $booking, string $column_id ): string {
    return get_post_meta( $booking->get_id(), '_my_custom_field', true ) ?: '';
}, 10, 3 );

Modify the full row data before it is written

Use the woocommerce_bookings_export_row_data filter to modify the complete row array before it is written to the CSV. Use this to change multiple columns at once or to perform row-level transformations.

add_filter( 'woocommerce_bookings_export_row_data', function( array $row, WC_Booking $booking, WC_Bookings_CSV_Exporter $exporter ): array {
$row['status'] = strtoupper( $row['status'] );
return $row;
}, 10, 3 );

Refine which bookings are fetched

Use the woocommerce_bookings_export_query_args filter to modify the query arguments passed to WC_Booking_Data_Store::get_booking_ids_by().

Use this to restrict or expand which bookings are included in the export.

add_filter( 'woocommerce_bookings_export_query_args', function( array $args ): array {
// Only export bookings assigned to a specific resource.
$args['object_id'] = array( 42 );
$args['object_type'] = 'resource';
return $args;
} );

Change which booking statuses are exportable

Use the woocommerce_bookings_export_statuses filter to control which booking post statuses are included in the export. By default this includes all admin-visible, user-visible, and cancellation-related statuses.

add_filter( 'woocommerce_bookings_export_statuses', function( array $statuses ): array {
// Only export confirmed and paid bookings.
return array( 'confirmed', 'paid' );
} );

Exclude additional meta keys from the meta export

Use the woocommerce_bookings_export_skip_meta_keys filter to add meta keys that should be excluded when Export custom meta is enabled. By default, all core booking data-store meta keys plus _edit_lock and _edit_last are already excluded.

add_filter( 'woocommerce_bookings_export_skip_meta_keys', function( array $keys, WC_Booking $booking ): array {
$keys[] = '_my_plugin_internal_key';
return $keys;
}, 10, 2 );

Add custom rows to the export form

Use the woocommerce_bookings_export_row action to inject additional rows into the export options table on the Export Bookings screen.

add_action( 'woocommerce_bookings_export_row', function() {
    ?>
    <tr>
        <th scope="row">
            <label for="my-custom-option"><?php esc_html_e( 'My Option', 'my-plugin' ); ?></label>
        </th>
        <td>
            <input type="checkbox" id="my-custom-option" name="my_custom_option" value="1" />
        </td>
    </tr>
    <?php
} );

Import Hooks

↑ Back to top

All filter names follow the pattern woocommerce_bookings_import_* or woocommerce_bookings_csv_import_*.

Replace the importer class

Use the woocommerce_bookings_csv_importer_class filter to swap in a custom importer class. The class must extend WC_Bookings_Importer.

add_filter( 'woocommerce_bookings_csv_importer_class', function( string $class ): string {
return My_Custom_Bookings_Importer::class;
} );

Modify the importer arguments

Use the woocommerce_bookings_csv_importer_args filter to modify the arguments passed to the importer constructor

add_filter( 'woocommerce_bookings_csv_importer_args', function( array $args, string $class ): array {
$args['lines'] = 50; // Process 50 rows per batch instead of the default 30.
return $args;
}, 10, 2 );

Change the number of rows processed per batch

Use the woocommerce_bookings_import_batch_size filter to control how many rows are processed per AJAX batch. The default is 30.

add_filter( 'woocommerce_bookings_import_batch_size', function( int $size ): int {
return 50;
} );

Modify the default column auto-mapping

Use the woocommerce_bookings_csv_import_mapping_default_columns filter to adjust which CSV header labels are automatically mapped to which internal column IDs.

add_filter( 'woocommerce_bookings_csv_import_mapping_default_columns', function( array $columns, array $raw_headers ): array {
$columns['My Start Column'] = 'start';
return $columns;
}, 10, 2 );

Modify the final column mapping

Use the woocommerce_bookings_csv_import_mapped_columns filter to adjust the resolved mapping after auto-detection has run.

add_filter( 'woocommerce_bookings_csv_import_mapped_columns', function( array $headers, array $raw_headers ): array {
return $headers;
}, 10, 2 );

Modify a booking object before it is saved

Use the woocommerce_bookings_import_pre_save_booking_object filter to modify the booking object just before the importer saves it.

add_filter( 'woocommerce_bookings_import_pre_save_booking_object', function( WC_Booking $booking, array $data, bool $updating ): WC_Booking {
$booking->update_meta_data( '_imported_by', get_current_user_id() );
return $booking;
}, 10, 3 );

Run code after a booking is imported or updated

Use the woocommerce_bookings_import_inserted_booking_object action to run custom logic after a booking has been saved by the importer.

add_action( 'woocommerce_bookings_import_inserted_booking_object', function( WC_Booking $booking, array $data, bool $updating ): void {
// Send a custom notification, log the import, etc.
}, 10, 3 );

Control how datetime offsets are handled

Use the woocommerce_bookings_importer_timestamp_mode filter to switch between two timestamp modes.

The default is preserve_wall_clock, which keeps the same clock reading from the source CSV regardless of timezone differences. Use preserve_instant to shift the time to the destination site’s local equivalent of the same absolute moment.

add_filter( 'woocommerce_bookings_importer_timestamp_mode', function( string $mode ): string {
return 'preserve_instant';
} );

Questions and support

↑ Back to top

Something missing from this documentation? Still have questions and need assistance?

  • If you have a question about a specific extension or theme you’d like to purchase, contact us to get answers.
  • If you already purchased this product and need some assistance, get in touch with a Happiness Engineer via our support page and select this product’s name from the Product dropdown.

Use of your personal data
We and our partners process your personal data (such as browsing data, IP Addresses, cookie information, and other unique identifiers) based on your consent and/or our legitimate interest to optimize our website, marketing activities, and your user experience.