Auto-Fulfill Monthly Subscription Renewals from WooCommerce to Zendrop
When a WooCommerce subscription renews each month, this workflow automatically places a fulfillment order in Zendrop so your customers receive their box without any manual work. Save hours each billing cycle and eliminate missed shipments.
- 1
Set up the WooCommerce Webhook Trigger
Add the
Webhooknode and set the HTTP method toPOST. Copy the generated webhook URL. In your WooCommerce admin go to Settings > Advanced > Webhooks and create a new webhook with Topic set toOrder Updatedand the Delivery URL set to your copied URL. This fires every time an order status changes, including subscription renewals. - 2
Filter for Subscription Renewal Orders Only
Add an
IFnode connected to the Webhook. Set the condition to check that{{$json["body"]["status"]}}equalscompletedAND that{{$json["body"]["created_via"]}}equalssubscription. This ensures only paid renewal orders pass through and one-time orders are ignored. - 3
Extract and Map Order Data
Add a
Setnode on the TRUE branch of the IF node. Create fields:customer_namemapped to{{$json["body"]["billing"]["first_name"]}} {{$json["body"]["billing"]["last_name"]}},addressmapped to{{$json["body"]["shipping"]["address_1"]}},citymapped to{{$json["body"]["shipping"]["city"]}},zipmapped to{{$json["body"]["shipping"]["postcode"]}},countrymapped to{{$json["body"]["shipping"]["country"]}}, andproduct_idmapped to{{$json["body"]["line_items"][0]["sku"]}}. This cleans the data before sending to Zendrop. - 4
Send Fulfillment Order to Zendrop
Add an
HTTP Requestnode connected to the Set node. Set the Method toPOSTand the URL tohttps://app.zendrop.com/api/v1/orders. In the Headers section addAuthorizationwith valueBearer YOUR_ZENDROP_API_KEY. In the Body (JSON) paste the payload using the mapped fields from the previous step includingproduct_id,customer_name, and shipping address fields. Store your API key in n8n Credentials as a Header Auth credential for security. - 5
Log the Result to Google Sheets (Optional Audit Trail)
Add a
Google Sheetsnode connected after the HTTP Request node. Set it toAppend Rowin your chosen spreadsheet. Map columns: Order ID from{{$json["body"]["id"]}}, Customer from the Set nodecustomer_name, Status from the Zendrop response{{$json["order_id"]}}, and a Timestamp using{{$now.toISO()}}. This gives you a monthly record of every fulfilled subscription renewal.
Frequently asked questions
What happens if Zendrop returns an error for an order?
The HTTP Request node will show the error in the n8n execution log. You can add an Error Trigger node to send yourself an email alert when this happens. Check that your Zendrop product SKU in WooCommerce exactly matches the product ID in your Zendrop catalog.
Does this work with variable subscription boxes where the product changes each month?
Yes. As long as your WooCommerce renewal order line items contain the correct SKU for that month's box, the Set node will pick it up and send the right product ID to Zendrop. Make sure you update the subscription product SKU in WooCommerce before each billing cycle runs.
Can I test this without waiting for a real renewal?
Yes. In WooCommerce you can manually change a subscription order status to Completed or use the WooCommerce Subscriptions built-in Renew Now button on a test subscription. This fires the webhook immediately so you can run a test execution in n8n and verify all fields map correctly before going live.