Skip to main content

System requirements

RequirementMinimumRecommended
WordPress6.0Latest stable
PHP7.48.1+
WooCommerceAny recent stableLatest stable
MySQL5.78.0+
MariaDB10.310.6+
The plugin declares these requirements in its plugin header:
// utb-product-builder.php
* Requires at least: 6.0
* Requires PHP: 7.4
* Requires Plugins: woocommerce
WordPress 6.0 introduced the Requires Plugins header, which prevents activation if WooCommerce is absent.
1

Download the plugin ZIP

Obtain utb-product-builder.zip from your repository or distribution source. Keep the file compressed — WordPress extracts it automatically.
2

Upload and install

  1. Log in to the WordPress admin panel.
  2. Go to Plugins > Add New Plugin.
  3. Click Upload Plugin.
  4. Select utb-product-builder.zip and click Install Now.
3

Activate the plugin

Click Activate Plugin after installation.Activation runs UTB_PB_DB_Schema::on_activate(), which creates all database tables and seeds initial data. See Database tables below for the full table list.

Install via FTP/SFTP

Use this method if your server’s PHP upload limit is too small for the ZIP file, or if you prefer direct server access.
1

Extract the ZIP locally

Unzip utb-product-builder.zip on your local machine. You should have a folder named utb-product-builder/.
2

Upload the plugin folder

Connect to your server via FTP or SFTP and upload the utb-product-builder/ folder to:
/wp-content/plugins/utb-product-builder/
Ensure the folder name is exactly utb-product-builder. WordPress uses the folder name as the plugin slug.
3

Set file permissions

The plugin directory and its files should be readable by the web server:
find /wp-content/plugins/utb-product-builder -type d -exec chmod 755 {} \;
find /wp-content/plugins/utb-product-builder -type f -exec chmod 644 {} \;
4

Activate from the WordPress admin

Go to Plugins > Installed Plugins, find UTB Product Builder (WooCommerce), and click Activate.
If you upload the plugin by replacing files on a live site (bypassing the normal activation hook), the database tables may not be created automatically. The plugin detects this: on every page load it checks the stored utb_pb_db_version option and runs UTB_PB_DB_Schema::install_tables() if it is below 3.0.1. You can also run the tables manually:
wp eval-file wp-content/plugins/utb-product-builder/install_tables.php

Database tables

Activation creates 11 tables using WordPress’s dbDelta() function. All tables use your WordPress table prefix (default wp_).
TablePurpose
{prefix}utb_certificatesAcademic certificate definitions (slug, name, type, pricing config)
{prefix}utb_certificate_pricesPricing matrix per certificate, academic level, and format
{prefix}utb_programsAcademic programs catalog for certificate eligibility
{prefix}utb_cep_programsContinuing Education (CEP) program catalog with SKU and pricing
{prefix}utb_cep_inscriptionsLegacy CEP enrollment records (superseded by utb_product_submissions)
{prefix}utb_product_submissionsUniversal submission store — one row per order line item, stores form_data and uploaded_files as JSON
{prefix}utb_form_configsProduct-to-flow assignments and per-product form config, pricing config, and custom CSS
{prefix}utb_data_sourcesConfigurable data sources (database tables, external APIs) used by dynamic select fields
{prefix}utb_validation_rulesReusable validation rule patterns (regex, format)
{prefix}utb_file_access_logsAudit log for private file download requests
{prefix}utb_webhook_logsOutbound webhook delivery log with status, attempt count, and response body
The table names are stored in the WordPress option utb_pb_table_config and can be inspected or overridden from the admin if your environment uses non-standard naming.

Manual table installation

If you need to force table creation outside of the activation hook:
wp eval-file wp-content/plugins/utb-product-builder/install_tables.php
This script calls UTB_PB_DB_Schema::install_tables(), which uses dbDelta() and is safe to run on existing installations — it adds missing tables and columns without dropping data.

Post-installation checklist

After activation, verify the following:
Go to Plugins > Installed Plugins and confirm WooCommerce appears as Active. If it is not, UTB Product Builder will display an admin notice and will not initialize.
Run the following WP-CLI command to confirm the tables exist:
wp db query "SHOW TABLES LIKE 'wp_utb_%';"
You should see all 11 tables listed. If any are missing, run:
wp eval-file wp-content/plugins/utb-product-builder/install_tables.php
Confirm the private uploads directory was created:
ls -la wp-content/utb-private-uploads/
You should see three entries: temp/, submissions/, .htaccess, and index.php. The .htaccess file blocks direct HTTP access on Apache servers.
Check the WooCommerce log for any startup errors:WooCommerce > Status > Logs — filter by source utb_product_builder or utb_fatal_monitor.
Go to UTB Builder > Assign Flows, assign a flow to a product, and save. Then visit that product’s front-end URL and confirm the custom form is rendered.

Nginx configuration for private uploads

On Apache, the .htaccess file created at activation blocks direct HTTP access to wp-content/utb-private-uploads/. On Nginx, .htaccess has no effect — you must add a location block to your site configuration manually. The plugin writes an example configuration to wp-content/utb-private-uploads/nginx.conf.example at activation. Add the following block to your Nginx server block:
location ~ ^/wp-content/utb-private-uploads/ {
    deny all;
    return 404;
}
After editing the configuration, reload Nginx:
sudo nginx -t
sudo systemctl reload nginx
Without this block, files uploaded by customers (scanned documents, ID copies, etc.) are publicly accessible by direct URL on Nginx servers. Apply this rule before accepting any file uploads in production.

wp-config.php constants

Define these constants in wp-config.php before the /* That's all, stop editing! */ line:
// Required for REST API authentication
define( 'UTB_API_KEY', 'your-secret-api-key' );

// Required for webhook signature verification (HMAC-SHA256)
define( 'UTB_WEBHOOK_SECRET', 'your-webhook-secret' );

// Optional: enable detailed REST API request/response logging
define( 'UTB_API_LOGGING', true );
ConstantRequiredPurpose
UTB_API_KEYYes (if using REST API)Authenticates requests to /wp-json/utb/v1/ endpoints
UTB_WEBHOOK_SECRETYes (if using webhooks)Signs outbound webhook payloads with HMAC-SHA256 so the receiver can verify authenticity
UTB_API_LOGGINGNoWhen true, logs all inbound REST API requests to WP_CONTENT_DIR/utb-api-access.log and failed authentication attempts to WP_CONTENT_DIR/utb-api-failed-auth.log
Do not commit wp-config.php to version control. Use environment-specific configuration or a secrets manager to inject these values in staging and production environments.

Build docs developers (and LLMs) love