Bookings for WooCommerce works with both physical and virtual booking products. So you can accept bookings for physical items that need to be shipped to the customer – for example, a camera rental store that ships equipment for the hire period or other rental equipment that’s delivered and collected from the user’s address. And you can offer virtual services where nothing is actually shipped to the customer – for example, a yoga studio that accepts bookings for 60-minute classes or consultants selling one-hour video calls.
The plugin has two separate controls for determining whether shipping is included at checkout: each product’s ‘Virtual’ checkbox and a global ‘Hide shipping fields’ setting. You can use them together to set whether shipping options are necessary.
When to set bookable products to ‘Virtual’
The ‘Virtual’ checkbox is set per product. You’ll find it in the ‘Product data’ section on the product edit screen.

Check ‘Virtual’ when:
- The booking is a pure service with nothing to physically deliver, such as a consultation, appointment, class, or rental time slot where no item leaves the building
- You don’t need to charge shipping or collect a shipping address for this product
Leave ‘Virtual’ unchecked when:
- Something physical is shipped as part of the booking, such as a kit, equipment or goods mailed to the customer before or alongside the appointment
- You want to assign a shipping class, weight or dimensions to the product so WooCommerce calculates real shipping costs
When the ‘Virtual’ option is unchecked, the ‘Shipping’ tab – with options for weight, dimensions and shipping class – is visible, just as it is for a simple product. The bookable product is then treated as shippable everywhere WooCommerce checks, including cart totals, the shipping calculator and both the classic and Blocks checkout.
If the ‘Virtual’ option is checked, the ‘Shipping’ tab is hidden.
When to enable the ‘Hide shipping fields’ setting
The ‘Hide shipping fields’ setting is global. To update it, go to WooCommerce > Settings > Bookings.
This setting only affects virtual bookings. By default, WooCommerce hides the shipping address fields at checkout whenever the cart contains only virtual products.
However, some stores might still want a shipping address for virtual bookings – for example to mail a welcome pack, a physical ticket or a gift separately. This setting lets you collect the address without unchecking ‘Virtual’ and triggering shipping cost calculation.
Disable ‘Hide shipping fields’ when:
- You have virtual bookings but still want to collect the customer’s shipping address at checkout, without the product becoming shippable for shipping costs or methods
- You want the shipping address fields to display regardless of cart contents
Enable ‘Hide shipping fields’ when:
- Your bookings are virtual and you never need a shipping address. This restores WooCommerce’s default behavior of hiding the shipping fields for virtual-only carts
Which settings should you use?
| Scenario | ‘Virtual’ checkbox | ‘Hide shipping fields’ |
|---|---|---|
| Pure service, no address needed | Checked | Enabled |
| Pure service, mailing address still needed | Checked | Disabled |
| Physical item or kit shipped with the booking, real shipping cost needed | Unchecked | Not applicable – the product is shippable and the address is collected normally |
What happens with mixed carts?
WooCommerce treats a cart as needing shipping as soon as any item in it is non-virtual. This applies if the cart contains both virtual and non-virtual bookings, or a virtual booking plus a shippable product.
In this case, the shipping address fields appear automatically, regardless of the ‘Hide shipping fields’ setting.
Does this work with the Blocks checkout?
Yes. The behavior is the same on both the classic (shortcode) checkout and the Blocks checkout, because the ‘Virtual’ checkbox drives WooCommerce’s native shipping logic directly.