WooCommerce Integration
Connect your WooCommerce store to TotalApp — fetch live data, trigger real-time workflows on store events, and automate order fulfilment, inventory sync, and customer notifications.
Overview
TotalApp's WooCommerce integration gives you two distinct capabilities: data retrieval via the WooCommerce REST API and real-time event triggering via inbound webhooks. You can use them independently or combine them in a single workflow — for example, trigger on order.created, fetch enriched order details, then send a fulfilment notification.
REST API Data Nodes
Pull orders, products, customers, and coupons from your store on demand. Supports pagination, status filtering, and per-page limits.
Inbound Webhook Triggers
React to store events in real time — new orders, product updates, customer registrations — without polling. Powered by WooCommerce's native webhook system.
Workflow Automation
Chain WooCommerce nodes with AI, email, Slack, database, and any other TotalApp node to build end-to-end automations entirely without code.
Credential Security
Consumer Key and Secret are stored server-side and attached to requests automatically. They are never exposed to the browser after initial configuration.
Prerequisites
- A self-hosted or WooCommerce.com store running WooCommerce 3.5+
- WordPress user with Administrator role (required to create REST API keys)
- HTTPS enabled on the store — WooCommerce refuses REST API and webhook requests over plain HTTP
- For inbound webhooks: the TotalApp server must be publicly reachable (automatic on production; use ngrok for local development)
WooCommerce vs Shopify
Unlike Shopify (a hosted SaaS), WooCommerce runs on your own WordPress server. This means REST API performance and webhook reliability depend on your hosting environment. A managed WordPress host (Kinsta, WP Engine, Flywheel) or a VPS is recommended for production automation workloads.
Setting Up the REST API Connection
The REST API connection allows TotalApp to fetch store data (orders, products, customers, coupons) on demand. Configure it once and all data nodes share the same credentials.
In WordPress admin go to WooCommerce → Settings → Advanced → REST API. Click Add key. Set Description to something like "TotalApp", set User to your admin account, and set Permissions to Read/Write (Write is needed if you plan to update orders or products from a workflow). Click Generate API key and copy both the Consumer Key and Consumer Secret — they will not be shown again.
Open Ecommerce → WooCommerce Integration in TotalApp. Paste your store URL (e.g. https://myshop.com), Consumer Key (ck_…), and Consumer Secret (cs_…). Click Test Connection — a green confirmation badge confirms the credentials are valid and shows the live product and order count.
Open the Workflow Editor and expand the Ecommerce → WooCommerce palette section. Drag any data node onto the canvas. No additional configuration is needed — credentials are read from your saved connection automatically.
HTTPS is required
WooCommerce will reject REST API requests to http:// URLs. Ensure your store has a valid SSL certificate. Most managed hosts provision one automatically; for self-hosted stores use Let's Encrypt.
Available Data Nodes
All four nodes appear under Ecommerce → WooCommerce in the palette. They act as data sources — drag, configure, then connect to downstream nodes.
| Node | What it fetches | Key config options | Output shape |
|---|---|---|---|
| WooCommerce Orders | Order list with line items, billing/shipping addresses, totals, and status | perPage (1–100), status (any / pending / processing / completed / cancelled / refunded / failed / on-hold) |
Array of WooCommerce order objects |
| WooCommerce Products | Products with variants, pricing, stock status, categories, tags, and images | perPage (1–100) |
Array of WooCommerce product objects |
| WooCommerce Customers | Registered customers with billing/shipping details and order totals | perPage (1–100) |
Array of WooCommerce customer objects |
| WooCommerce Coupons | Discount coupons with type, amount, usage limits, and expiry | perPage (1–100) |
Array of WooCommerce coupon objects |
Working with large stores
WooCommerce REST API is paginated. Data nodes fetch the first page up to perPage items. For large stores with thousands of orders, use status filtering (e.g. processing) to narrow the result set and keep workflow execution fast.
Inbound Webhook Triggers
Webhook trigger nodes let your workflow react to store events the moment they happen — no polling, no cron jobs. When WooCommerce fires a webhook (e.g. a new order is placed), TotalApp receives it immediately and executes only the downstream nodes connected to the matching trigger node.
How it works
TotalApp uses a Server-Sent Events (SSE) bridge: the server receives the incoming webhook POST and immediately forwards it to the open browser session via a persistent SSE connection. The Workflow Editor picks up the event and runs the subgraph starting from the matching trigger node — other trigger nodes on the same canvas are unaffected.
Setting up a WooCommerce Webhook Trigger node
In the Workflow Editor, expand Ecommerce → Triggers in the palette. Drag WooCommerce Webhook onto the canvas. This is a source-only node — it has no incoming handle, only an outgoing one.
Click the node to open the config panel. Choose the topic you want to listen to from the dropdown (see the full topic list below). You can place multiple WooCommerce Webhook nodes on the same canvas — each with a different topic — and they will each trigger only their own downstream chain.
In WordPress admin go to WooCommerce → Settings → Advanced → Webhooks. Click Add webhook. Set:
- Status: Active
- Topic: the same event you selected in the node config (e.g. Order created)
- Delivery URL:
- Production:
https://app.totalapp.app/api/webhooks/woocommerce - Local dev:
https://<your-ngrok-domain>/api/webhooks/woocommerce
- Production:
- Secret: leave blank (TotalApp does not validate the WooCommerce webhook secret at this time)
- API version: WP REST API Integration v3
Click Save webhook.
The SSE connection is maintained by the open browser tab. When an event arrives, TotalApp executes the workflow automatically — there is no need to click Run. If you close the tab, no events are processed until you reopen it.
Supported webhook topics
| WooCommerce topic | Fires when… |
|---|---|
order.created | A new order is placed |
order.updated | An order's status, items, or meta changes |
order.deleted | An order is permanently deleted (not trashed) |
order.restored | A trashed order is restored |
product.created | A new product is published |
product.updated | A product's price, stock, or content is saved |
product.deleted | A product is permanently deleted |
product.restored | A trashed product is restored |
customer.created | A new customer account is registered |
customer.updated | A customer's profile is edited |
customer.deleted | A customer account is deleted |
coupon.created | A new coupon is saved |
coupon.updated | An existing coupon is edited |
coupon.deleted | A coupon is deleted |
subscription.created | A new subscription is created (requires WooCommerce Subscriptions plugin) |
subscription.updated | A subscription status or billing date changes |
One trigger node = one subgraph
Each WooCommerce Webhook node on the canvas listens for exactly one topic. When that topic fires, TotalApp executes only the nodes reachable from that trigger node — it does not run the entire canvas. This means you can safely place order.created and order.updated nodes side by side: a new order triggers only the order.created chain, not the update chain.
Accessing the Webhook Payload
When a WooCommerce webhook fires, the raw payload (the full WooCommerce object — order, product, customer, etc.) is passed to all nodes downstream of the trigger node. You can access it in a Script node via the input variable:
// input.topic — e.g. "order.created"
// input.payload — the full WooCommerce object
const order = input.payload;
const total = order.total;
const customerEmail = order.billing.email;
const lineItems = order.line_items.map(i => i.name).join(', ');
return `New order #${order.number} from ${customerEmail}: ${lineItems} — £${total}`;
The payload structure follows the WooCommerce REST API v3 schema for the corresponding resource type.
Inspect the payload first
Connect the trigger node to a Text Output or Modal View output node and fire a test event from WooCommerce (edit and save any product). The output node will display the raw JSON payload, making it easy to identify the fields you need before writing logic in a Script node.
Local Development with ngrok
WooCommerce requires the delivery URL to be publicly accessible over HTTPS. When running TotalApp locally (dev server on port 3000), use ngrok to expose it:
ngrok http --url=<your-static-domain>.ngrok-free.app 3000
Then set the WooCommerce webhook delivery URL to:
https://<your-static-domain>.ngrok-free.app/api/webhooks/woocommerce
Port 3000 — not 80
The TotalApp dev server runs on port 3000. Always specify the port in the ngrok http command. Running ngrok http 80 will tunnel to the wrong port and webhook delivery will silently fail.
For production, change the delivery URL to https://app.totalapp.app/api/webhooks/woocommerce — no ngrok needed, as the Render deployment is publicly reachable.
Connection Status Panel
The WooCommerce Integration screen (Ecommerce → WooCommerce) shows a live connection status panel with:
- Connection badge — green "Connected" when credentials are valid, red "Disconnected" otherwise
- Live stats — product count, order count, customer count fetched from the REST API at connect time
- Recent orders — a live table of the 10 most recent orders with status badges and order totals
- Disconnect button — removes saved credentials from TotalApp (does not delete anything in WooCommerce)
Re-test after credential rotation
If you regenerate the WooCommerce API keys (e.g. after a security incident), click Disconnect in TotalApp, then re-enter the new credentials and click Test Connection. Existing workflow nodes will automatically use the updated credentials.
Example Workflows
New order → Slack notification
order.created → Script
format message → Send Slack Message
Fires the moment an order is placed. The Script node extracts input.payload.billing.email, input.payload.total, and line item names, then formats them into a Slack message.
Low stock alert → Email
product.updated → Script
check stock_quantity → Send Email
Triggers on any product save. The Script node checks input.payload.stock_quantity; if it falls below a threshold, it returns a message — otherwise returns null to stop execution. Connect a downstream Send Email node for the alert.
Daily order export
0 8 * * * → WooCommerce Orders
status: processing → Script
format CSV → Send Email
Runs at 08:00 every day. Fetches all processing orders, formats them as CSV in a Script node, and emails the result. Uses the REST API data node — no webhook required.
New customer → CRM sync
customer.created → Script
map to CRM fields → HTTP Request
POST to CRM API
Fires when a new account is registered. Maps WooCommerce customer fields to your CRM's schema in a Script node, then sends the data via an HTTP Request node.
Workflow Editor — WooCommerce Nodes
Every WooCommerce node lives in the Workflow Editor (Automation → Workflow Editor). Open the node palette on the left, expand Ecommerce, and you will see three sub-groups: Triggers, Shopify, and WooCommerce. Drag any node onto the canvas and wire it to downstream nodes to build real-time automations without writing code.
Node Palette — Ecommerce section
The palette screenshot below shows the exact layout: the Triggers group contains both the Shopify Webhook and WooCommerce Webhook nodes (blue dot, ec-triggers category). The WooCommerce group holds the four REST API data nodes (purple dot, ec-woocommerce category).
What you can connect to a trigger
A WooCommerce Webhook node is the start of a chain. Any node in the palette can be connected downstream — here are the most powerful combinations:
| Trigger event | Connect to… | What it automates |
|---|---|---|
order.created |
Send Email | Instant order confirmation or internal fulfilment alert to your team |
order.created / order.updated |
Script → HTTP Request | Push order data to your CRM (HubSpot, Salesforce, custom API) the moment it arrives |
order.updated |
Script → Send Email | Customer shipping notification when status changes to completed |
product.updated |
Script → Send Slack Message | Low-stock alert to the warehouse Slack channel when stock_quantity falls below threshold |
customer.created |
Script → HTTP Request | Auto-enrol new customers in a welcome email sequence or loyalty program via external API |
order.created |
Script → Ecommerce Reports | Append each new order to a running report for daily revenue tracking |
| Schedule Trigger (daily) | WooCommerce Orders → Script → Send Email | Daily digest of all processing orders emailed to ops team at 08:00 |
Any node, any combination
WooCommerce trigger and data nodes are standard Workflow Editor nodes — they produce JSON output that flows into Script, AI, Email, Slack, HTTP Request, File Write, or any other node. There is no special "WooCommerce mode"; the full node library is available downstream. This means a single order.created trigger can fan out to an email notification, a CRM update, and a Slack ping — all in parallel branches from the same canvas.
Frequently Asked Questions
subscription.created, subscription.updated) which are supported by the WooCommerce Webhook trigger node.- Confirm the delivery URL is exactly
https://app.totalapp.app/api/webhooks/woocommerce(no trailing slash, correct path) - For local dev: verify ngrok is running and the forwarding address points to port 3000, not 80
- Confirm the Workflow Editor tab is open — the SSE bridge is only active while the tab is open
- Check that HTTPS is correctly configured on the TotalApp server (automatic on Render production)
product.created node and a product.updated node on the same canvas are completely independent — they never trigger each other's chains, even if both topics fire in quick succession.https://myshop.com/wp-json/wc/v3/orders/{id}) using your Consumer Key and Secret for Basic Auth. Dedicated write nodes (Update Order, Create Product, etc.) are planned.