Connecting Bubble to WooCommerce uses Basic Auth with the WooCommerce consumer key and consumer secret as Private credentials in Bubble's API Connector — no OAuth flow, no token expiry. The one non-obvious blocker that breaks 50% of setups: WordPress Permalinks must be set to 'Post name,' not 'Plain.' Without this setting change, every Bubble call to /wp-json/wc/v3/ returns 404 and there is no WooCommerce error message to debug from.
| Fact | Value |
|---|---|
| Tool | WooCommerce |
| Category | E-commerce |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 1–2 hours |
| Last updated | July 2026 |
Bubble as a headless WooCommerce frontend — the WordPress Permalink prerequisite no one mentions
The Bubble + WooCommerce pattern is a 'headless storefront': WooCommerce handles all product data, inventory, pricing, and order management inside WordPress, while Bubble provides the customer-facing experience with a custom design, better mobile responsiveness, or features that WooCommerce themes cannot easily deliver.
The integration uses WooCommerce's built-in REST API at `/wp-json/wc/v3/`. Basic Auth with your WooCommerce API keys is the authentication method. Bubble's API Connector handles this natively — consumer key as username, consumer secret as password, both marked Private.
Here is the non-obvious prerequisite that derails most first attempts: the WooCommerce REST API depends on WordPress Pretty Permalinks. If WordPress → Settings → Permalinks is set to 'Plain' (the original default), WordPress routes all requests by query strings rather than URL paths, and the `/wp-json/` endpoint does not exist. Every Bubble call to the WooCommerce REST API returns 404 — with no error message indicating the permalink is the cause. Change Permalink to 'Post name' and save — the API immediately becomes accessible.
WooCommerce returns clean JSON natively (unlike PrestaShop, which defaults to XML). Pagination uses `per_page` (max 100) and `page` parameters. Response headers `X-WP-Total` and `X-WP-TotalPages` contain total item counts — but Bubble cannot read response headers from API Connector calls, so use the product count from your first page or add a separate GET count call.
Inbound webhooks (getting notified when WooCommerce order status changes) require Bubble's Backend Workflow API, which is available only on paid plans.
Integration method
Bubble API Connector with WooCommerce consumer key and consumer secret as Basic Auth Private credentials; a Bubble Backend Workflow endpoint for inbound WooCommerce order webhooks.
Prerequisites
- A live WordPress site with WooCommerce plugin installed and at least one product in the catalog
- WordPress admin access to change Permalinks and generate WooCommerce API keys
- The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → search 'API Connector' → Install)
- For inbound webhooks: a Bubble paid plan (Starter or above) for Backend Workflows
Step-by-step guide
Set WordPress Permalinks to 'Post name' — the required prerequisite
Before touching any Bubble or WooCommerce settings, fix the most common cause of failed WooCommerce API setups: WordPress Permalink configuration. Log in to your WordPress admin panel at `yourstore.com/wp-admin`. In the left sidebar, go to Settings → Permalinks. Look at the currently selected permalink structure. If it is set to 'Plain' — the top option in the Permalink Settings list — the WordPress REST API is disabled. The plain setting routes requests via query strings (`?p=123`) rather than URL paths, and the pretty-URL routing layer that powers `/wp-json/` does not activate. Change the selection to **'Post name'** (the option that shows `https://yourstore.com/sample-post/`). Click 'Save Changes.' WordPress immediately rewrites the `.htaccess` file (Apache) or server config (Nginx) to enable path-based routing. To verify the fix worked: open a new browser tab and go to `https://yourstore.com/wp-json/wc/v3/`. You should see a JSON response describing the WooCommerce API routes (even without auth, the route list is public). If you still see 404 or a blank page, your hosting may require additional Nginx config — contact your hosting provider. Note: 'Post name' permalinks are the WordPress recommended default for all sites. Changing this setting does not affect your existing content, product URLs, or SEO — it only enables the URL routing format.
1// Verify WooCommerce REST API is accessible:2// Open browser and go to:3https://yourstore.com/wp-json/wc/v3/45// Expected: JSON listing of available WooCommerce API endpoints6// (no auth required just to view the route list)78// If you see 404 → Permalink is still set to 'Plain'9// If you see {"code":"rest_no_route","message":"No route was found"} → different routing issue10// If you see the JSON endpoint list → REST API is working, proceed to next step1112// WordPress admin path:13// Settings → Permalinks → Post name → Save ChangesPro tip: After saving Permalink settings, hard-reload your browser cache before testing the `/wp-json/` URL. Some caching plugins or Cloudflare rules may cache the 404 response from before the permalink change. If the 404 persists after the permalink fix, add `/wp-json/*` as a cache bypass rule in your caching plugin (WP Rocket, W3 Total Cache, or Cloudflare).
Expected result: Visiting `https://yourstore.com/wp-json/wc/v3/` in a browser returns a JSON response listing WooCommerce API namespaces and routes. No 404 error.
Generate WooCommerce REST API keys
In your WordPress admin, navigate to WooCommerce → Settings → Advanced → REST API. Click 'Add Key.' Fill in the key details: - **Description**: give it a recognizable name, like 'Bubble App Integration' - **User**: select a WordPress user account. The keys inherit this user's WordPress permissions — choose an admin account if you need full read/write access to all orders and products. - **Permissions**: select 'Read/Write' for full integration capability (read products and orders, create and update orders). Choose 'Read' only if your Bubble app will only display data without creating or modifying records. Click 'Generate API Key.' WooCommerce shows the Consumer Key and Consumer Secret exactly once — **copy both immediately** and save them to a secure location (password manager recommended). The Consumer Secret is never shown again; if you lose it, you must regenerate the key pair. The Consumer Key format starts with `ck_`, followed by a 40-character alphanumeric string. The Consumer Secret format starts with `cs_`. These are the credentials you will add to Bubble's API Connector. Do not paste these into any Bubble database field, state variable, or text element. They go only into the API Connector's Basic Auth fields with the Private checkbox enabled.
1// WooCommerce API key formats:2// Consumer Key: ck_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t03// Consumer Secret: cs_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t045// WooCommerce admin path:6// WooCommerce → Settings → Advanced → REST API → Add Key78// Base URL for all WooCommerce API calls:9https://yourstore.com/wp-json/wc/v31011// Quick test (with real credentials):12// GET https://yourstore.com/wp-json/wc/v3/products13// Basic Auth: username=ck_xxxx, password=cs_xxxx14// Expected: JSON array of productsPro tip: If your WooCommerce store uses HTTPS (it should in production), the REST API automatically works with Basic Auth. On HTTP-only sites, WooCommerce requires you to append `?wc-api-key={consumer_key}&wc-api-secret={consumer_secret}` as URL parameters instead of Basic Auth headers — but Bubble's API Connector can still pass these as hidden parameters with the Private checkbox. Always use HTTPS in production for security.
Expected result: You have a Consumer Key (ck_...) and Consumer Secret (cs_...) copied from WooCommerce. The keys have Read/Write permissions. They are not yet entered into Bubble — saved locally for the next step.
Configure Bubble API Connector with WooCommerce Basic Auth
In your Bubble editor, go to Plugins → API Connector. Click 'Add another API' and name it 'WooCommerce.' Set the base URL to `https://yourstore.com/wp-json/wc/v3` — replace `yourstore.com` with your actual domain, no trailing slash. In the Authentication section of the API group, select 'Basic Auth.' Enter: - Username: your Consumer Key (`ck_...`) — check the **Private** checkbox - Password: your Consumer Secret (`cs_...`) — check the **Private** checkbox Add a shared header for all calls in this group: `Content-Type: application/json`. Now add the Initialize Call. Click 'Add another call' and name it 'Get Products.' Set method GET and URL path `/products`. Add URL parameters: - `per_page`: value `10` (returns 10 products per page, max 100) - `page`: value `1` - `status`: value `publish` (only published products) Click Initialize call. WooCommerce returns an array of product objects with fields including `id`, `name`, `slug`, `permalink`, `type`, `status`, `price`, `regular_price`, `sale_price`, `stock_status`, `images`, `categories`, `variations`. Bubble auto-detects all these fields from the response. If Initialize call fails with 'There was an issue setting up your call' and no field detection happens, check: (1) permalink is set to Post name, (2) Consumer Key is prefixed with 'ck_' not just the alphanumeric part, (3) your store uses HTTPS, (4) there is at least one published product in WooCommerce.
1// Bubble API Connector: WooCommerce2// Base URL: https://yourstore.com/wp-json/wc/v33//4// Authentication: Basic Auth5// Username: ck_a1b2c3d4e5... // mark Private6// Password: cs_a1b2c3d4e5... // mark Private7//8// Shared Header:9// Content-Type: application/json10//11// Initialize Call: GET /products12// Parameters:13// per_page: 1014// page: 115// status: publish16//17// Sample response (one product):18// [19// {20// "id": 42,21// "name": "Classic T-Shirt",22// "slug": "classic-t-shirt",23// "permalink": "https://yourstore.com/product/classic-t-shirt",24// "type": "variable",25// "status": "publish",26// "price": "24.99",27// "regular_price": "29.99",28// "sale_price": "24.99",29// "stock_status": "instock",30// "images": [ { "id": 101, "src": "https://yourstore.com/wp-content/.../shirt.jpg", "name": "shirt" } ],31// "categories": [ { "id": 5, "name": "Tops", "slug": "tops" } ],32// "variations": [201, 202, 203]33// }34// ]Pro tip: WooCommerce returns products as a top-level JSON array, not an object wrapping an array. This is different from APIs like Printful (which use a 'result' wrapper). In Bubble's Repeating Group, the data source should point directly to the WooCommerce Get Products call — Bubble maps the response array directly without needing to navigate into a child object.
Expected result: The API Connector's Initialize call returns a JSON array of WooCommerce products. Bubble detects fields including id, name, price, images, and status. The Authentication section shows Consumer Key and Consumer Secret both marked Private.
Build product catalog display with pagination and category filtering
With the product call initialized, build the storefront product display. On your Bubble product listing page, add a Repeating Group. Set its data source to 'Plugins → API Connector → WooCommerce → Get Products.' In each Repeating Group cell, add: - A Text element bound to 'Current cell's `name`' - An Image element with Source URL bound to 'Current cell's `images.[0].src`' - A Text element for price bound to 'Current cell's `price`' (prepend a '$' sign if needed) - A 'View Product' button that navigates to a product detail page passing the `id` as a URL parameter For **pagination**: add two page number state variables (e.g., `wc_current_page` as number, default 1). In the Get Products call, make `page` a dynamic parameter that reads from this state. Add a 'Next Page' button that increases `wc_current_page` by 1 and a 'Previous Page' button that decreases it. WooCommerce's maximum `per_page` is 100 — if your store has more than 100 products, pagination is required. For **category filtering**: Add a Dropdown element linked to a separate 'Get Categories' call (GET /products/categories). When the user selects a category, add its `id` as the `category` URL parameter in the Get Products call. In Bubble, use a custom state for the selected category ID and include it in the data source call dynamically. For **product details**: add a 'Get Product Detail' call: GET `/products/<id>` with `<id>` as a dynamic text parameter. On the product detail page, load with the ID from the URL parameter and show full description, gallery images, and available variations.
1// WooCommerce → Get Products (with pagination + category filter)2// Method: GET3// URL: https://yourstore.com/wp-json/wc/v3/products4//5// Parameters:6// per_page: 24 // 24 products per page7// page: <dynamic: wc_current_page state variable>8// status: publish9// category: <dynamic: selected_category_id state (empty = all categories)>10// search: <dynamic: search_query state (empty = no filter)>11// orderby: date12// order: desc1314// WooCommerce → Get Categories15// Method: GET16// URL: https://yourstore.com/wp-json/wc/v3/products/categories17// Parameters: per_page=100, hide_empty=true18//19// Response: [ { "id": 5, "name": "Tops", "slug": "tops", "count": 12 } ]2021// WooCommerce → Get Product Detail22// Method: GET23// URL: https://yourstore.com/wp-json/wc/v3/products/<id>24// Parameters: id = <dynamic: product ID from URL>25//26// For variable products, get variations:27// GET https://yourstore.com/wp-json/wc/v3/products/<id>/variationsPro tip: WooCommerce's `images` field is an array — the first image (`images.[0].src`) is the featured image. For products with multiple gallery images, you'll need to display `images.[1].src`, `images.[2].src`, etc. Build a gallery Repeating Group using the images array as the data source. Bubble's API Connector maps `images` as a list automatically during Initialize.
Expected result: A Repeating Group on your Bubble storefront page shows WooCommerce products with names, prices, and featured images. Category filtering narrows the displayed products. Next/Previous buttons paginate through the full catalog. The product detail page shows the full product description and gallery.
Create WooCommerce orders from Bubble (headless checkout)
To create orders in WooCommerce from a Bubble workflow (when a customer completes checkout in your Bubble app), use the POST /orders endpoint. This creates a full WooCommerce order with customer billing and shipping information and line items. Add a new call in the WooCommerce API Connector named 'Create Order.' Set method POST, URL `/orders`. Set body type to 'JSON body.' The required body fields are: - `payment_method` and `payment_method_title` — use 'stripe' and 'Stripe' if integrating with Stripe payments - `set_paid` — set to `true` if payment is already collected (e.g., Stripe charged the customer before this call) - `billing` — customer billing object with first_name, last_name, address_1, city, state, postcode, country, email, phone - `shipping` — same structure as billing if different from billing address - `line_items` — array of ordered products with `product_id` (or `variation_id` for variable products), `quantity`, and optionally `price` In Bubble, build the JSON body as a raw body text expression. Map customer fields from your Bubble User data type and cart items from a CartItem Data Thing. IMPORTANT: Before triggering this call, verify that any associated Stripe payment has been confirmed. Use a Backend Workflow triggered by your Stripe payment webhook, not a button click. Sending confirmation emails: WooCommerce automatically sends order confirmation emails to the customer email in the `billing.email` field — always test with your own email first to verify the email content and verify no unexpected notifications go to real customers.
1// WooCommerce → Create Order2// Method: POST3// URL: https://yourstore.com/wp-json/wc/v3/orders4// Body type: JSON5//6{7 "payment_method": "stripe",8 "payment_method_title": "Credit Card (Stripe)",9 "set_paid": true,10 "status": "processing",11 "billing": {12 "first_name": "<dynamic: Customer first name>",13 "last_name": "<dynamic: Customer last name>",14 "address_1": "<dynamic: Customer street address>",15 "city": "<dynamic: Customer city>",16 "state": "<dynamic: Customer state>",17 "postcode": "<dynamic: Customer zip/postcode>",18 "country": "US",19 "email": "<dynamic: Customer email>",20 "phone": "<dynamic: Customer phone>"21 },22 "shipping": {23 "first_name": "<dynamic: Shipping first name>",24 "last_name": "<dynamic: Shipping last name>",25 "address_1": "<dynamic: Shipping address>",26 "city": "<dynamic: Shipping city>",27 "state": "<dynamic: Shipping state>",28 "postcode": "<dynamic: Shipping zip>",29 "country": "US"30 },31 "line_items": [32 {33 "product_id": <dynamic: WooCommerce product ID>,34 "variation_id": <dynamic: variation ID (0 if simple product)>,35 "quantity": <dynamic: quantity>36 }37 ],38 "shipping_lines": [39 {40 "method_id": "flat_rate",41 "method_title": "Flat Rate",42 "total": "<dynamic: shipping total>"43 }44 ]45}Pro tip: WooCommerce sends order confirmation and processing emails automatically when you create an order via the REST API, exactly as it would for an order placed through the WooCommerce checkout. Always test with `status: 'pending'` and `set_paid: false` when developing — this creates a draft order that does not send customer emails. Change to `status: 'processing'` and `set_paid: true` only in your production workflow after payment is confirmed.
Expected result: The Initialize call for POST /orders succeeds using your test payload. A test order appears in WooCommerce → Orders in WordPress admin with the correct billing information, line items, and 'Processing' status. Bubble's API Connector shows the response with the new order's id, order_key, and status.
Receive WooCommerce order webhooks in a Bubble Backend Workflow
WooCommerce can push order events to your Bubble app when order status changes — eliminating the need to poll the orders endpoint. This requires a Bubble Backend Workflow endpoint, which needs a paid Bubble plan. First, enable Bubble's Workflow API: Settings → API → check 'This app exposes a Workflow API.' Your endpoint base URL appears below the checkbox in the format `https://yourapp.bubbleapps.io/api/1.1/wf/`. In the Backend Workflows section, click 'Add workflow' and name it `wc_order_updated`. Enable 'Detect request data' — Bubble will listen for the next incoming POST request to auto-detect the payload schema. In WordPress admin, go to WooCommerce → Settings → Advanced → Webhooks. Click 'Add webhook.' Set: - Name: 'Bubble Order Updated' - Status: Active - Topic: 'Order Updated' (or 'Order Created' for new-order events — you may want both) - Delivery URL: `https://yourapp.bubbleapps.io/api/1.1/wf/wc_order_updated` - Secret: (optional) a secret string to verify the webhook source — WooCommerce adds an `X-WC-Webhook-Signature` header Save the webhook. WooCommerce immediately sends a test PING event to verify delivery. WooCommerce order webhooks send the complete order object as JSON — same structure as GET /orders/{id}. Key fields to process: `id` (order ID), `status` (new status), `billing`, `line_items`, `date_modified`. In the Backend Workflow, add actions to find the corresponding Order record in your Bubble database (search by WooCommerce order ID stored in a field on your Order data type) and update its status field. WooCommerce expects a 200 response within a timeout period. Add a 'Return data from API' action at the end of the workflow with `{ "received": true }` to acknowledge receipt promptly. RapidDev's engineers have implemented this WooCommerce-to-Bubble webhook pipeline across multiple Bubble headless storefronts — for complex multi-store setups, reach out at rapidevelopers.com/contact.
1// Bubble Backend Workflow URL:2https://yourapp.bubbleapps.io/api/1.1/wf/wc_order_updated34// WooCommerce webhook payload (Order Updated):5// {6// "id": 1234,7// "parent_id": 0,8// "number": "1234",9// "order_key": "wc_order_abc123",10// "created_via": "rest-api",11// "status": "completed",12// "currency": "USD",13// "date_created": "2026-01-27T14:32:00",14// "date_modified": "2026-01-27T16:45:00",15// "total": "49.98",16// "billing": {17// "first_name": "John",18// "last_name": "Doe",19// "email": "john@example.com"20// },21// "line_items": [22// { "id": 5, "name": "Classic T-Shirt", "product_id": 42, "quantity": 2, "total": "49.98" }23// ],24// "shipping_lines": [25// { "id": 6, "method_title": "Flat Rate", "total": "5.00" }26// ]27// }Pro tip: WooCommerce webhooks include an `X-WC-Webhook-Signature` header with an HMAC-SHA256 signature of the request body using your webhook secret. Bubble cannot natively verify this signature. For a production integration, validate the signature using a small Cloudflare Worker as a pass-through proxy that verifies the HMAC before forwarding to your Bubble Backend Workflow URL.
Expected result: The WooCommerce webhook configuration shows 'Active' status. When a test order is updated in WooCommerce, the Bubble Backend Workflow logs show an incoming request with the full order payload. The workflow updates the corresponding Order record in your Bubble database.
Common use cases
Custom Bubble storefront powered by WooCommerce product catalog
Build a Bubble app with a fully custom design that displays WooCommerce products — with advanced filtering, comparison features, or a layout impossible to achieve with WooCommerce themes. Customers browse and search on the Bubble frontend, and when they check out, orders are created via the WooCommerce API (or the customer is redirected to WooCommerce checkout). Product inventory and pricing are always live from WooCommerce.
Bind a Bubble Repeating Group to the WooCommerce API Connector GET /products call with category and per_page parameters. Each cell shows product name, price, images[0].src, and stock_status. Add a search input that updates the `search` parameter dynamically. When a user clicks a product, navigate to a product detail page using the product id as a URL parameter.
Copy this prompt to try it in Bubble
Order management dashboard for store operators
Build a custom Bubble admin panel for WooCommerce store operations — view all orders, filter by status, update order status, add order notes, and print packing slips — without the limitations of WooCommerce's built-in admin. Multi-user access control in Bubble lets you grant partial access to staff without giving them WordPress admin credentials.
On the dashboard page, bind a Repeating Group to GET /orders with status='processing' and per_page=50. For each order, display order_number, billing.first_name + last_name, total, status, and date_created. Add a Dropdown to change status — on change, trigger PUT /orders/{id} with the new status value in the request body.
Copy this prompt to try it in Bubble
Real-time order status tracking for customers
Build a standalone order tracking page in Bubble where customers enter their order number (or authenticate via their WooCommerce account) to see real-time order status, tracking information, and item details. Pull live status from WooCommerce's REST API and display shipping tracking links from the order meta fields.
On page load, use GET /orders/{id} with the order ID from the URL parameter to load order details. Display order status, line_items (product names and quantities), billing address, and shipping.tracking_number from the order meta. Show a status timeline based on the date_created, date_modified, and date_completed fields.
Copy this prompt to try it in Bubble
Troubleshooting
All WooCommerce API calls return 404 — no WooCommerce error message, just a WordPress 404 page
Cause: WordPress Permalinks is set to 'Plain' (the default setting on new WordPress installs). The WooCommerce REST API at /wp-json/wc/v3/ only works when WordPress uses pretty permalink URL structures. The plain setting routes everything via query strings and the /wp-json/ path does not exist.
Solution: In WordPress admin, go to Settings → Permalinks and change from 'Plain' to 'Post name.' Click 'Save Changes.' Then test `https://yourstore.com/wp-json/wc/v3/` in a browser — you should see a JSON response instead of a 404. This single change immediately fixes the 404 for all WooCommerce REST API calls.
'There was an issue setting up your call' when initializing the WooCommerce API Connector — no response fields detected
Cause: The Initialize call returned an error response (401 authentication failure, 404 from wrong base URL, or 0 products matching the filter) — Bubble cannot detect response fields from error responses. Common causes: Consumer Key is missing the 'ck_' prefix, the API Connector is using the wrong base URL path, or the WooCommerce store has no published products.
Solution: Check the following in order: (1) Verify the base URL is exactly `https://yourstore.com/wp-json/wc/v3` — no trailing slash, no extra path segments. (2) Verify the Consumer Key includes the full 'ck_' prefix. (3) Verify the Consumer Secret includes the full 'cs_' prefix. (4) Add a published product to WooCommerce if the store is new — an empty products response shows no fields to detect. (5) Test the URL directly in a browser with the credentials to see the raw error.
WooCommerce order creation via POST /orders sends unexpected emails to real customers
Cause: WooCommerce treats any order with `status: 'processing'` and `set_paid: true` as a complete order and sends order confirmation emails to the billing.email address. During development, if a developer uses a real customer email in the test payload, those customers receive emails.
Solution: During development, always set `status: 'pending'` and `set_paid: false` in your test POST /orders bodies. Use your own email address in `billing.email` for all test orders. Only enable `set_paid: true` in your production workflow after Stripe or another payment confirmation is received. Test the email content by placing test orders to yourself before going live.
WooCommerce pagination returns the same products regardless of the `page` parameter
Cause: The Bubble state variable for the page number is not being passed correctly to the API Connector call parameters, or the state is not updating when Next/Previous buttons are clicked. Bubble API Connector calls re-run on data source refresh, but if the page state variable is not properly linked to the call parameter, it always uses the default value.
Solution: In the API Connector call for Get Products, verify the `page` parameter is set to 'dynamic' and references your `wc_current_page` state variable. Test by setting the state variable to 2 manually via a workflow and checking if Bubble's Repeating Group loads a different set of products. Also check that the Repeating Group has 'Reset relevant states on navigation' disabled if you want the page number to persist.
Best practices
- Set WordPress Permalinks to 'Post name' as your first step — before creating API keys or configuring Bubble. Changing it later causes a 30-second debugging detour that blocks all other progress.
- Store Consumer Key and Consumer Secret only in the API Connector's Basic Auth fields with both marked Private. Never save these credentials in a Bubble database field, URL parameter, or custom state — they grant full WooCommerce access and would be exposed if stored in Bubble's Data API.
- Add Privacy rules in Bubble's Data tab for any data type that mirrors WooCommerce customer data (billing addresses, order details, email addresses). WooCommerce order data contains personally identifiable information — restrict access to authenticated users only.
- Use WooCommerce webhooks (POST /orders status update events) rather than polling the orders endpoint on a schedule. Each polling workflow call consumes Bubble Workload Units and may hit WordPress server limits if your store has high order volume. Webhooks reduce both WU cost and server load.
- Cache frequently-loaded product data in Bubble Data Things rather than calling WooCommerce on every page load. Sync the product catalog nightly via a scheduled Backend Workflow — only call WooCommerce live for stock status and dynamic pricing where freshness matters.
- Handle WordPress caching conflicts proactively: add `/wp-json/*` as a cache bypass rule in your caching plugin (WP Rocket, W3 Total Cache) or CDN (Cloudflare). Cached API responses return stale data and can cause pagination headers to disappear, breaking Bubble's product display.
- Test all order creation workflows with real test orders to yourself before going live. WooCommerce's automatic email notifications (order confirmation, processing, shipping) fire immediately on order creation — verify the email templates and content before your first real customer order.
Alternatives
Magento targets enterprise multi-store operations with a complex searchCriteria filter syntax, Integration Tokens, and bulk async API. WooCommerce is better for small-to-mid stores where simplicity matters — Basic Auth, JSON-native responses, and no filter syntax complexity. Choose Magento if your store has complex multi-catalog or multi-warehouse requirements; choose WooCommerce for WordPress-based stores.
Printful is a fulfillment service, not an e-commerce platform. WooCommerce manages your product catalog, pricing, and orders; Printful handles physical production and shipping. These can be used together — WooCommerce stores the order, Printful fulfills it. Use WooCommerce when you need full storefront management; use Printful when you need print-on-demand production.
Stripe is a payment processor, not a product management platform. WooCommerce already integrates with Stripe as a payment gateway inside WordPress. In a Bubble headless setup, you can use Stripe directly in Bubble for payment collection and then create the WooCommerce order after payment confirmation. Both tools serve different roles in a complete Bubble e-commerce integration.
Frequently asked questions
Does the WooCommerce REST API require a paid WooCommerce plan?
No. WooCommerce is a free plugin and its REST API is included at no charge. The API keys feature (WooCommerce → Settings → Advanced → REST API) is available in all WooCommerce versions 2.6 and above. There are no API call limits or per-request fees from WooCommerce itself. Your WordPress hosting plan may have server-level rate limits — contact your host if you experience throttling under high request volumes.
Can I use the WooCommerce integration on a Bubble free plan?
Yes, for reading and writing data (GET products, POST orders, GET orders). The API Connector works on all Bubble plans. The one feature requiring a paid Bubble plan (Starter or above) is the Backend Workflow for inbound WooCommerce webhooks — without it, you can only poll for order updates, not receive real-time push events when order status changes.
How do I handle WooCommerce variable products with different sizes and colors in Bubble?
Variable products have a `variations` array containing the IDs of each variation. Fetch the variations list with GET /products/{id}/variations — each variation object includes its own id, attributes (size, color), price, and stock_status. Display the variations in Dropdown elements in Bubble. When creating an order, use the selected variation's id as `variation_id` in the line_items array, along with the parent `product_id`. Both IDs are required for variable product orders.
I get a 401 error even though my credentials look correct — what should I check?
The most common causes of 401 on WooCommerce: (1) the Consumer Key does not include the full 'ck_' prefix — verify it starts with 'ck_'; (2) the Consumer Secret does not include the full 'cs_' prefix; (3) the API key was regenerated in WooCommerce and the old credentials are in Bubble — regenerating a key pair invalidates the previous one immediately; (4) the user account associated with the API key was deactivated or deleted. Regenerate the key pair in WooCommerce and update both values in Bubble's API Connector.
How do I show the total product count or implement page number navigation?
WooCommerce includes X-WP-Total and X-WP-TotalPages in the response headers, but Bubble's API Connector cannot read HTTP response headers. Two workarounds: (1) make a separate GET /products call with `per_page=1` and no other parameters — Bubble shows the response object which includes (for some WooCommerce versions) the count; (2) store the product count in a Bubble Data Thing by syncing your catalog periodically. Alternatively, build 'Load More' pagination instead of page-number navigation — click Load More increases the offset and appends results.
Can I use this integration to sync Bubble customer accounts with WooCommerce customer accounts?
Yes — WooCommerce has a /customers endpoint (GET, POST, PUT) that lets you create and update customer records. You can sync a Bubble user's registration with WooCommerce by creating a corresponding WooCommerce customer when a new Bubble user signs up (using POST /customers with email, first_name, last_name). Store the returned WooCommerce customer_id in your Bubble User data type and use it as the customer_id in order creation calls for order history attribution.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation