Deskripzioa
Flexa Extra lets you attach extra option fields to WooCommerce products so shoppers can personalize what they buy and you can charge for it. Build an Option Set once, assign it to products (all, a hand-picked list, or by category/tag/price/stock conditions), and the fields appear on the product page with live price updates.
Every price is recomputed on the server from your saved field definitions when the product is added to the cart (a client-submitted price is never trusted), so the amount a shopper pays always matches what you configured.
📌 DEMO
Field types (free)
- Text and textarea, with email, URL, phone or custom-regex validation
- Number and range slider (min/max/step)
- Date picker, time picker, date & time picker, and colour picker
- Checkbox, radio, dropdown
- Colour/image swatches
- Button group
- Heading / description block
- Minimum and maximum number of choices on any multi-select field
Pricing
- Per-field or per-option surcharge
- Fixed amount, a percentage of the product price, or a safe arithmetic formula
- Formula prices use
base,qtyand other fields’ values with+ - * / ( )andround(),min(),max()(noeval), for per-unit and volume-tiered pricing - Conditional fees and discounts applied to the item when selections match a rule
Inventory
- Optional stock limit per choice option: sold-out options are disabled, over-selling is blocked at add-to-cart, and paid orders draw the stock down (restored on cancel or refund)
Templates
- Start from a template: pick a ready-made starter (gift wrapping, engraving, size & colour, installation service, warranty plan, product add-ons) and it creates an option set, switched off, that you can edit before turning it on
Assignment & logic
- Target all products, a manual list, or conditions (category, tag, product, price, stock)
- Conditional logic to show/hide fields based on other selections
- Duplicate an option set, and import or export sets as a JSON file
- Live preview in the builder: see the option set render (and price) exactly as the storefront will, updating as you edit
Store insights
- Analytics screen ranking which options and choices sell, and the add-on revenue they bring, filterable by date range and order status
Variation swatches
- Turn WooCommerce variation attribute dropdowns into colour, image or button swatches on variable products, with its own admin screen to assign a colour or image to each attribute term (no extra plugin required)
- The native variation
<select>stays in place (hidden) and remains the source of truth: clicking a swatch drives WooCommerce’s own variation logic, so price, stock and gallery image update exactly as before, unavailable combinations are dimmed, and keyboard selection works - Size, shape, custom width/height, button font size, selected-ring and unavailable-strike colours, and an optional hover tooltip, all from the Style settings
- Show the selected value as an “Attribute: Value” line, render attributes with no swatch type as buttons, and show a loading spinner while the variation updates
- Choose how unavailable or out-of-stock swatches behave (dim and strike, hide, or show as normal), and optionally clear the choice by clicking the selected swatch again
- Limit how many swatches show per attribute with a “+N more” toggle, and show per-swatch stock (“N left” on low stock, “Out of stock” when a combination is sold out)
- Show swatches in the shop and category loop too: each links to the product with that option preselected
- Only applies to global attributes (
pa_*) that have terms; custom product-level attributes have no term to attach a colour/image to. If a dedicated plugin like Woo Variation Swatches is active, Flexa Extra steps aside automatically to avoid double rendering
Product badges
- Show targeted badges on product thumbnails, in the shop and category loop and on the single product page: give each a label, background and text colour, a corner (top-left, top-right, bottom-left, bottom-right) and a priority
- Target the same way pricing rules do: all products, a manual list (searched with an async product/category/tag picker), or by brand, attribute or price range
- Dynamic targets that read live product state: on sale, new (published recently), featured, low stock and out of stock, each of which can be inverted
- Badges stack per corner in priority order, and the whole module has an on/off switch. It sits on the product image, separate from the pricing sale flash, so both can show at once
Headless & integrations
- Gutenberg “Flexa Extra Configurator” block to show an option set with live pricing on any page or post (display only, does not add to cart)
- Public read-only REST API for decoupled/headless storefronts: fetch a product’s option sets, prices, and logic to render the same configurator and subtotal elsewhere. Open by default, closable with a filter
Cart
- Edit a line’s options straight from the cart: the product page reopens with the
saved selections filled in, and re-adding replaces the line instead of stacking a
duplicate
Display & accessibility
- Position fields before or after the add-to-cart button
- Live “extra subtotal” and “total price” readouts
- Itemized price breakdown: each selected option and conditional fee/discount listed with its own price, updating live
- Swatch size/shape and button colour styling
- Accessible markup (fieldset/legend groups,
aria-required, keyboard focus), responsive, and reduced-motion aware
Source code for compiled JavaScript and CSS
The admin app ships as a compiled bundle in assets/dist/admin/. The
human-readable TypeScript source and its build config live in the public
repository at https://github.com/flexatech/flexa-extra (under apps/admin/)
and are built with pnpm + Vite:
cd apps/adminpnpm installpnpm build(orpnpm devfor a watched dev build)
The storefront assets in assets/frontend/ are plain, unminified JS/CSS and need
no build step.
External services
Storefront and configuration data (option sets, prices, orders, stock) stays in your own WordPress database. The plugin connects to one external service, and only in the admin, for the reason below.
Deactivation feedback (Flexa Product Intelligence)
When you go to deactivate Flexa Extra on the Plugins screen, a short optional survey asks why. This is served by Flexa’s product intelligence service at https://product-intelligence.flexacommerce.com. It runs only on wp-admin/plugins.php, never on the front end, and it never blocks or delays deactivation: if the service is unreachable, the plugin still deactivates normally.
What is sent, and when:
- On opening the Plugins screen: a request to
/api/v1/config(the product slug and tier) to load the survey configuration. The response is cached for 6 hours. - When you deactivate or interact with the survey: the deactivation reason you pick and any optional message you type, sent to
/api/v1/deactivations,/api/v1/events,/api/v1/feedback,/api/v1/feature-requestsand/api/v1/recovery-events.
Every request includes an anonymous per-site identifier (a random UUID generated on your site), the plugin version and tier, and by default your WordPress version, PHP version and locale. No email address, site domain, user identity or raw IP is collected by the plugin. The environment details (WordPress/PHP/locale) can be turned off, and the whole survey can be disabled, with the filters below.
- Turn the survey off entirely:
add_filter( 'flexa_extra/deactivation_survey/enabled', '__return_false' ); - Send only the anonymous identifier, version and tier (no WP/PHP/locale):
add_filter( 'flexa_extra/deactivation_survey/config', function ( $c ) { $c['collect_environment'] = false; return $c; } );
Service terms and privacy policy: https://flexacommerce.com/pages/terms and https://flexacommerce.com/pages/privacy
Pantaila-argazkiak

















Blokeak
Plugin honek 5 blokeak eskaintzen ditu.
- Flexa Discount Badge Show the discount badge for a product.
- Flexa Pricing Table Show the quantity/tier discount table for a product.
- Flexa Extra – Options configurator Show an interactive option-set configurator with live price on any page. Display only: selections are not added to the cart.
- Flexa Pricing Nudge Show the cart progress nudge toward the next discount.
- Flexa Pricing Countdown Show a countdown to a pricing rule's end time.
Instalazioa
- Upload the plugin to
/wp-content/plugins/flexa-extraor install it through the Plugins screen. - Activate it. WooCommerce must be active.
- On activation a short quick-start guide points you at the template gallery so you can build your first Option Set in a couple of minutes. It is skippable, and you can replay it later from Advanced settings.
- Open Flexa Extra in the admin menu to configure settings and build Option Sets.
MEG
-
Does it require WooCommerce?
-
Yes. Flexa Extra stays inactive (with an admin notice) until WooCommerce is active.
-
Can a customer tamper with the surcharge?
-
No. The extra price is recomputed server-side from your stored option definitions on add-to-cart and on every cart totals pass; the posted values are sanitized against the field schema.
-
Is it compatible with High-Performance Order Storage (HPOS)?
-
Yes. The plugin declares HPOS compatibility.
-
Can developers extend it?
-
Yes, see
docs/HOOKS.mdfor the available actions and filters. -
Can I style individual fields with my own CSS?
-
Yes. Each field is wrapped in a
<div>with class hooks:flexa-extra-fieldon every wrapper,flexa-extra-field--<type>for all fields of a type, andflexa-extra-field--id-<field_id>for one specific field (plusdata-field-idanddata-field-typeattributes). You can also add your own class per field in the builder: select the field and fill the “CSS class” box in the Inspector. Seedocs/HOOKS.mdfor examples. -
Can I import from another options plugin?
-
Yes. The Import screen reads option sets from YayExtra, ThemeHigh “Extra Product Options” (free), WooCommerce Product Add-Ons, Acowebs “Custom Product Addons for WooCommerce”, and YITH WooCommerce Product Add-Ons (free), and re-creates them in Flexa Extra, switched off. They appear in the Option Sets list for review; the storefront ignores them until you turn each one on. Field types, per-option prices, swatches and product assignment are mapped where an equivalent exists; anything that cannot be mapped 1:1 is listed per set so you can re-create it. Keep the source plugin active during the import so its data is readable.
-
Can I use it with a headless or decoupled front end?
-
Yes. Two open, read-only REST routes (
/wp-json/flexa-extra/v1/public/configand/public/product/{id}) return the option sets, prices, and logic a front end needs to render the configurator and compute the live subtotal. They expose only what the on-page configurator already ships, and you can close the API with theflexa_extra/public_api/enabledfilter. Add-to-cart and the final price are always recomputed server-side. -
How do the variation swatches work, and what are the limits?
-
On a variable product, Flexa Extra can replace each attribute dropdown with colour, image or button swatches. It hides the native
<select>but keeps it as the source of truth, so clicking a swatch uses WooCommerce’s own variation logic for price, stock and the product gallery. Assign colours/images per attribute term under Flexa Extra Variation Swatches. It works only with global attributes (pa_*) that have terms; custom product-level attributes have no term to attach to. If a dedicated swatches plugin (for example Woo Variation Swatches) is active, Flexa Extra defers to it automatically to avoid rendering swatches twice.
Berrikuspenak
Ez dago berrikuspenik plugin honentzat.
Laguntzaileak eta Garatzaileak
“Flexa Extra – Product Options, Variation Swatches & Pricing for WooCommerce” software librea da. Ondoko pertsonek egin dizkiote ekarpenak plugin honi.
LaguntzaileakGarapena interesatzen zaizu?
Araka kodea, begiratu SVN biltegia edo harpidetu garapen erregistrora RSS bidez.
Aldaketen loga
1.10.5
- Fix: the deactivation feedback survey no longer opens more than one “Before you go” dialog. With several Flexa plugins active at once, each bundled its own copy of the survey script and every copy added a handler to the Deactivate link, so the dialog stacked and needed one click to dismiss each copy. Each Deactivate link now opens a single dialog.
1.10.4
- Product Badges screen has a single sticky action bar at the bottom instead of duplicating Add badge and Save badges at the top and bottom. The bar stays in view while you scroll, and holds Add badge, Save badges and the Expand all / Collapse all switch.
1.10.3
- Variation swatches are easier to set up. After you create a global attribute or its terms on WooCommerce’s own screens, a banner there now links straight back to the Flexa swatches manager, so you no longer have to hunt for the menu. Each attribute card also links to its exact term editor, and a short summary shows how many terms still need a color or image.
- Each attribute now collapses to a one-line header on the swatches screen, so a store with many attributes stays compact. Click a card to slide it open, or use Expand all / Collapse all.
1.10.2
- Product badges now appear on block-based shop grids and single product pages. A render_block filter mirrors the classic loop and gallery hooks for the woocommerce/product-image and woocommerce/product-image-gallery blocks, so badges show on the WooCommerce Product Collection block and block themes, not just classic PHP templates.
1.10.1
- Product Badges screen is easier to manage with many badges: each badge card now collapses to a one-line summary (label, position, on/off) and slides open when you click it. Existing badges start collapsed; a badge you just added opens ready to edit.
- Add badge and Save badges are now available in a toolbar at the top of the list, not only at the bottom, so you no longer have to scroll to save. Add badge at the top inserts the new badge at the top; the bottom button still appends.
- Added an Expand all / Collapse all switch for the whole list.
1.10.0
- New option field types: a range slider (with min/max/step and a live value), a time picker, and a combined date & time picker. All three carry an optional field price and can drive formula prices.
- Text fields gain a Phone format that shows the phone keypad on mobile and marks the input as a telephone number.
- Time, date & time, and range fields support minimum and maximum bounds, checked again on the server at add-to-cart so a hand-crafted request cannot slip past the limits.
1.9.0
- Product badges can now be scheduled: give a badge an optional start and end time and it only shows within that window. Leave a bound empty to leave that end open.
- Product badges can be limited to specific customers: match by user role (is / is not one of the roles you pick) and by login state (logged-in customers or guests), combined with any/all. A badge with no conditions shows to everyone, as before.
- Badge style presets: pick a shape (rounded, pill, square) and a size (small, medium, large) per badge. Existing badges keep their current look.
- New corner ribbon badge shape: a diagonal band across the badge’s corner instead of a chip, available in any of the four corners.
- The Product Badges screen now has its own header, and every add-on screen shows a loading placeholder while it opens instead of a blank page.
- Fixed: on the single product page badges now sit on the product image in every corner. A right or bottom badge (such as the corner ribbon) previously drifted to the edge of the summary column.
- Fixed: a pricing rule can no longer be saved with its end date before its start date, a window that would never apply.
- Fixed: the product and term search dropdowns in the rule and badge editors are no longer clipped by the card edge.
1.8.0
- Badge targeting now searches for products, categories and tags with an async picker (selected entries show as removable chips) instead of typed comma-separated IDs. The same picker is used on the Option Sets assignment screen, and the lookup route is paginated with a “Load more” row. Existing badges keep working with no migration. Brands and attributes still use the manual ID field.
- Four more badge targets that read live product state: new (published in the last 30 days, adjustable with the flexa_extra/badges/new_days filter), featured, low stock and out of stock, on top of the existing “on sale” target. Each can be inverted.
- Fixed: “Add badge” failed with a JavaScript error on sites served over plain HTTP (a non-secure context), because new badge IDs relied on crypto.randomUUID(), which the browser only exposes over HTTPS or localhost. New IDs now use a context-independent generator, so the button works everywhere.
1.7.0
- New Product Badges add-on: a feature under the Flexa menu (and a card on the Flexa home screen) that shows targeted badges on product thumbnails in the shop loop and on the single product page. Give each badge a label, background and text colour, a corner and a priority. Target them the same way pricing rules do (all products, a manual list, or by product, category, tag, brand, attribute or price range) plus an “on sale” target. Badges stack per corner in priority order.
- The Product Badges add-on has an on/off switch in its Settings. Turn it off and no storefront hooks, overlay markup or CSS are added. The badge sits on the product image, separate from the pricing sale flash, so both can show at once.
1.6.0
- New Pricing add-on: a third feature under the Flexa menu (and a card on the Flexa home screen) that adds dynamic pricing and discount rules to WooCommerce, bulk and tiered pricing, BOGO / buy X get Y, bundles, cart discounts and checkout fees, with conditions (cart totals, quantity, user role, country and more), sale badges, strike-through prices, a quantity discount table, a spend-more nudge and a countdown timer. Prices are recomputed on the server so a client-submitted amount is never trusted.
- The Pricing add-on has an on/off switch in its Settings. Turn it off to leave every WooCommerce price hook untouched so another pricing plugin can take over cleanly.
- Requires PHP 8.1 or newer (the pricing engine uses PHP 8.1 language features).
1.5.0
- Deactivation feedback: when you deactivate Flexa Extra, a short optional survey on the Plugins screen asks why, so we can prioritise fixes and the features people miss. It never blocks or delays deactivation, sends only anonymous data (a random per-site id, plus WordPress/PHP version and locale unless you turn that off), and can be switched off entirely with a filter. See the “External services” section for exactly what is sent and how to disable it.
1.4.3
- Swatch analytics: a new Analytics tab under Variation Swatches shows which attribute values shoppers actually buy, with the times bought and revenue for each, and the swatch colour or image next to it. It reads your existing orders, so no extra tracking is added and past orders count too.
- Added two screenshots covering the Variation Swatches admin screen and swatches on the product page.
1.4.2
- Variation Swatches settings now use the same left-hand tab layout as the Product Options settings screen: General, Display, Appearance, Availability and Shop pages, instead of one long scrolling column. No settings or behaviour changed.
1.4.1
- Packaging: the distributed plugin now contains only the compiled admin bundle. The TypeScript build source is published in the public GitHub repository instead of being bundled in the download, so the zip is smaller. No functional changes.
1.4.0
- Variation swatches: turn WooCommerce variation attribute dropdowns into colour, image or button swatches on variable products, with a new Variation Swatches admin screen to assign a colour or image to each attribute term. The native
<select>stays as the source of truth, so price, stock and gallery image update through WooCommerce’s own logic; unavailable combinations are dimmed and keyboard selection works. Works with global attributes (pa_*) that have terms; if a dedicated swatches plugin like Woo Variation Swatches is active, Flexa Extra defers to it automatically. - Swatch display options: show the selected value as an “Attribute: Value” line, render attributes with no swatch type as buttons, and show a loading spinner while the variation updates.
- Swatch appearance: custom width, height and button font size, plus selected-ring and unavailable-strike colours and a choice of registered image size for image swatches, on top of the existing size, shape and tooltip options.
- Swatch availability: choose how unavailable or out-of-stock swatches behave (dim and strike, hide, or show as normal), and optionally clear the choice by clicking the selected swatch again.
- Limit visible swatches: cap how many swatches show per attribute and fold the rest behind a “+N more” toggle (the selected swatch always stays visible).
- Stock per swatch: show “N left” on low-stock swatches and “Out of stock” when every matching variation is sold out, read from WooCommerce’s own variation data.
- Shop and category swatches: optionally render swatches under products in the loop, each linking to the product with that option preselected.
- Flexa hub: the Flexa menu landing page lists only the modules that ship in this plugin for now (Product Options and Variation Swatches). The wider flexatech ecosystem is kept hidden (behind a filter) until more modules are ready; when shown, not-installed modules are dimmed so the active ones stand out.
1.3.0
- Import from more plugins: the Import screen now also reads option sets from WooCommerce Product Add-Ons, Acowebs “Custom Product Addons for WooCommerce”, and YITH WooCommerce Product Add-Ons (free), alongside the existing YayExtra and ThemeHigh sources. Field types, per-option prices (fixed, percentage, and increase/decrease), swatches and product/category assignment are mapped where an equivalent exists; anything that cannot be mapped 1:1 is listed per set. As before, imported sets are added switched off for you to review before turning them on.
1.2.1
- Import screen: only lists plugins that actually have option sets to import (present on the site, with at least one set), instead of always showing every supported plugin with an empty row.
1.2.0
- Formula prices: a price can be a safe arithmetic formula (on field prices, per-option prices and fee/discount rules) using
base,qtyand other fields’ values, the operators+ - * / ( ), andround(),min(),max(). The result is the per-unit surcharge, soqtyis for volume tiers likemax(2, 10 - qty)rather than a plain per-unit charge. Evaluated with a hand-written parser (nevereval); a bad formula is worth 0 and never errors. The builder validates as you type. - Custom controls: checkboxes and radios now use clean custom-styled controls (with a subtle checked animation) instead of the raw browser widget, so they look consistent across browsers and themes. The colour field shows a swatch with its hex value and opens the colour picker on click. Selected values, validation, keyboard focus and form behaviour are unchanged, and the styling is scoped so it will not clash with your theme.
- Date picker: the date field now opens a lightweight, localized calendar (month names, weekday order and first day of week follow your site language) instead of the raw browser control. Works with keyboard and touch, and the calendar styling is scoped so it will not clash with your theme.
- Date field options: set an earliest and latest selectable date and a list of blocked dates. These are validated again on the server at add-to-cart. The stored value format (YYYY-MM-DD) is unchanged.
- Date display format: chosen dates now show in your site’s date format (Settings, General) on the product page and in the cart/order, with an optional per-field override. Previously the cart showed the raw YYYY-MM-DD value.
- Per-field styling hooks: every field wrapper now carries
flexa-extra-field--<type>andflexa-extra-field--id-<field_id>classes so you can target a field type or one specific field from CSS. - New “CSS class” box in the field Inspector to add your own class(es) to a field wrapper.
1.1.1
- Fixed: YayExtra import brought nothing over. Field types (and per-option names) are stored by YayExtra as
{ value, label }pairs, not the flatfieldTypekey the converter expected, so every field was skipped and each set dropped as empty. The real saved shape is now read, with the older flat form still accepted. - Fixed: conditional product assignment is now migrated from YayExtra instead of falling back to “all products”. Category and tag names are resolved to term IDs and each “is one of” list becomes one targeting rule per term; anything that cannot be mapped is reported per set.
- Fixed: plain button fields no longer import as colour swatches. Colour and image are now carried only for swatch field types, per option according to its swatch type.
1.1.0
- Import option sets from YayExtra and ThemeHigh “Extra Product Options” (free): auto-detected, added switched off through the schema sanitizer, with a per-set report of anything that could not be mapped 1:1.
- Headless read API: two open, read-only REST routes (
/public/configand/public/product/{id}) so a decoupled front end can render the configurator and compute the subtotal. Closable with theflexa_extra/public_api/enabledfilter. - Sales analytics screen: rank options/choices by picks and add-on revenue, filterable by date range and order status (HPOS-safe).
- Gutenberg “Flexa Extra Configurator” block: show an option set with live pricing on any page or post (display only).
- Live preview in the builder: render and price an option set as the storefront will, updating as you edit.
- Conditional fees and discounts: set-level rules that add a fixed or percentage fee or discount when selections match (a discount never drops the line below zero).
- Per-option stock: give a choice a limited quantity; sold-out options are disabled, over-selling is blocked, and paid orders draw stock down (restored on cancel or refund).
- Min and max choices per multi-select field, enforced again on the server at add-to-cart.
- Edit options in cart: reopen the product page with the saved selections and replace the line instead of stacking a duplicate.
- Template library: start a new option set from a ready-made starter.
- Itemized price breakdown on the product page, listing each option and fee or discount with its own price.
- First-run quick-start guide, replayable from Advanced settings.
- Date picker and colour picker field types.
- Duplicate an option set, and import or export sets as JSON.
- Fixed: admin dropdown arrows no longer crowd the text.
1.0.1
- Security: escape swatch image URLs for the CSS
url()context on the product page and in the cart, preventing CSS injection through crafted URLs. - Removed the “Tested up to” line from the main plugin file so compatibility is declared only in readme.txt.
1.0.0
- Initial release: option-set builder with text, number, date picker, colour picker, choice, swatch and button fields; storefront render engine; server-authoritative pricing/cart engine; UX & style settings; and a two-tier automated test suite.
