Category: Articles

  • Complex WooCommerce Pricing Without Hundreds of Variations

    Complex WooCommerce Pricing Without Hundreds of Variations


    TL;DR

    • WooCommerce variations work for small, fixed sets (3 sizes × 2 colours = 6 rows). They fall apart when pricing is combinatorial (size × material × length) or continuous (any quantity, any dimension).
    • You end up entering — and maintaining — hundreds of rows by hand, and a customer who wants 137 units still can’t be priced, because variations can’t interpolate between your presets.
    • CraftForms replaces the grid with a price formula plus a price matrix (a lookup table). One rule prices every combination, including the ones you never typed in.
    • Two ready-made starter forms ship with it — WC: Pipe (formula pricing) and WC: Stickers (quantity × size tiers) — and you can edit the pricing table as a CSV in a spreadsheet.
    • The price updates live in the browser as the customer configures, and is recalculated on the server at submit, so the amount charged is always the server’s number.

    The features and starters in this guide are part of CraftForms Pro.


    The problem: variations don’t scale with complexity

    WooCommerce’s attribute-and-variation system is one of the best things about it — for the job it was designed to do. A T-shirt in three sizes and two colours is six variations. You set a price for each, attach an image, track stock, done. Clean.

    The trouble starts when your pricing has more than one or two dimensions, or when one of those dimensions is a number rather than a short list.

    Consider a sticker shop. You offer four sizes and let customers buy in tiers: 50, 100, 200, 300, 500, 1,000, 2,000, 3,000, 5,000, or 10,000 stickers. That’s already 4 × 10 = 40 variations for a single product — forty rows to create, price, and keep up to date. And it gets worse:

    • You can’t price the in-between. A customer wants 137 stickers. There’s no variation for 137. They either can’t order it, or you force them into a tier that doesn’t reflect what they’re buying.
    • Add a third dimension and it explodes. Offer two materials as well and you’re at 80 rows. A fourth finish option and you’re past 300. This is the “I have to manually add 640 price options for one product” situation people describe on the WooCommerce forums — and they’re not exaggerating.
    • Every price change is a chore. Raise prices 5% and you’re editing dozens of variation rows by hand, hoping you didn’t fat-finger one.

    The root issue is that variations store a finished answer for every possible question. If the questions are few and fixed, that’s fine. If they’re many, or open-ended, storing every answer is the wrong model. You want to store the rule instead.

    The fix: a formula and a lookup table

    CraftForms takes a different approach. Instead of attaching pricing to pre-built variations, you build the product as a small form on the product page and define how the price is calculated. There are three building blocks, all managed from the Smart Variables panel in the form editor:

    • Expression — a pricing formula written from the form’s field values, e.g. base * quantity or area * rate.
    • Price matrix — a lookup table keyed by one or two field values, with a choice of lookup strategies: Exact match, Closest up (largest ≤ value), or Closest (nearest).
    • Conditional variable — picks a value or another table depending on what the customer selected.

    The form’s final price comes from a Price Formula that ties these together. Let’s see it on the two real products that ship as starters.

    Tip: Both examples below are included as starter forms (one-click install) — WC: Pipe and WC: Stickers — so you can load one and inspect every formula rather than building from scratch.

    Walkthrough 1 — Pipe pricing from one formula (the “WC: Pipe” starter)

    A pipe’s price depends on three things: its diameter, its material, and its length in feet. Length is the giveaway that variations can’t handle this — length is continuous. Someone might order 2.3 feet, or 5.8.

    Here’s the entire pricing setup:

    1. Diameter is a dropdown. A price matrix maps each diameter to a base price — 3″ → 45.50, 4″ → 77.05, 5″ → 108.60, and so on. The result is a Smart Variable, diameter_price.
    2. Material is a set of radio buttons that resolves to a multiplier, material_coef — for example galvanised steel at ×1.0 and 304 stainless at ×1.7.
    3. Length is a number input the customer types directly (with a min, max, and step).

    The Price Formula is just:

    diameter_price * material_coef * length
    

    That single line prices every combination of diameter, material, and length — including the 2.3-foot order that no variation table would ever contain. There is nothing to maintain combinatorially: change a diameter’s base price in one table cell, or a material’s multiplier, and every order reprices instantly.

    As WooCommerce variations, this product is impossible to model properly. As a CraftForms form, it’s one table, one multiplier, and one line of arithmetic.

    Walkthrough 2 — Quantity-tier pricing done right (the “WC: Stickers” starter)

    This is the example that maps directly onto the “40-to-640 variations” pain, so it’s worth seeing in full.

    Cf stickers product starter

    The sticker product has two inputs: size (50×50, 75×75, 100×100, 125×125 mm) and quantity (the ten tiers above, plus a “Custom qty” option). Here’s how the pricing is built without a single variation:

    1. A unit-price matrix per size. Each size has a price matrix keyed on quantity, using the Closest up (largest ≤ value) strategy. For the 50×50 sticker, the unit price steps down as volume rises: 1.08 at 50 pieces, 0.65 at 100, 0.425 at 200, all the way down to 0.108 at 10,000.
    2. The “Closest up” strategy is what makes custom quantities work. Because the lookup picks the largest tier at or below the entered number, a customer who types 137 automatically lands on the 100-piece unit price — the correct tier — with no variation for 137 anywhere in sight. This is precisely the thing variations cannot do.
    3. A conditional variable picks the right table. unit_price_for_size selects the 50×50, 75×75, 100×100, or 125×125 matrix based on the chosen size.
    4. The final price is one expression: unit_price_for_size * quantity.

    That’s the whole engine. But the starter goes further to show what becomes easy once pricing is rule-based rather than row-based:

    • Live per-tier prices on the buttons. Each quantity option shows its total price and the volume discount versus the 50-piece rate — e.g. “1,000 · Discount 62%”. Those discounts are computed by Smart Variables, not typed in.
    • A running total in an Info block that updates the instant the customer changes size or quantity.
    • A custom-quantity branch. Choosing “Custom qty” reveals a number field (min 10, step 10) via conditional logic, and the total — plus a “you save X%” message — recalculates for whatever they enter.
    • An Add to Cart button that drops the configured sticker, at its calculated price, straight into the WooCommerce cart.

    To build the equivalent in stock WooCommerce you’d need 40 variations just for the fixed tiers, custom quantities would be impossible, and the per-tier discount labels wouldn’t exist at all.

    Editing prices stays sane: CSV import and export

    A fair objection: “Isn’t a big lookup table just as annoying to edit as a big variations list?”

    No — because the table isn’t a wall of WordPress UI rows. Every price matrix has Import CSV and Export CSV buttons. Export the table, open it in Excel or Google Sheets, edit prices the way you’d edit any spreadsheet, and re-import. Updating an entire price list becomes one paste instead of dozens of individual row edits.

    It also solves onboarding: if you already keep your pricing in a spreadsheet — and most businesses with this kind of pricing do — you can bring it straight in rather than retyping it into variation rows.

    It stays honest: server-side recalculation

    Live, in-browser pricing raises an obvious security question: if the price is calculated in JavaScript, can a customer tamper with it?

    They can’t change what they’re charged. The number shown as they configure is calculated in the browser for responsiveness, but when the form is submitted, CraftForms re-evaluates the formula on the server and uses that result for the cart and the order. Whatever the browser displayed, the server has the final say. Client-side price manipulation doesn’t reach checkout.

    When WooCommerce variations are still the right tool

    This isn’t an argument against variations — it’s about using each tool for the job it fits.

    Stick with native variations when:

    • You have a small, fixed set of combinations.
    • Each combination genuinely needs its own SKU, its own product image, and its own independently managed stock.

    Reach for a CraftForms formula when:

    • Pricing is formula-driven (per-unit, per-area, base + modifiers).
    • Pricing is tiered (volume discounts, quantity breaks).
    • A dimension is continuous (length, area, weight, custom quantity).
    • The variation count is heading into the dozens or hundreds.

    And if your worry about leaving variations is stock control, that’s covered too: CraftForms can track inventory per option-combination using a Dynamic SKU and a custom stock table — so you don’t have to choose between flexible pricing and real inventory.

    Getting started

    1. Install CraftForms Pro and enable the WooCommerce integration.
    2. Create a new form and load the WC: Stickers (or WC: Pipe) starter to see a complete, working setup.
    3. Open the Smart Variables panel to inspect the price matrices and the Price Formula.
    4. Swap in your own prices — by hand, or via Export CSV / Import CSV (available for smart variables type “table”).
    5. Connect the form to your WooCommerce product and let customers configure, price, and add to cart in one step.

    You’ll have replaced a sprawling variations grid — and everything it couldn’t do — with a handful of rules that price every combination, including the ones you never typed in.

  • How to Create an Online Order Form for Your Small Business (2026)

    How to Create an Online Order Form for Your Small Business (2026)

    If you’re still taking orders by phone, email, or a basic “contact us” form, you’re doing extra work every single time someone wants to buy from you. You have to reply, confirm details, quote a price, wait, chase payment — and none of it is recorded anywhere unless you write it down yourself.

    A proper online order form handles all of that automatically: it shows customers what they’re paying before they submit, collects card payment at the same time, and drops every order into your WordPress admin so nothing slips through. This guide walks you through building one from scratch using CraftForms — no WooCommerce, no page builder, no coding required.


    Why a Contact Form Isn’t Enough for Taking Orders

    A standard contact form sends you an email. That’s it. It has no concept of what the customer wants to buy, what it costs, or whether they’ve paid. Every submission kicks off a manual thread: you email back with a price, they reply to confirm, you send a payment link, they pay (maybe), you note it in a spreadsheet.

    That process works for three customers. It breaks at thirty.

    What a proper order form does differently:

    • Shows a live price as the customer configures their order, so they know what they’re committing to before they hit submit
    • Collects payment in the same step — no chasing invoices
    • Saves every order to your WordPress admin with the customer’s details, choices, and payment status
    • Sends a confirmation email automatically, so the customer has a record and you don’t have to reply manually

    The form you build in this guide does all four.


    What You’ll Need

    • WordPress with CraftForms installed (the free version covers the form builder; the Pro version adds pricing, payment, and order management)
    • A Stripe account — free to create at stripe.com; Stripe takes a small per-transaction fee but there’s no monthly cost
    • About 20–30 minutes for a simple form; longer if you have complex pricing
    Small business form
    Example of nice form for business

    Step 1 — Build the Order Form

    Go to CraftForms → Forms in your WordPress admin and click Add New. Give the form a name (you’ll see it in the forms list later) and you’ll land in the block editor with an empty form canvas.

    Adding the right fields

    A typical product order form needs:

    Customer details Add a Text Input Field for the customer’s name, another for their email address (set the input type to “Email” in the block settings), and optionally a phone number field.

    What they’re ordering This is where order forms differ from contact forms. Instead of a plain text box, use structured fields:

    • Select Field for a straightforward product list (a dropdown the customer picks from)
    • Radio Field if you want the options laid out as clickable cards — especially useful when you have 3–6 distinct products or service tiers

    For either field, you can attach a price to each option. When you edit the options list in the block sidebar, each option has a label, a value, and a price field. The price you enter here flows into your pricing formula later.

    Quantity Add a Text Input Field and set the input type to “Number”. Give it the field name quantity — you’ll reference this in the pricing formula.

    Notes or special instructions A Textarea Field covers any free-text requirements: dimensions, delivery notes, custom messages, etc.

    File upload (optional) If your customers need to send artwork, a logo, or technical drawings, add a File Upload Field. You can restrict it to specific file types (PDF, PNG, AI, etc.) in the block settings.

    Using swatches for product variants

    If your product comes in colours or materials, plain dropdown text doesn’t do it justice. Radio Fields and Checkboxes Fields both support image swatches and colour swatches — switch the display mode in the block sidebar under “Option Style”.

    With image swatches, each option shows a small thumbnail. With colour swatches, each option shows a filled circle or square. Either way, the customer clicks a swatch to select it, which feels much more like shopping than filling in a form.

    Editor swatches
    Example of Roller Blinds product form

    Step 2 — Add a Live Price Calculation

    This is what separates a configurator from a contact form. CraftForms calculates the order total from your field values and shows it live on the form as the customer makes selections.

    Bridging option prices into your formula with Linked variables

    Smart variable rubber
    Example of Rubber option pricing setup

    In Step 1 you attached a price to each option in your Radio or Select field. To use those prices in a formula, you first need to surface them as a Smart Variable.

    Open the Smart Variables panel and click Manage Smart Variables. Create a new variable, set the type to Linked, and point it at your product field with the lookup set to price. Give the variable a name — say, product_price. CraftForms will now automatically hold the price of whichever option the customer selects in that variable.

    Writing a pricing formula

    In the form editor, look for the Pricing panel in the right-hand sidebar (you may need to click into the form root block to see it). Enter either a fixed number (e.g. 29.99) or a formula that references your field names and Smart Variable names.

    With the Linked variable in place, a simple quantity × unit price formula looks like this:

    quantity * product_price
    

    Where quantity is the name of your number field and product_price is the Linked Smart Variable you created above.

    The server recalculates this formula when the form is submitted — meaning customers cannot tamper with the price in the browser. What they see is always what gets charged.

    More complex pricing with Expression variables

    For anything beyond a single multiplication — tiered pricing, add-on fees, bundle discounts — create an Expression variable in Smart Variables (custom formulas with access to functions like round(), min(), max(), and ceil()). If you have a “rush” field whose selected option carries a price, create a second Linked variable rush_fee for it the same way, then combine them:

    round((quantity * product_price) + rush_fee, 2)
    

    For pricing that depends on two dimensions — such as width and height, or distance and weight — use a Table variable. You define rows and columns, populate the cells with prices, and CraftForms does the lookup automatically. You can type the values in manually or import them from a CSV if you already have a price sheet.

    If your business sells custom-sized products where the price changes based on dimensions, the Table variable is the right tool. For a detailed real-world walkthrough, see the roller blinds product configurator tutorial — it builds a complete two-variable pricing setup from scratch.

    Displaying the price on the form

    Once your formula is set, add an InfoBlock anywhere in the form (it’s a standard block you can insert from the block inserter). Inside the InfoBlock, type something like:

    Your total: {{form.price}} {{form.currency}}
    

    The {{form.price}} tag is replaced with the calculated total, and {{form.currency}} shows the currency symbol. The InfoBlock updates in real time as the customer fills in or changes any field — no page reload required.


    Step 3 — Connect Stripe and Take Payment

    Go to CraftForms → Payment Settings in your WordPress admin. This is where you wire up Stripe.

    Connecting your Stripe account

    You’ll need two keys from your Stripe dashboard — the Publishable Key (starts with pk_) and the Secret Key (starts with sk_). Stripe provides both test and live versions; paste the test keys first so you can run through a payment without charging anyone.

    In Payment Settings, set the mode to “Test”, enter your test publishable and secret keys, and save. While you’re there, set your currency (18 options available, including USD, EUR, GBP, and CAD) and fill in the success URL — the page you want customers to land on after a successful payment.

    You’ll also need to configure a webhook in your Stripe dashboard. CraftForms shows you the exact webhook URL to use (it looks like yoursite.com/wp-json/craftforms/v1/stripe/webhook). The webhook tells CraftForms when a payment has been confirmed, which is what updates the order status from “pending” to “paid”.

    Enabling payment on the form

    Back in the form editor, add the CraftForms Payment block to your form from the block inserter — place it near the bottom, just before the submit button. Adding this block is what activates the payment flow for the form; without it, the form submits as normal without charging anyone.

    Going live

    When you’re ready to accept real payments, return to CraftForms → Payment Settings, switch the mode to “Live”, and replace the test keys with your live keys. Everything else stays the same.

    Payment settings
    CraftForms pricing settings

    Step 4 — Set Up a Confirmation Email

    After a successful order, the customer should receive an email summarising what they ordered and what they paid. Go to the form’s action settings and add an email action — set the recipient to {{email}} (or whatever you named your email field) and write the body.

    You can reference any field value with {{field_name}} and include the order total with {{email.price}}. For a branded email with a header image, logo, and styled layout, create an Email Template under CraftForms → Email Templates and select it in the email action.


    Managing Orders in the WordPress Admin

    Every paid order appears in CraftForms → Orders. The orders list shows the customer name, form, order total, payment status, and submission date. Clicking an order opens the full detail: every field value the customer submitted, the Stripe payment reference, and the current order status.

    Order statuses follow a simple flow: pending → confirmed → paid → refunded. You can update the status manually if needed (for example, marking a cash order as confirmed), or statuses update automatically via the Stripe webhook.


    What Else Can You Build With This?

    An order form is one pattern. If your business sells time — hotel nights, rental periods, event slots, or appointments — you need availability management on top of what’s covered here: a date picker that blocks out already-booked dates and prevents double bookings. That’s a different setup, and we’ve written a complete guide for it: How to Build a B&B Booking Form with Availability and Orders.


    Summary

    Here’s what you’ve built:

    1. A structured order form with the right field types for your product or service
    2. A live price calculation that updates as the customer configures their order — using a simple formula or a Smart Variables Table for more complex pricing
    3. A Stripe payment step that charges the customer at the same time they submit
    4. Automatic confirmation emails with the order details
    5. An order list in your WordPress admin where you can track every order and its payment status

    The whole thing runs inside WordPress, no third-party platform required, and you keep 100% of the order data.