Product Table for Gravity Forms
Turn Gravity Forms product fields into a clean, professional order table
Version 2.91. Getting Started
What it does
Product Table converts your Gravity Forms product fields from the default stacked layout into a clean order table with images, descriptions, inline options, and quantity controls. It is a presentation layer: Gravity Forms still handles all pricing, validation, payments, and entries.
Requirements
- WordPress 5.8 or higher
- Gravity Forms 2.5 or higher (2.7 or later recommended)
- PHP 7.4 or higher
Installation
Upload the plugin
Go to Plugins, Add New, Upload Plugin and select the gf-product-table.zip file.
Activate
Click Activate Plugin once installation completes.
Configure your form
Open any form with product fields and enable the table in the Product Table panel. See the Setup Guide below.
2. Setup Guide
Open the form editor
Go to Forms, choose your form, and click Edit.
Open the Product Table panel
In the form editor sidebar, open the Product Table panel.
Enable the table
Tick Enable Product Table for this form.
Choose which products appear
Tick each product field you want in the table. Any linked Option and Quantity fields are pulled into the row automatically and hidden from the form.
Save the form
Click Update.
Per-product settings
Click any product field in the form editor and open its Product Table settings to configure:
| Setting | What it does |
|---|---|
| Display in Product Table | Includes this product as a row in the table |
| Product Image | Choose from the media library or paste a URL |
| Description | Short line shown under the product name |
| Table Group | Groups this product into a named sub-table |
| Default Quantity | Starting quantity when the form loads |
| Minimum Quantity | Lowest quantity a customer can order |
| Maximum Quantity | Highest quantity a customer can order |
Images display at 60 by 60 pixels by default, adjustable under Forms, Product Table. Square images (1:1) give the best result.
3. Table Groups
Table Groups let you split products across several tables on the same form, each with its own heading. Useful when a form covers more than one category.
How to use them
- Click a product field in the form editor
- Open the Product Table settings for that field
- Enter a name in Table Group, for example “T-Shirts”
- Give every product in that category the same group name
Products sharing a group name render together under that heading. Products with no group name appear in an untitled table.
Each group only shows an Options column if at least one product in that group has options, so tables stay tidy when only some categories have variants.
4. Quantity Rules
Each product can have its own quantity limits, set in that field’s Product Table settings.
| Setting | Behaviour |
|---|---|
| Default Quantity | Quantity shown when the form loads. Use 0 for optional items. |
| Minimum Quantity | The minus button stops here, and submissions below it are rejected. |
| Maximum Quantity | The plus button stops here, and submissions above it are rejected. |
There is also a form-level Require At Least One Item option in the Product Table panel. With it enabled, a submission with every quantity at zero fails validation with a message rather than creating an empty order.
Quantity limits are checked on submit, not only in the browser, so they cannot be bypassed by editing the page.
5. Quote Mode
Quote Mode turns an order form into a quote request form with one switch, found in the Product Table panel.
With it enabled, the table hides the Price column, the Subtotal column, and the Products Total, and the pricing summary is left out of notification emails. Customers select products and quantities without seeing prices, and you follow up with a quote.
If you want finer control, the same panel lets you hide the price, subtotal, total, and email pricing individually.
6. Customization
Global settings
Go to Forms, Product Table for settings that apply to every form:
| Setting | Default | Description |
|---|---|---|
| Primary Color | #6366f1 | Quantity button colour |
| Success Color | #22c55e | Accent colour |
| Button Radius | 6 | Corner roundness in pixels |
| Checkout Text | Checkout | Table checkout button label |
| Show Images | On | Show or hide the image column |
| Show Descriptions | On | Show or hide product descriptions |
| Image Size | 60 | Image dimensions in pixels |
| Mobile Breakpoint | 768 | Width at which the table becomes cards |
| Hide Native Total | On | Hides the standard Gravity Forms total field |
| Hide Native Submit | Off | Hides the form submit button when using the table checkout button |
Per-form settings
The Product Table panel in the form editor overrides the global values for a single form, and adds custom column labels:
| Label setting | Default | Example |
|---|---|---|
| Product Column | Product | Item, Service, Package |
| Options Column | Options | Size, Variant, Selection |
| Price Column | Price | Unit Price, Cost |
| Qty Column | Qty | Quantity, Amount |
| Subtotal Column | Subtotal | Line Total, Amount |
| Products Total | Products Total: | Order Total:, Items Total: |
Compact mode
For forms with a long product list, add the CSS class gfpt-compact to your form under Form Settings, Appearance, CSS Class Name. This reduces row padding and font sizes for a denser, spreadsheet-style layout.
Custom CSS
The table uses stable class names, so your own CSS will survive updates:
| Class | Element |
|---|---|
.gfpt-wrapper | Outer container for all tables |
.gfpt-table | An individual table |
.gfpt-group-heading | Table group heading |
.gfpt-row | A product row |
.gfpt-cell-product | Product name cell |
.gfpt-product-name | Product name text |
.gfpt-product-desc | Product description text |
.gfpt-qty-input | Quantity input |
.gfpt-grand-total | Products total figure |
For example, to cap the width of a long options dropdown:
.gfpt-option-select {
max-width: 200px;
}
7. Payment Gateway Setup
This is the single most common cause of wrong charges. Your payment feed must charge the Form Total, not a specific product field.
Stripe
Open the feed
Go to Form Settings, Stripe.
Transaction type
Choose Products and Services.
Payment amount
Set it to Form Total, not an individual product field.
Save
Click Save Settings.
Other gateways
The same rule applies to PayPal, Square, Authorize.Net, and any third-party gateway add-on built on the Gravity Forms Add-On Framework. Set the payment amount to Form Total and the table’s products are included automatically.
Why it matters
The table syncs quantities and options to Gravity Forms’ own fields, and Gravity Forms calculates the total from those. If a feed points at one product field instead of Form Total, it charges for that product alone and ignores everything else, including shipping and other items.
If the order shows $50 but the gateway charged $25, check the payment feed. It is almost always set to a specific product field rather than Form Total.
8. Conditional Logic
Gravity Forms conditional logic works on product fields as normal, and the table follows it.
- A product hidden by conditional logic has its row hidden from the table
- Hidden rows are excluded from the Products Total and from the amount charged
- When the field becomes visible again, the row returns with any quantity the customer had already entered
- If every product in a table group is hidden, that group’s heading and table are hidden too
This means you can build forms where products only appear after an earlier selection, and the table stays accurate as the customer moves through it.
Earlier versions kept the row visible when the product field was hidden. Update if conditional products are part of your form.
9. Multi-Step Forms
Multi-page forms are fully supported.
Suggested structure
- Step 1: product selection with the table
- Step 2: shipping options and customer details
- Step 3: payment and confirmation
How values carry across steps
Selections on the table step are synced to Gravity Forms’ own fields, and Gravity Forms preserves those as the customer moves between pages.
This captures product selections before the customer proceeds, and keeps the running total meaningful on later steps.
Showing an order summary later
The table itself only renders on the step containing your products. To show the running total on a later step, add a Gravity Forms Total field to that step.
10. Compatibility
Product types
| Product Type | Status | Notes |
|---|---|---|
| Single Product | Supported | Full support with quantity controls |
| Dropdown Product | Supported | Choices shown in the Options column |
| Radio Product | Supported | Choices shown in the Options column |
| Option Fields | Supported | Linked options appear in the Options column |
| Quantity Field | Supported | Replaced by the table’s quantity controls |
| Hidden Product | Partial | Works in pricing but is not displayed as a row |
| Calculation Product | Partial | Intended for totals, do not add to the table |
| User Defined Price | Not supported | Use a standard field outside the table |
| Checkbox Options | Not supported | Use a standard field outside the table |
Add-ons and features
| Feature | Status | Notes |
|---|---|---|
| Stripe | Compatible | Set payment amount to Form Total |
| PayPal | Compatible | Set payment amount to Form Total |
| Square | Compatible | Set payment amount to Form Total |
| Authorize.Net | Compatible | Set payment amount to Form Total |
| Third-party gateways | Compatible | Any add-on built on the Gravity Forms Add-On Framework |
| Coupons | Compatible | Discounts apply to the Gravity Forms total |
| Conditional Logic | Compatible | Version 2.9.0 or later |
| Shipping fields | Compatible | Calculated by Gravity Forms as normal |
| Partial Entries | Compatible | Works normally |
| AJAX forms | Compatible | The table re-initialises after AJAX render |
Themes
The table uses its own scoped styles and does not rely on your theme’s table styling. If you need to adjust anything, target .gfpt-wrapper and the classes listed under Customization.
11. Troubleshooting
Payment problems
The charge is lower than the order total
Cause: the payment feed is set to a specific product field instead of Form Total.
Fix: open Form Settings, then your gateway feed, and set Payment Amount to Form Total.
The charge is zero
Cause: every quantity is zero, or the form has no Total field.
Fix:
- Add a Total field to the form
- Check that product prices are set in the field settings
- Consider enabling Require At Least One Item so empty orders cannot be submitted
Display problems
The table does not appear
- Check that Enable Product Table is ticked in the Product Table panel
- Check that at least one product has Display in Product Table enabled
- Open the browser console (F12) and look for JavaScript errors from other plugins
The original product fields are still visible
Cause: a theme or plugin is overriding the positioning the plugin uses to move those fields out of view.
Fix: add this CSS, which keeps the fields in the layout but out of sight:
.gfpt-hidden-native {
position: absolute !important;
left: -9999px !important;
opacity: 0 !important;
}
The original fields must stay in the page for Gravity Forms to calculate pricing and for conditional logic detection to work. Setting display: none on .gfpt-hidden-native can blank the table.
Images look cropped
Cause: non-square source images.
Fix: use square images, or images that still read well when cropped to square. Image dimensions are adjustable under Forms, Product Table.
The options dropdown is too wide
Fix: shorten the option labels, or limit the width with CSS:
.gfpt-option-select {
max-width: 200px;
}
Multi-step problems
Quantities reset to zero on a later step
Cause: a bug in versions before 2.3.7, where the plugin synced on pages that did not contain the table.
Fix: update to the current version.
The total shows zero on the payment step
Cause: that step has no Total field.
Fix: add a Total field to the step where payment happens. Gravity Forms needs it to calculate the charge.
Calculation questions
Products Total does not match the Gravity Forms subtotal
This is expected. Products Total covers only the products in the table. The Gravity Forms subtotal includes every pricing field, such as shipping and fees.
12. FAQ
Can I have more than one table on a form?
Yes. Use Table Groups. Give related products the same Table Group name and each group renders as its own table with a heading. See section 3.
Can I change the quantity button colour?
Yes. Set Primary Color under Forms, Product Table for all forms, or override it per form in the Product Table panel.
Does it work with AJAX-enabled forms?
Yes. The table re-initialises after an AJAX render.
Can I use this with WooCommerce?
No. This plugin works with Gravity Forms product fields only. WooCommerce has its own cart system.
How do I show or hide products based on a customer’s selection?
Use Gravity Forms conditional logic on the product fields as you normally would. From version 2.9.0 the table rows follow those conditions. See section 8.
Can customers enter their own price?
User Defined Price fields are not supported inside the table. Add them as standard Gravity Forms fields outside it.
Why can’t customers tick multiple options?
The table is built around single selection: pick a product, choose a variant, set a quantity. Checkbox options do not fit that model. Use standard Gravity Forms checkbox fields outside the table if you need them.
Can I export orders to a spreadsheet?
Yes. Use the Gravity Forms entry export. All product data is stored in entries as normal.
Does it support subscriptions?
Subscription handling is done by your payment add-on. The table handles product display and quantities, and the add-on handles the recurring billing setup.
What happens if I deactivate the plugin?
Your products revert to standard Gravity Forms fields. No form data is lost, and payment feeds, notifications, and entries are unaffected. Nothing is stored outside your form.
Need more help?
If you are still stuck, get in touch:
- Email: support@oiopublisher.com
- Website: oiopublisher.com
Please include the following, which saves a round trip:
- WordPress version
- Gravity Forms version
- Product Table version
- A screenshot of the problem
- Any errors from the browser console (F12, then Console)
