Create product bundles for WooCommerce — fixed or auto-calculated pricing, automatic savings badges, stock sync, and a choice of product page layouts. Follow the guide below to get started with Free and Pro.
Codeholt Bundles for WooCommerce adds a native "Bundle" product type to your store. A bundle combines several products under one price, adds to cart as a single line item, and keeps its price and stock automatically in sync with the products inside it.
Bundles are built right on the standard WooCommerce product edit screen.
Set the pricing mode per bundle from the Bundled Products tab.
| Mode | Plan | Description |
|---|---|---|
| Auto calculate | FREE | The bundle price is the sum of its products' prices. Recalculates automatically whenever a bundled product's own price changes. |
| Fixed bundle price | FREE | Set one flat price for the whole bundle — the plugin shows an automatic "Save $X (Y%)" badge next to it. |
| Percentage discount | PRO | Take X% off the sum of current bundled-product prices — the regular price stays the full sum, so the savings badge reflects the real discount. |
| Discount scheduling | PRO | Optional start/end dates for Fixed or Percentage pricing, using WooCommerce's own native sale schedule — no custom cron involved. |
Choose how bundled items are listed on the product page — as a site-wide default from Settings, or overridden per bundle.
| Layout | Plan | Description |
|---|---|---|
| Table | FREE | Spreadsheet-style rows with image, name, price and quantity columns. |
| Compact | FREE | A condensed list, ideal for bundles with many items. |
| List | PRO | Vertical rows in a bordered container with a larger product image. |
| Grid | PRO | Responsive card tiles with the image on top and centered text. |
| Inline | PRO | Compact rounded chips — good for bundles with many small items. |
| Custom | PRO | Build your own from the Custom layout builder — columns, item style, image size and content toggles. |
A published bundle is already a normal product page. To feature it elsewhere on your site, use any of the three options below.
[cbfw_bundle id="123"]
Drop this into any post, page or widget area that supports shortcodes. Replace 123 with the bundle's product ID.
Search for the "Product Bundle" block in the block editor. Pick the bundle, layout and display options right from the block sidebar — no shortcode needed.
The "Product Bundle" widget appears under the WooCommerce category in Elementor, with its own style controls for use inside any Elementor layout.
Global defaults live under WooCommerce → Bundles → Settings.
| Field | Plan | Description |
|---|---|---|
| Product page layout | FREE | Site-wide default layout — any bundle can override it from its own edit screen. |
| Bundle card layout | FREE | Card or Wide — used by the shortcode, block and Elementor widget. |
| Included products heading | FREE | Custom heading text shown above the bundled products list on the product page. |
| Savings badge toggle | FREE | Show or hide the "Save X (Y%)" badge next to bundle prices. |
| Design (accent / savings / border colors, radius) | PRO | Light-touch styling applied via CSS variables, plus a Custom CSS field. |
| Custom layout builder | PRO | Columns, item style, image size and content toggles for the Custom layout. |
Actions and filters throughout pricing, layouts, admin tabs, import/export and settings — this is exactly what the Pro add-on itself is built on.
| Filter | Description |
|---|---|
cbfw_bundled_products | Resolved bundled items before they are used. |
cbfw_can_bundle_product | Whether a product may be bundled. |
cbfw_pricing_modes | Registered pricing mode slugs. Default array( 'auto', 'fixed' ). |
cbfw_custom_mode_prices | Supply regular/sale prices for a custom pricing mode. |
cbfw_product_layouts | Registered single-product layouts. |
cbfw_bundle_layout | Layout used for one specific bundle. |
cbfw_bundle_card_html | Rendered card markup (shortcode/block/widget). |
cbfw_show_savings_badge | Whether the savings badge is shown. |
cbfw_savings_badge_text | Badge text — must already be escaped. |
cbfw_inline_css | Extra CSS appended to the frontend stylesheet. |
cbfw_structured_data | Bundle structured data markup. |
cbfw_save_bundled_items | Sanitized items before they are saved. |
cbfw_save_settings | Settings before they are written to the database. |
cbfw_bundle_choices_limit | Max bundles listed in editor dropdowns. Default 200. |
cbfw_overview_days | Reporting period for the analytics overview. Default 30. |
cbfw_child_search_help | Help tip under the bundle builder's product search. |
| Action | Description |
|---|---|
cbfw_loaded | Fires once the plugin is fully loaded. |
cbfw_bundle_synced | After a bundle's price and stock are resynced. |
cbfw_order_line_item_created | After bundle meta is written to an order line item. |
cbfw_import_bundle | After a bundle is created from an import row, before prices resync. |
cbfw_before_bundled_items / cbfw_after_bundled_items | Around the included-products list on the product page. |
cbfw_pricing_fields | Extra fields in the product data pricing area. |
cbfw_after_builder_panel | After the Bundled Products panel. |
cbfw_settings_sections | Extra sections on the Settings tab. |
cbfw_layout_card_fields | Extra fields inside the Layout settings card. |
cbfw_overview_actions | Toolbar area of the analytics overview. |
cbfw_admin_tab_{$tab} | Renders the body of a custom admin tab. |
Every template file can be overridden from your theme, the standard WooCommerce way.
yourtheme/codeholt-bundles-for-woocommerce/
| Template | Used for |
|---|---|
templates/bundle-card.php | The card used by the shortcode, block and Elementor widget. |
templates/single-product/add-to-cart/bundle.php | The bundle area on the single product page. |
Copy the file into your theme keeping the same sub-folder structure, then edit your copy — the plugin's original stays untouched.
A paid add-on that installs alongside this free plugin and unlocks percentage discounts with scheduling, quantity rules, three extra product page layouts with a custom layout builder, a Custom CSS panel, advanced reports and automatic updates — all through the same license server.
Everything in Free is included in Pro, plus the rows below.
| Feature | Free | Pro |
|---|---|---|
| Unlimited bundles — Table & Compact layouts | ✓ | ✓ |
| Auto or fixed bundle pricing | ✓ | ✓ |
| Shortcode, Gutenberg block & Elementor widget | ✓ | ✓ |
| Savings badge, JSON import/export, sales overview | ✓ | ✓ |
| Bundle simple products and product variations | ✓ | ✓ |
| Percentage discount pricing + discount scheduling | — | ✓ |
| Min / max quantity rules per order | — | ✓ |
| Custom savings badge text + shop page badge | — | ✓ |
| List, Grid, Inline & Custom layout builder | — | ✓ |
| Custom CSS panel | — | ✓ |
| Advanced reports with date ranges + CSV export | — | ✓ |
| Automatic one-click plugin updates | — | ✓ |
| Priority support | — | ✓ |
Once Pro is active and licensed, these additions appear directly inside the existing free-plugin admin pages — no separate menu.
| Addition | Where |
|---|---|
| Discount (%) + schedule fields | Product edit screen → Bundled Products tab, next to the pricing mode. |
| Min / max quantity fields | Product edit screen → Bundled Products tab, own field group. |
| List, Grid, Inline layouts | Settings → Product page layout, and each bundle's own layout picker. |
| Custom layout builder | Settings → its own "Custom layout (Pro)" card. |
| Design card (accent / savings / border colors, radius) | Settings → "Design" card. |
| Custom CSS panel | Settings → bottom of the Design card. |
| Savings badge text template | Settings → bottom of the Layout card. |
| Period selector + CSV export | Overview tab toolbar (7/30/90/365 days). |
| Discount %, quantity rules, sale dates | Round-trip automatically in JSON/CSV import/export. |
| License tab | New tab, always last on the Bundles admin page. |
Pro activates against Codeholt's license server and then updates itself — no manual re-download needed.
Once licensed, the Pro plugin checks Codeholt's license server for new versions and delivers one-click updates straight from the regular WordPress Plugins screen — the same update experience as any WordPress.org plugin, with no separate download step.