{"id":330,"date":"2026-01-20T02:08:09","date_gmt":"2026-01-19T18:08:09","guid":{"rendered":"https:\/\/autojoseph.uncannycloud.com\/?p=330"},"modified":"2026-01-21T01:42:02","modified_gmt":"2026-01-20T17:42:02","slug":"automator-incoming-outgoing-webhook-the-complete-guidelines-from-beginner-to-advance","status":"publish","type":"post","link":"https:\/\/autojoseph.uncannycloud.com\/index.php\/2026\/01\/20\/automator-incoming-outgoing-webhook-the-complete-guidelines-from-beginner-to-advance\/","title":{"rendered":"Automator Incoming &#038; Outgoing Webhook: The complete guidelines from Beginner to Advance"},"content":{"rendered":"<p>This guide covers everything you need to know about using webhooks in Uncanny Automator\u2014from sending data to external services (outgoing webhooks) to receiving data and triggering recipes (incoming webhooks), including nested data, array workarounds, real API examples, and troubleshooting.<\/p>\n<h2 id=\"table-of-contents\">Table of Contents<\/h2>\n<ol>\n<li><a href=\"#what-are-webhooks\">What Are Webhooks?<\/a><\/li>\n<li><a href=\"#outgoing-webhooks-send-data-to-a-webhook\">Outgoing Webhooks: Send Data to a Webhook (Action)<\/a><\/li>\n<li><a href=\"#incoming-webhooks-receive-data-from-a-webhook\">Incoming Webhooks: Receive Data from a Webhook (Trigger)<\/a><\/li>\n<li><a href=\"#understanding-keys-values-and-data-types\">Understanding Keys, Values, and Data Types<\/a><\/li>\n<li><a href=\"#working-with-nested-data\">Working with Nested Data<\/a><\/li>\n<li><a href=\"#advanced-complex-objects-and-arrays\">Advanced: Complex Objects and Arrays<\/a><\/li>\n<li><a href=\"#common-use-cases-and-examples\">Common Use Cases and Examples<\/a><\/li>\n<li><a href=\"#troubleshooting\">Troubleshooting<\/a><\/li>\n<li><a href=\"#quick-reference-card\">Quick Reference Card<\/a><\/li>\n<li><a href=\"#glossary\">Glossary<\/a><\/li>\n<li><a href=\"#version-history\">Version History<\/a><\/li>\n<\/ol>\n<hr \/>\n<h2 id=\"what-are-webhooks\">What Are Webhooks?<\/h2>\n<p>A <strong>webhook<\/strong> is a way for one application to send real-time data to another application when something happens. Think of it like a notification system between apps.<\/p>\n<h3>Two Types in Uncanny Automator<\/h3>\n<table>\n<thead>\n<tr>\n<th>Type<\/th>\n<th>Direction<\/th>\n<th>When to Use<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Outgoing Webhook<\/strong> (Action)<\/td>\n<td>Your site \u2192 External service<\/td>\n<td>Send data when something happens on your WordPress site<\/td>\n<\/tr>\n<tr>\n<td><strong>Incoming Webhook<\/strong> (Trigger)<\/td>\n<td>External service \u2192 Your site<\/td>\n<td>Receive data and trigger a recipe when an external service sends data to you<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Simple Analogy<\/h3>\n<ul>\n<li><strong>Outgoing Webhook<\/strong>: Like sending a text message to someone<\/li>\n<li><strong>Incoming Webhook<\/strong>: Like receiving a text message from someone<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"outgoing-webhooks-send-data-to-a-webhook\">Outgoing Webhooks: Send Data to a Webhook<\/h2>\n<p><strong>Location<\/strong>: Actions \u2192 Webhooks \u2192 <em>Send data to a webhook<\/em><\/p>\n<p>Use this action to send data <strong>FROM your WordPress site TO an external service<\/strong> when a trigger fires.<\/p>\n<h3>Field Reference<\/h3>\n<h4>URL (Required)<\/h4>\n<p>The destination URL where data will be sent.<\/p>\n<p><strong>Example values:<\/strong><\/p>\n<pre><code>https:\/\/hooks.zapier.com\/hooks\/catch\/123456\/abcdef\/\r\nhttps:\/\/api.example.com\/webhooks\/receive\r\nhttps:\/\/make.com\/webhook\/abc123<\/code><\/pre>\n<p><strong>Tips:<\/strong><\/p>\n<ul>\n<li>Must be a publicly accessible URL (not localhost in production)<\/li>\n<li>Supports tokens \u2014 you can use <code>{{user_email}}<\/code> or other tokens in the URL<\/li>\n<li>Must start with <code>https:\/\/<\/code> or <code>http:\/\/<\/code><\/li>\n<\/ul>\n<h4>Request Method (Required)<\/h4>\n<p>The HTTP method to use when sending the request.<\/p>\n<table>\n<thead>\n<tr>\n<th>Method<\/th>\n<th>When to Use<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>POST<\/strong><\/td>\n<td>Most common. Use when creating new data or sending form submissions<\/td>\n<\/tr>\n<tr>\n<td><strong>GET<\/strong><\/td>\n<td>Retrieving data. Parameters are sent in the URL query string<\/td>\n<\/tr>\n<tr>\n<td><strong>PUT<\/strong><\/td>\n<td>Updating\/replacing existing data completely<\/td>\n<\/tr>\n<tr>\n<td><strong>PATCH<\/strong><\/td>\n<td>Partially updating existing data<\/td>\n<\/tr>\n<tr>\n<td><strong>DELETE<\/strong><\/td>\n<td>Removing data<\/td>\n<\/tr>\n<tr>\n<td><strong>HEAD<\/strong><\/td>\n<td>Same as GET but returns only headers, no body<\/td>\n<\/tr>\n<tr>\n<td><strong>OPTIONS<\/strong><\/td>\n<td>Checking what methods are allowed<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Default<\/strong>: POST (recommended for most webhooks)<\/p>\n<h4>Data Format (Required)<\/h4>\n<p>How the data in the Body section will be formatted when sent.<\/p>\n<table>\n<thead>\n<tr>\n<th>Format<\/th>\n<th>Content-Type Header<\/th>\n<th>Best For<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>JSON<\/strong><\/td>\n<td><code>application\/json<\/code><\/td>\n<td>Most APIs, Zapier, Make, modern services<\/td>\n<\/tr>\n<tr>\n<td><strong>x-www-form-urlencoded<\/strong><\/td>\n<td><code>application\/x-www-form-urlencoded<\/code><\/td>\n<td>Traditional form submissions<\/td>\n<\/tr>\n<tr>\n<td><strong>form-data<\/strong><\/td>\n<td><code>multipart\/form-data<\/code><\/td>\n<td>File uploads, legacy systems<\/td>\n<\/tr>\n<tr>\n<td><strong>XML<\/strong><\/td>\n<td><code>application\/xml<\/code><\/td>\n<td>SOAP APIs, legacy enterprise systems<\/td>\n<\/tr>\n<tr>\n<td><strong>Text<\/strong><\/td>\n<td><code>text\/plain<\/code><\/td>\n<td>Simple text content<\/td>\n<\/tr>\n<tr>\n<td><strong>HTML<\/strong><\/td>\n<td><code>text\/html<\/code><\/td>\n<td>HTML content<\/td>\n<\/tr>\n<tr>\n<td><strong>GraphQL<\/strong><\/td>\n<td><code>application\/graphql<\/code><\/td>\n<td>GraphQL APIs<\/td>\n<\/tr>\n<tr>\n<td><strong>Raw<\/strong><\/td>\n<td><code>application\/octet-stream<\/code><\/td>\n<td>Binary or unformatted data<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Default<\/strong>: x-www-form-urlencoded<\/p>\n<p><strong>Important<\/strong>: The receiving service must accept your chosen format. When in doubt, use JSON.<\/p>\n<h4>Authorization (Optional)<\/h4>\n<p>Authentication credentials sent in the <code>Authorization<\/code> header.<\/p>\n<p><strong>Common patterns:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Auth Type<\/th>\n<th>Value to Enter<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bearer Token<\/td>\n<td><code>Bearer your_api_token_here<\/code><\/td>\n<\/tr>\n<tr>\n<td>Basic Auth<\/td>\n<td><code>Basic base64_encoded_credentials<\/code><\/td>\n<\/tr>\n<tr>\n<td>API Key<\/td>\n<td><code>ApiKey your_key_here<\/code><\/td>\n<\/tr>\n<tr>\n<td>Custom<\/td>\n<td>Whatever the service requires<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Security Note<\/strong>: After saving, the value is masked with asterisks (e.g., <code>************abc<\/code>). The original value is stored securely and used during execution.<\/p>\n<p><strong>Supports tokens<\/strong>: You can use tokens like <code>{{custom_field_api_key}}<\/code> if the API key is stored in user meta or a custom field.<\/p>\n<h4>Headers (Optional)<\/h4>\n<p>Additional HTTP headers to include with the request.<\/p>\n<p><strong>Default header added:<\/strong><\/p>\n<pre><code>Accept: application\/json<\/code><\/pre>\n<p><strong>Common headers to add:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Name<\/th>\n<th>Value<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Content-Type<\/code><\/td>\n<td><code>application\/json<\/code><\/td>\n<td>Explicitly set content type<\/td>\n<\/tr>\n<tr>\n<td><code>X-API-Key<\/code><\/td>\n<td><code>your_api_key<\/code><\/td>\n<td>Alternative API key location<\/td>\n<\/tr>\n<tr>\n<td><code>X-Custom-Header<\/code><\/td>\n<td><code>custom_value<\/code><\/td>\n<td>Service-specific headers<\/td>\n<\/tr>\n<tr>\n<td><code>User-Agent<\/code><\/td>\n<td><code>Uncanny Automator\/1.0<\/code><\/td>\n<td>Identify the request source<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Note<\/strong>: The <code>Authorization<\/code> header is automatically added from the Authorization field \u2014 don\u2019t duplicate it here.<\/p>\n<h4>Body (Required for most use cases)<\/h4>\n<p>The actual data being sent. Configured as key-value pairs.<\/p>\n<p>See: <a href=\"#understanding-keys-values-and-data-types\">Understanding Keys, Values, and Data Types<\/a><\/p>\n<h3>Outgoing Webhook Buttons<\/h3>\n<table>\n<thead>\n<tr>\n<th>Button<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Help<\/strong><\/td>\n<td>Opens documentation<\/td>\n<\/tr>\n<tr>\n<td><strong>Check data format<\/strong><\/td>\n<td>Preview how your data will be formatted before sending<\/td>\n<\/tr>\n<tr>\n<td><strong>Send test<\/strong><\/td>\n<td>Actually sends a test request and shows the response<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Recommendation<\/strong>: Always use \u201cSend test\u201d before going live to verify the destination accepts your data.<\/p>\n<hr \/>\n<h2 id=\"incoming-webhooks-receive-data-from-a-webhook\">Incoming Webhooks: Receive Data from a Webhook<\/h2>\n<p><strong>Location<\/strong>: Triggers \u2192 Webhooks \u2192 <em>Receive data from a webhook<\/em><\/p>\n<p><strong>Requirement<\/strong>: Uncanny Automator Pro<\/p>\n<p>Use this trigger to receive data <strong>FROM an external service TO your WordPress site<\/strong>, then run recipe actions.<\/p>\n<h3>Field Reference<\/h3>\n<h4>Webhook URL (Read-only)<\/h4>\n<p>The unique URL that external services should send data to.<\/p>\n<p><strong>Format:<\/strong><\/p>\n<pre><code>https:\/\/yoursite.com\/wp-json\/uap\/v2\/uap-{recipe_id}-{trigger_id}<\/code><\/pre>\n<p><strong>Example:<\/strong><\/p>\n<pre><code>https:\/\/example.com\/wp-json\/uap\/v2\/uap-3594-3614<\/code><\/pre>\n<p><strong>Supported HTTP methods:<\/strong><\/p>\n<ul>\n<li>POST (most common)<\/li>\n<li>GET<\/li>\n<li>PUT<\/li>\n<\/ul>\n<p><strong>Important<\/strong>: This URL is generated automatically and unique to each trigger. Copy it and paste it into the external service\u2019s webhook configuration.<\/p>\n<h4>Data Format (Required)<\/h4>\n<p>How to parse the incoming data.<\/p>\n<table>\n<thead>\n<tr>\n<th>Format<\/th>\n<th>When to Select<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Auto<\/strong><\/td>\n<td>Let Automator detect the format (recommended)<\/td>\n<\/tr>\n<tr>\n<td><strong>JSON<\/strong><\/td>\n<td>When you know the source sends JSON<\/td>\n<\/tr>\n<tr>\n<td><strong>x-www-form-urlencoded<\/strong><\/td>\n<td>Traditional form data<\/td>\n<\/tr>\n<tr>\n<td><strong>XML<\/strong><\/td>\n<td>When the source sends XML data<\/td>\n<\/tr>\n<tr>\n<td><strong>form-data<\/strong><\/td>\n<td>Multipart form data<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Default<\/strong>: Auto (recommended)<\/p>\n<p><strong>Tip<\/strong>: Auto works in most cases. Only change if you\u2019re experiencing parsing issues.<\/p>\n<h4>Security Headers (Optional)<\/h4>\n<p>Headers that MUST be present and match for the webhook to be processed.<\/p>\n<p><strong>Use case<\/strong>: Verify that requests are legitimate by requiring a secret header.<\/p>\n<p><strong>Example configuration:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Name<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>X-Webhook-Secret<\/code><\/td>\n<td><code>my_secret_key_12345<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>Authorization<\/code><\/td>\n<td><code>Bearer expected_token<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>How it works:<\/strong><\/p>\n<ol>\n<li>You define required headers here<\/li>\n<li>When a request arrives, Automator checks if these headers exist with the exact values<\/li>\n<li>If they don\u2019t match, the request is ignored (returns 403)<\/li>\n<\/ol>\n<p><strong>Security tip<\/strong>: Always use security headers when the webhook is publicly accessible to prevent unauthorized triggers.<\/p>\n<h4>Fields (Required)<\/h4>\n<p>Define what data keys you expect to receive.<\/p>\n<p><strong>Two ways to configure:<\/strong><\/p>\n<ol>\n<li><strong>Manual<\/strong>: Add keys manually that match what the external service sends<\/li>\n<li><strong>Get samples<\/strong>: Click the button to listen for a test webhook and auto-populate<\/li>\n<\/ol>\n<p>See: <a href=\"#understanding-keys-values-and-data-types\">Understanding Keys, Values, and Data Types<\/a><\/p>\n<h4>Headers (Extract Headers as Tokens)<\/h4>\n<p>Extract specific header values to use as tokens in your recipe.<\/p>\n<p><strong>Example<\/strong>: If the webhook sender includes a header <code>X-User-ID: 12345<\/code>, you can extract it:<\/p>\n<table>\n<thead>\n<tr>\n<th>Header name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>X-User-ID<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This creates a token <code>{{X-User-ID}}<\/code> usable in your actions.<\/p>\n<h4>Response (Required)<\/h4>\n<p>What to send back to the service that called your webhook.<\/p>\n<table>\n<thead>\n<tr>\n<th>Option<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Default<\/strong><\/td>\n<td>Returns <code>{\"status\": \"success\"}<\/code> with 200 OK<\/td>\n<\/tr>\n<tr>\n<td><strong>Custom<\/strong><\/td>\n<td>Define your own status code, content type, and body<\/td>\n<\/tr>\n<tr>\n<td><strong>Callable function<\/strong><\/td>\n<td>Use a PHP function to generate the response<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>Custom Response Options<\/h5>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Status code<\/strong><\/td>\n<td>HTTP status code (e.g., 200, 201, 204)<\/td>\n<\/tr>\n<tr>\n<td><strong>Content<\/strong><\/td>\n<td>The response body content<\/td>\n<\/tr>\n<tr>\n<td><strong>Content type<\/strong><\/td>\n<td>How to format the response (JSON, text, etc.)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Example custom response:<\/strong><\/p>\n<ul>\n<li>Status code: <code>200<\/code><\/li>\n<li>Content type: <code>JSON<\/code><\/li>\n<li>Content: <code>{\"received\": true, \"processed\": \"{{trigger_id}}\"}<\/code><\/li>\n<\/ul>\n<h5>Callable Function<\/h5>\n<p>For advanced users who need dynamic responses:<\/p>\n<pre><code>\/\/ In your theme's functions.php or a custom plugin\r\nfunction my_webhook_response( $response, $hooks, $recipe, $request ) {\r\n    \/\/ Custom logic here\r\n    return new WP_REST_Response(\r\n        array(\r\n            'status' =&gt; 'processed',\r\n            'recipe' =&gt; $recipe['ID'],\r\n        ),\r\n        200\r\n    );\r\n}<\/code><\/pre>\n<p>Then enter <code>my_webhook_response<\/code> in the Callable function field.<\/p>\n<h3>Incoming Webhook Buttons<\/h3>\n<table>\n<thead>\n<tr>\n<th>Button<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Get samples<\/strong><\/td>\n<td>Listens for 60 seconds for a test webhook, then auto-populates fields<\/td>\n<\/tr>\n<tr>\n<td><strong>Save<\/strong><\/td>\n<td>Save the trigger configuration<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"understanding-keys-values-and-data-types\">Understanding Keys, Values, and Data Types<\/h2>\n<p>This section covers the most important concept for webhooks: how to define your data.<\/p>\n<h3>The Key-Value Concept<\/h3>\n<p>Webhooks send data as <strong>key-value pairs<\/strong>, like a dictionary or address book:<\/p>\n<pre><code>Key         \u2192  Value\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfirst_name  \u2192  John\r\nemail       \u2192  john@example.com\r\nage         \u2192  30\r\nis_active   \u2192  true<\/code><\/pre>\n<p>In Automator&#8217;s interface:<\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Data Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>first_name<\/code><\/td>\n<td>Text<\/td>\n<td><code>John<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>email<\/code><\/td>\n<td>Text<\/td>\n<td><code>john@example.com<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>age<\/code><\/td>\n<td>Number<\/td>\n<td><code>30<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>is_active<\/code><\/td>\n<td>Boolean<\/td>\n<td><code>true<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Data Types Explained<\/h3>\n<h4>For Outgoing Webhooks (Sending Data)<\/h4>\n<table>\n<thead>\n<tr>\n<th>Type<\/th>\n<th>What It Sends<\/th>\n<th>Example Input<\/th>\n<th>JSON Output<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Text<\/strong><\/td>\n<td>A string of characters<\/td>\n<td><code>Hello World<\/code><\/td>\n<td><code>\"Hello World\"<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Number<\/strong><\/td>\n<td>A numeric value (integer or decimal)<\/td>\n<td><code>42.5<\/code><\/td>\n<td><code>42.5<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Boolean<\/strong><\/td>\n<td>True or false<\/td>\n<td><code>true<\/code> or <code>false<\/code><\/td>\n<td><code>true<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>NULL<\/strong><\/td>\n<td>Explicitly empty value<\/td>\n<td>(any value)<\/td>\n<td><code>null<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5>Text (Default)<\/h5>\n<p>Use for: Names, emails, descriptions, URLs, any general text.<\/p>\n<pre><code>Key: user_email\r\nType: Text\r\nValue: {{user_email}}\r\n\r\nResult: \"user_email\": \"john@example.com\"<\/code><\/pre>\n<p><strong>Important<\/strong>: Even if the value looks like a number, selecting Text wraps it in quotes.<\/p>\n<pre><code>Key: phone\r\nType: Text\r\nValue: 5551234567\r\n\r\nResult: \"phone\": \"5551234567\"  (as a string, not number)<\/code><\/pre>\n<h5>Number<\/h5>\n<p>Use for: Ages, quantities, prices, IDs, counts.<\/p>\n<pre><code>Key: quantity\r\nType: Number\r\nValue: 5\r\n\r\nResult: \"quantity\": 5  (no quotes)<\/code><\/pre>\n<pre><code>Key: price\r\nType: Number\r\nValue: 19.99\r\n\r\nResult: \"price\": 19.99<\/code><\/pre>\n<p><strong>Warning<\/strong>: If the value is not a valid number, it may cause errors or be sent as <code>0<\/code>.<\/p>\n<h5>Boolean<\/h5>\n<p>Use for: Yes\/no values, flags, switches, opt-ins.<\/p>\n<p><strong>Accepted true values:<\/strong><\/p>\n<ul>\n<li><code>true<\/code><\/li>\n<li><code>1<\/code><\/li>\n<li><code>yes<\/code> (converted to <code>true<\/code>)<\/li>\n<\/ul>\n<p><strong>Accepted false values:<\/strong><\/p>\n<ul>\n<li><code>false<\/code><\/li>\n<li><code>0<\/code><\/li>\n<li><code>no<\/code> (converted to <code>false<\/code>)<\/li>\n<\/ul>\n<pre><code>Key: subscribed\r\nType: Boolean\r\nValue: true\r\n\r\nResult: \"subscribed\": true  (no quotes)<\/code><\/pre>\n<pre><code>Key: is_verified\r\nType: Boolean\r\nValue: 1\r\n\r\nResult: \"is_verified\": true<\/code><\/pre>\n<h5>NULL<\/h5>\n<p>Use for: Explicitly empty fields, clearing values in APIs.<\/p>\n<pre><code>Key: middle_name\r\nType: NULL\r\nValue: (anything or empty)\r\n\r\nResult: \"middle_name\": null<\/code><\/pre>\n<p><strong>Note<\/strong>: NULL is different from an empty string. Some APIs treat them differently:<\/p>\n<ul>\n<li><code>\"field\": null<\/code> \u2192 Field exists but has no value<\/li>\n<li><code>\"field\": \"\"<\/code> \u2192 Field exists with an empty string value<\/li>\n<li>Field omitted \u2192 Field doesn&#8217;t exist<\/li>\n<\/ul>\n<h4>For Incoming Webhooks (Receiving Data)<\/h4>\n<table>\n<thead>\n<tr>\n<th>Type<\/th>\n<th>What It Expects<\/th>\n<th>Used For<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Text<\/strong><\/td>\n<td>Any string value<\/td>\n<td>General content, names, descriptions<\/td>\n<\/tr>\n<tr>\n<td><strong>Email<\/strong><\/td>\n<td>Valid email format<\/td>\n<td>Email addresses<\/td>\n<\/tr>\n<tr>\n<td><strong>Integer<\/strong><\/td>\n<td>Whole numbers<\/td>\n<td>Counts, IDs, quantities<\/td>\n<\/tr>\n<tr>\n<td><strong>Float<\/strong><\/td>\n<td>Decimal numbers<\/td>\n<td>Prices, percentages<\/td>\n<\/tr>\n<tr>\n<td><strong>URL<\/strong><\/td>\n<td>Valid URL format<\/td>\n<td>Links, file URLs<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The type you select helps Automator:<\/p>\n<ol>\n<li>Display the right icon for tokens<\/li>\n<li>Provide appropriate validation hints<\/li>\n<li>Categorize tokens in the token picker<\/li>\n<\/ol>\n<p><strong>Auto-detection<\/strong> (when using \u201cGet samples\u201d) generally follows these patterns:<\/p>\n<ul>\n<li>Contains <code>@<\/code> and looks like email \u2192 Email<\/li>\n<li>Valid URL format \u2192 URL<\/li>\n<li>Whole number \u2192 Integer<\/li>\n<li>Number with decimal \u2192 Float<\/li>\n<li>Everything else \u2192 Text<\/li>\n<\/ul>\n<h3>Using Tokens in Values<\/h3>\n<p>Tokens let you insert dynamic data from your trigger.<\/p>\n<p><strong>Syntax:<\/strong> <code>{{token_name}}<\/code><\/p>\n<p><strong>Examples:<\/strong><\/p>\n<pre><code>Key: user_email\r\nType: Text\r\nValue: {{user_email}}<\/code><\/pre>\n<pre><code>Key: order_total\r\nType: Number\r\nValue: {{wc_order_total}}<\/code><\/pre>\n<pre><code>Key: message\r\nType: Text\r\nValue: New order from {{user_first_name}} {{user_last_name}}<\/code><\/pre>\n<p><strong>Important<\/strong>: Token values are resolved at runtime. If a token is empty, an empty string is sent.<\/p>\n<hr \/>\n<h2 id=\"working-with-nested-data\">Working with Nested Data<\/h2>\n<p>Many APIs expect nested\/hierarchical data structures. Automator supports this using the <code>\/<\/code> separator in keys.<\/p>\n<h3>The <code>\/<\/code> Separator<\/h3>\n<p>Use forward slash (<code>\/<\/code>) to create nested objects.<\/p>\n<h4>Basic Nesting<\/h4>\n<pre><code>Key: customer\/name\r\nValue: John Smith\r\n\r\nKey: customer\/email  \r\nValue: john@example.com<\/code><\/pre>\n<p><strong>Produces JSON:<\/strong><\/p>\n<pre><code>{\r\n  \"customer\": {\r\n    \"name\": \"John Smith\",\r\n    \"email\": \"john@example.com\"\r\n  }\r\n}<\/code><\/pre>\n<h4>Deep Nesting<\/h4>\n<pre><code>Key: order\/billing\/address\/street\r\nValue: 123 Main St\r\n\r\nKey: order\/billing\/address\/city\r\nValue: New York\r\n\r\nKey: order\/billing\/address\/zip\r\nValue: 10001<\/code><\/pre>\n<p><strong>Produces JSON:<\/strong><\/p>\n<pre><code>{\r\n  \"order\": {\r\n    \"billing\": {\r\n      \"address\": {\r\n        \"street\": \"123 Main St\",\r\n        \"city\": \"New York\",\r\n        \"zip\": \"10001\"\r\n      }\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<h4>Mixing Flat and Nested<\/h4>\n<pre><code>Key: event_type\r\nValue: purchase\r\n\r\nKey: data\/product_id\r\nValue: 123\r\n\r\nKey: data\/quantity\r\nValue: 2<\/code><\/pre>\n<p><strong>Produces JSON:<\/strong><\/p>\n<pre><code>{\r\n  \"event_type\": \"purchase\",\r\n  \"data\": {\r\n    \"product_id\": 123,\r\n    \"quantity\": 2\r\n  }\r\n}<\/code><\/pre>\n<h3>When Nesting Applies<\/h3>\n<p>Nesting with <code>\/<\/code> works for these data formats:<\/p>\n<ul>\n<li>\u2705 JSON<\/li>\n<li>\u2705 XML<\/li>\n<li>\u2705 GraphQL<\/li>\n<li>\u274c x-www-form-urlencoded (sent as flat <code>customer\/name=value<\/code>)<\/li>\n<li>\u274c form-data (sent as flat)<\/li>\n<li>\u274c Text\/Plain<\/li>\n<\/ul>\n<h3>Array Data<\/h3>\n<p>Currently, Automator sends key-value objects, not true arrays. To send array-like data, use numbered keys:<\/p>\n<pre><code>Key: items\/0\/name\r\nValue: Product A\r\n\r\nKey: items\/0\/qty\r\nValue: 2\r\n\r\nKey: items\/1\/name\r\nValue: Product B\r\n\r\nKey: items\/1\/qty\r\nValue: 1<\/code><\/pre>\n<p><strong>Produces:<\/strong><\/p>\n<pre><code>{\r\n  \"items\": {\r\n    \"0\": {\"name\": \"Product A\", \"qty\": 2},\r\n    \"1\": {\"name\": \"Product B\", \"qty\": 1}\r\n  }\r\n}<\/code><\/pre>\n<p><strong>Note<\/strong>: This creates an object with numeric keys, not a true JSON array. Some APIs accept this, others don&#8217;t.<\/p>\n<hr \/>\n<h2 id=\"advanced-complex-objects-and-arrays\">Advanced: Complex Objects and Arrays<\/h2>\n<h3>Visual Guide: How Keys Map to JSON<\/h3>\n<pre><code>YOUR AUTOMATOR CONFIGURATION          RESULTING JSON\r\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\r\nFLAT (simple key-value):\r\nKey: name                   \u2500\u2500\u25ba    \"name\": \"John\"\r\nKey: email                  \u2500\u2500\u25ba    \"email\": \"john@example.com\"\r\n\r\nNESTED (using \/ separator):\r\nKey: user\/name              \u2500\u2500\u25ba    \"user\": { \"name\": \"John\", ... }\r\nKey: user\/email             \u2500\u2500\u25ba\r\n\r\nDEEP NESTED:\r\nKey: data\/user\/profile\/name \u2500\u2500\u25ba    \"data\": { \"user\": { \"profile\": { \"name\": \"John\" } } }\r\n\r\nARRAY-LIKE (using \/0, \/1, \/2):\r\nKey: tags\/0                 \u2500\u2500\u25ba    \"tags\": { \"0\": \"red\", \"1\": \"blue\", \"2\": \"green\" }\r\n\r\nARRAY OF OBJECTS:\r\nKey: items\/0\/name           \u2500\u2500\u25ba    \"items\": { \"0\": { \"name\": \"...\", \"qty\": ... }, \"1\": {...} }<\/code><\/pre>\n<h3>Understanding JSON Structure Types<\/h3>\n<pre><code>\/\/ 1. SIMPLE OBJECT - key-value pairs\r\n{\r\n  \"name\": \"John\",\r\n  \"email\": \"john@example.com\"\r\n}\r\n\r\n\/\/ 2. NESTED OBJECT - objects within objects\r\n{\r\n  \"user\": {\r\n    \"profile\": {\r\n      \"name\": \"John\"\r\n    }\r\n  }\r\n}\r\n\r\n\/\/ 3. ARRAY - ordered list of items\r\n{\r\n  \"tags\": [\"vip\", \"subscriber\", \"active\"],\r\n  \"items\": [\r\n    {\"id\": 1, \"name\": \"Product A\"},\r\n    {\"id\": 2, \"name\": \"Product B\"}\r\n  ]\r\n}<\/code><\/pre>\n<h3>Sending Complex Nested Objects<\/h3>\n<h4>Example: E-commerce Order Payload<\/h4>\n<p><strong>Target JSON structure:<\/strong><\/p>\n<pre><code>{\r\n  \"order\": {\r\n    \"id\": \"ORD-12345\",\r\n    \"status\": \"pending\",\r\n    \"customer\": {\r\n      \"id\": 789,\r\n      \"email\": \"customer@example.com\",\r\n      \"name\": {\r\n        \"first\": \"John\",\r\n        \"last\": \"Smith\"\r\n      },\r\n      \"address\": {\r\n        \"billing\": {\r\n          \"street\": \"123 Main St\",\r\n          \"city\": \"New York\",\r\n          \"state\": \"NY\",\r\n          \"zip\": \"10001\",\r\n          \"country\": \"US\"\r\n        },\r\n        \"shipping\": {\r\n          \"street\": \"456 Oak Ave\",\r\n          \"city\": \"Los Angeles\",\r\n          \"state\": \"CA\",\r\n          \"zip\": \"90001\",\r\n          \"country\": \"US\"\r\n        }\r\n      }\r\n    },\r\n    \"totals\": {\r\n      \"subtotal\": 99.99,\r\n      \"tax\": 8.50,\r\n      \"shipping\": 5.00,\r\n      \"total\": 113.49\r\n    },\r\n    \"metadata\": {\r\n      \"source\": \"website\",\r\n      \"campaign\": \"summer_sale\",\r\n      \"notes\": null\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p><strong>Automator Body Configuration:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>order\/id<\/code><\/td>\n<td>Text<\/td>\n<td><code>ORD-{{wc_order_id}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/status<\/code><\/td>\n<td>Text<\/td>\n<td><code>pending<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/id<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{user_id}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/email<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_email}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/name\/first<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_first_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/name\/last<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_last_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/billing\/street<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_address_1}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/billing\/city<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_city}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/billing\/state<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_state}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/billing\/zip<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_postcode}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/billing\/country<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_country}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/shipping\/street<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_address_1}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/shipping\/city<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_city}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/shipping\/state<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_state}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/shipping\/zip<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_postcode}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/customer\/address\/shipping\/country<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_country}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/totals\/subtotal<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_subtotal}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/totals\/tax<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_total_tax}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/totals\/shipping<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_shipping_total}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/totals\/total<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_total}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/metadata\/source<\/code><\/td>\n<td>Text<\/td>\n<td><code>website<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/metadata\/campaign<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{utm_campaign}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>order\/metadata\/notes<\/code><\/td>\n<td>NULL<\/td>\n<td><code><\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Key insight<\/strong>: Each <code>\/<\/code> creates a new nesting level. <code>order\/customer\/name\/first<\/code> = 4 levels deep.<\/p>\n<hr \/>\n<h3>Working with Arrays<\/h3>\n<h4>The Array Challenge<\/h4>\n<p>True JSON arrays look like this:<\/p>\n<pre><code>{\r\n  \"tags\": [\"red\", \"blue\", \"green\"],\r\n  \"line_items\": [\r\n    {\"sku\": \"ABC\", \"qty\": 2},\r\n    {\"sku\": \"XYZ\", \"qty\": 1}\r\n  ]\r\n}<\/code><\/pre>\n<p><strong>Automator\u2019s default behavior<\/strong> creates objects with numeric keys instead:<\/p>\n<pre><code>{\r\n  \"tags\": {\r\n    \"0\": \"red\",\r\n    \"1\": \"blue\",\r\n    \"2\": \"green\"\r\n  }\r\n}<\/code><\/pre>\n<h4>Solution 1: Numeric Index Keys (Object-Style Arrays)<\/h4>\n<p>Many APIs accept objects with numeric keys as arrays.<\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>tags\/0<\/code><\/td>\n<td>Text<\/td>\n<td><code>red<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>tags\/1<\/code><\/td>\n<td>Text<\/td>\n<td><code>blue<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>tags\/2<\/code><\/td>\n<td>Text<\/td>\n<td><code>green<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Result:<\/strong><\/p>\n<pre><code>{\r\n  \"tags\": {\r\n    \"0\": \"red\",\r\n    \"1\": \"blue\",\r\n    \"2\": \"green\"\r\n  }\r\n}<\/code><\/pre>\n<h4>Solution 2: Comma-Separated String<\/h4>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>tags<\/code><\/td>\n<td>Text<\/td>\n<td><code>red,blue,green<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Result:<\/strong><\/p>\n<pre><code>{\r\n  \"tags\": \"red,blue,green\"\r\n}<\/code><\/pre>\n<h4>Solution 3: JSON String in Value<\/h4>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>tags<\/code><\/td>\n<td>Text<\/td>\n<td><code>[\"red\",\"blue\",\"green\"]<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Important<\/strong>: The array is sent as a STRING, not a real array. The receiving API must parse it.<\/p>\n<h4>Solution 4: Pre-built JSON Token<\/h4>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>line_items<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_items_json}}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Note<\/strong>: The token must output valid JSON. Use \u201cCheck data format\u201d to verify.<\/p>\n<h3>Array of Objects<\/h3>\n<p><strong>Target structure:<\/strong><\/p>\n<pre><code>{\r\n  \"contacts\": [\r\n    {\"email\": \"john@example.com\", \"name\": \"John\", \"role\": \"admin\"},\r\n    {\"email\": \"jane@example.com\", \"name\": \"Jane\", \"role\": \"user\"}\r\n  ]\r\n}<\/code><\/pre>\n<p><strong>Configuration (Object-style):<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>contacts\/0\/email<\/code><\/td>\n<td>Text<\/td>\n<td><code>john@example.com<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>contacts\/0\/name<\/code><\/td>\n<td>Text<\/td>\n<td><code>John<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>contacts\/0\/role<\/code><\/td>\n<td>Text<\/td>\n<td><code>admin<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>contacts\/1\/email<\/code><\/td>\n<td>Text<\/td>\n<td><code>jane@example.com<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>contacts\/1\/name<\/code><\/td>\n<td>Text<\/td>\n<td><code>Jane<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>contacts\/1\/role<\/code><\/td>\n<td>Text<\/td>\n<td><code>user<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Result:<\/strong><\/p>\n<pre><code>{\r\n  \"contacts\": {\r\n    \"0\": {\"email\": \"john@example.com\", \"name\": \"John\", \"role\": \"admin\"},\r\n    \"1\": {\"email\": \"jane@example.com\", \"name\": \"Jane\", \"role\": \"user\"}\r\n  }\r\n}<\/code><\/pre>\n<h3>Dynamic Arrays with Loopable Tokens<\/h3>\n<p>If your recipe\/action supports loops, you can use a loop index token to build item collections.<\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>items\/{{loop_index}}\/sku<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{item_sku}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>items\/{{loop_index}}\/name<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{item_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>items\/{{loop_index}}\/quantity<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{item_qty}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>items\/{{loop_index}}\/price<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{item_price}}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Without loops<\/strong>, you\u2019re limited to a fixed number of items or using a JSON token.<\/p>\n<hr \/>\n<h2 id=\"common-use-cases-and-examples\">Common Use Cases and Examples<\/h2>\n<h3>Example 1: Send User Registration to CRM<\/h3>\n<p><strong>Scenario<\/strong>: When a user registers, send their data to a CRM.<\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td><code>https:\/\/api.crm.com\/v1\/contacts<\/code><\/td>\n<\/tr>\n<tr>\n<td>Method<\/td>\n<td>POST<\/td>\n<\/tr>\n<tr>\n<td>Data Format<\/td>\n<td>JSON<\/td>\n<\/tr>\n<tr>\n<td>Authorization<\/td>\n<td><code>Bearer sk_live_abc123<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Body:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>email<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_email}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>first_name<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_first_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>last_name<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_last_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>source<\/code><\/td>\n<td>Text<\/td>\n<td><code>website_registration<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>created_at<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{current_date}}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Example 2: Send Order to Fulfillment Service<\/h3>\n<p><strong>Scenario<\/strong>: When a WooCommerce order is placed, send to fulfillment.<\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td><code>https:\/\/fulfillment.example.com\/api\/orders<\/code><\/td>\n<\/tr>\n<tr>\n<td>Method<\/td>\n<td>POST<\/td>\n<\/tr>\n<tr>\n<td>Data Format<\/td>\n<td>JSON<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Body:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>order_id<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_id}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>customer\/email<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_email}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>customer\/name<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_billing_first_name}} {{wc_order_billing_last_name}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>shipping\/address<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_address_1}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>shipping\/city<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_city}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>shipping\/postal<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{wc_order_shipping_postcode}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>total<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{wc_order_total}}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Example 3: Receive Stripe Webhook<\/h3>\n<p><strong>Scenario<\/strong>: Trigger a recipe when Stripe sends a payment event.<\/p>\n<p><strong>Trigger Configuration:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Data Format<\/td>\n<td>JSON<\/td>\n<\/tr>\n<tr>\n<td>Security Headers<\/td>\n<td>(Configure Stripe webhook signing in custom code)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Fields:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>type<\/code><\/td>\n<td>Text<\/td>\n<\/tr>\n<tr>\n<td><code>data\/object\/id<\/code><\/td>\n<td>Text<\/td>\n<\/tr>\n<tr>\n<td><code>data\/object\/amount<\/code><\/td>\n<td>Integer<\/td>\n<\/tr>\n<tr>\n<td><code>data\/object\/customer<\/code><\/td>\n<td>Text<\/td>\n<\/tr>\n<tr>\n<td><code>data\/object\/receipt_email<\/code><\/td>\n<td>Email<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Stripe sends:<\/strong><\/p>\n<pre><code>{\r\n  \"type\": \"payment_intent.succeeded\",\r\n  \"data\": {\r\n    \"object\": {\r\n      \"id\": \"pi_123\",\r\n      \"amount\": 2000,\r\n      \"customer\": \"cus_abc\",\r\n      \"receipt_email\": \"customer@example.com\"\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p><strong>Resulting tokens:<\/strong><\/p>\n<ul>\n<li><code>{{type}}<\/code> = <code>payment_intent.succeeded<\/code><\/li>\n<li><code>{{data\/object\/id}}<\/code> = <code>pi_123<\/code><\/li>\n<li><code>{{data\/object\/amount}}<\/code> = <code>2000<\/code><\/li>\n<li><code>{{data\/object\/customer}}<\/code> = <code>cus_abc<\/code><\/li>\n<li><code>{{data\/object\/receipt_email}}<\/code> = <code>customer@example.com<\/code><\/li>\n<\/ul>\n<h3>Example 4: Zapier Integration<\/h3>\n<p><strong>Outgoing to Zapier:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td><code>https:\/\/hooks.zapier.com\/hooks\/catch\/123456\/abcdef\/<\/code><\/td>\n<\/tr>\n<tr>\n<td>Method<\/td>\n<td>POST<\/td>\n<\/tr>\n<tr>\n<td>Data Format<\/td>\n<td>JSON<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Body:<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>action<\/code><\/td>\n<td>Text<\/td>\n<td><code>new_submission<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>form_id<\/code><\/td>\n<td>Number<\/td>\n<td><code>{{form_id}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>user_email<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{user_email}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>submission_data<\/code><\/td>\n<td>Text<\/td>\n<td><code>{{form_all_fields}}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Incoming from Zapier:<\/strong><\/p>\n<p>Configure your Fields to match what Zapier sends:<\/p>\n<table>\n<thead>\n<tr>\n<th>Key<\/th>\n<th>Type<\/th>\n<th>Sample value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>zapier_event<\/code><\/td>\n<td>Text<\/td>\n<td><code>spreadsheet_row_added<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>row_data<\/code><\/td>\n<td>Text<\/td>\n<td><code>{...}<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>timestamp<\/code><\/td>\n<td>Text<\/td>\n<td><code>2024-01-15T10:30:00Z<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"troubleshooting\">Troubleshooting<\/h2>\n<h3>Outgoing Webhook Issues<\/h3>\n<h4>\u201cWebhook URL is not valid\u201d Error<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>URL points to localhost, private IP, or internal network<\/li>\n<li>URL format is incorrect<\/li>\n<li>DNS cannot resolve the hostname<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Ensure URL is publicly accessible<\/li>\n<li>Check for typos in the URL<\/li>\n<li>Test the URL in a browser first<\/li>\n<\/ul>\n<h4>Request Timeout<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Destination server is slow or unresponsive<\/li>\n<li>Network issues<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Default timeout is 30 seconds<\/li>\n<li>Contact the API provider to check their status<\/li>\n<li>Reduce payload size if sending large data<\/li>\n<\/ul>\n<h4>Wrong Data Format Received<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Destination expects different format than selected<\/li>\n<li>Content-Type header mismatch<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Check API documentation for required format<\/li>\n<li>Use \u201cCheck data format\u201d button to preview<\/li>\n<li>Try JSON format (most widely supported)<\/li>\n<\/ul>\n<h4>Authentication Failures (401\/403)<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Incorrect API key or token<\/li>\n<li>Wrong authorization format<\/li>\n<li>Expired credentials<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Verify credentials with the API provider<\/li>\n<li>Check the exact format required (Bearer, Basic, etc.)<\/li>\n<li>Generate new API credentials<\/li>\n<\/ul>\n<h4>Data Type Errors<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Sending text when number expected<\/li>\n<li>Sending \u201ctrue\u201d as text instead of boolean<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Use \u201cCheck data format\u201d to verify types<\/li>\n<li>Match types to API documentation<\/li>\n<li>Remember: Number sends <code>5<\/code>, Text sends <code>\"5\"<\/code><\/li>\n<\/ul>\n<h3>Incoming Webhook Issues<\/h3>\n<h4>Webhook Not Triggering<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Trigger is in Draft mode<\/li>\n<li>Security headers don\u2019t match<\/li>\n<li>Wrong URL being called<\/li>\n<li>Recipe is not Live<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ol>\n<li>Set trigger to Live (not Draft)<\/li>\n<li>Verify the exact URL is being used<\/li>\n<li>Check security header values match exactly<\/li>\n<li>Ensure recipe is published and Live<\/li>\n<\/ol>\n<h4>\u201cGet samples\u201d Not Working<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Trigger must be in Draft mode to collect samples<\/li>\n<li>Sample window is only 60 seconds<\/li>\n<li>Firewall blocking incoming requests<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ol>\n<li>Set trigger to Draft mode first<\/li>\n<li>Click \u201cGet samples\u201d then immediately send test webhook<\/li>\n<li>Check server firewall allows incoming POST requests<\/li>\n<li>Try from a different network\/service<\/li>\n<\/ol>\n<h4>Fields Not Matching<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Key names don\u2019t match exactly (case-sensitive)<\/li>\n<li>Nested path syntax incorrect<\/li>\n<li>Data format mismatch<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Use \u201cGet samples\u201d to auto-detect exact keys<\/li>\n<li>Match case exactly: <code>User_Email<\/code> \u2260 <code>user_email<\/code><\/li>\n<li>For nested data, use <code>\/<\/code> separator: <code>data\/user\/email<\/code><\/li>\n<\/ul>\n<h4>Empty Token Values<\/h4>\n<p><strong>Causes:<\/strong><\/p>\n<ul>\n<li>Key path doesn\u2019t exist in payload<\/li>\n<li>Typo in key name<\/li>\n<li>Data structure changed<\/li>\n<\/ul>\n<p><strong>Solutions:<\/strong><\/p>\n<ul>\n<li>Log the raw webhook body to see actual structure<\/li>\n<li>Re-run \u201cGet samples\u201d with current data<\/li>\n<li>Check if sender changed their payload format<\/li>\n<\/ul>\n<h3>General Debugging Tips<\/h3>\n<h4>Enable Debug Logging<\/h4>\n<p>Add to <code>wp-config.php<\/code>:<\/p>\n<pre><code>define( 'AUTOMATOR_DEBUG_MODE', true );<\/code><\/pre>\n<p>Logs appear in the recipe log\u2019s \u201cActivity\u201d section.<\/p>\n<h4>Check Recipe Logs<\/h4>\n<ol>\n<li>Go to Automator \u2192 Logs<\/li>\n<li>Find the recipe run<\/li>\n<li>Check the Action\/Trigger log details<\/li>\n<li>Look for error messages or response codes<\/li>\n<\/ol>\n<h4>Use \u201cSend test\u201d Button<\/h4>\n<ol>\n<li>Fill in all fields<\/li>\n<li>Click \u201cSend test\u201d<\/li>\n<li>Review the response \u2014 success shows as green, errors as red<\/li>\n<li>Check response body for API error messages<\/li>\n<\/ol>\n<h4>Verify with External Tools<\/h4>\n<ul>\n<li><strong>Postman<\/strong> \u2014 Full API testing<\/li>\n<li><strong>cURL<\/strong> \u2014 Command line testing<\/li>\n<li><strong>webhook.site<\/strong> \u2014 Free webhook testing service<\/li>\n<li><strong>RequestBin<\/strong> \u2014 Inspect incoming requests<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"quick-reference-card\">Quick Reference Card<\/h2>\n<h3>Outgoing Webhook Checklist<\/h3>\n<ul>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> URL is valid and publicly accessible<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Request method matches API requirements<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Data format matches what API expects<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Authorization credentials are correct<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Required headers are added<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Body keys match API field names exactly<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Data types are correct (Text vs Number vs Boolean)<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Nested paths use <code>\/<\/code> separator<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> \u201cSend test\u201d works successfully<\/li>\n<\/ul>\n<h3>Incoming Webhook Checklist<\/h3>\n<ul>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Webhook URL copied to external service<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Data format set correctly (or Auto)<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Security headers configured (if needed)<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Fields match incoming data keys exactly<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> \u201cGet samples\u201d run to verify field mapping<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Response type configured appropriately<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Trigger set to Live (not Draft) in production<\/li>\n<li><input disabled=\"disabled\" type=\"checkbox\" \/> Recipe is published and Live<\/li>\n<\/ul>\n<h3>Data Type Quick Reference<\/h3>\n<table>\n<thead>\n<tr>\n<th>I Want to Send\u2026<\/th>\n<th>Use Type<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Names, descriptions, any text<\/td>\n<td>Text<\/td>\n<\/tr>\n<tr>\n<td>Emails (as text)<\/td>\n<td>Text<\/td>\n<\/tr>\n<tr>\n<td>Whole numbers (1, 42, 1000)<\/td>\n<td>Number<\/td>\n<\/tr>\n<tr>\n<td>Decimal numbers (19.99, 3.14)<\/td>\n<td>Number<\/td>\n<\/tr>\n<tr>\n<td>Yes\/No, On\/Off, True\/False<\/td>\n<td>Boolean<\/td>\n<\/tr>\n<tr>\n<td>\u201cClear this field\u201d<\/td>\n<td>NULL<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Common Nested Paths<\/h3>\n<table>\n<thead>\n<tr>\n<th>API Expects<\/th>\n<th>Key to Use<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>{\"user\": {\"email\": \"...\"}}<\/code><\/td>\n<td><code>user\/email<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"data\": {\"attributes\": {\"name\": \"...\"}}}<\/code><\/td>\n<td><code>data\/attributes\/name<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"contact\": {\"address\": {\"city\": \"...\"}}}<\/code><\/td>\n<td><code>contact\/address\/city<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Array Patterns Quick Reference<\/h3>\n<table>\n<thead>\n<tr>\n<th>I Want to Create\u2026<\/th>\n<th>Keys to Use<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Simple array <code>[\"a\",\"b\",\"c\"]<\/code><\/td>\n<td><code>items\/0<\/code>, <code>items\/1<\/code>, <code>items\/2<\/code><\/td>\n<\/tr>\n<tr>\n<td>Array of objects<\/td>\n<td><code>items\/0\/name<\/code>, <code>items\/0\/value<\/code>, <code>items\/1\/name<\/code>, <code>items\/1\/value<\/code><\/td>\n<\/tr>\n<tr>\n<td>Nested array<\/td>\n<td><code>data\/tags\/0<\/code>, <code>data\/tags\/1<\/code>, <code>data\/tags\/2<\/code><\/td>\n<\/tr>\n<tr>\n<td>Multiple levels<\/td>\n<td><code>order\/items\/0\/product\/id<\/code>, <code>order\/items\/0\/product\/name<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Incoming Webhook Key Patterns<\/h3>\n<table>\n<thead>\n<tr>\n<th>Sender Sends\u2026<\/th>\n<th>Your Field Key<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>{\"user\": {\"email\": \"...\"}}<\/code><\/td>\n<td><code>user\/email<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"data\": {\"object\": {\"id\": \"...\"}}}<\/code><\/td>\n<td><code>data\/object\/id<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"items\": [{\"sku\": \"...\"}]}<\/code><\/td>\n<td><code>items\/0\/sku<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"tags\": [\"a\", \"b\"]}<\/code><\/td>\n<td><code>tags\/0<\/code>, <code>tags\/1<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>{\"meta\": {\"custom_field\": \"...\"}}<\/code><\/td>\n<td><code>meta\/custom_field<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"glossary\">Glossary<\/h2>\n<table>\n<thead>\n<tr>\n<th>Term<\/th>\n<th>Definition<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Webhook<\/strong><\/td>\n<td>A URL that receives HTTP requests with data<\/td>\n<\/tr>\n<tr>\n<td><strong>Payload<\/strong><\/td>\n<td>The data sent in a webhook request<\/td>\n<\/tr>\n<tr>\n<td><strong>Endpoint<\/strong><\/td>\n<td>The URL path where a webhook is received<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP Method<\/strong><\/td>\n<td>The type of request (GET, POST, PUT, etc.)<\/td>\n<\/tr>\n<tr>\n<td><strong>Header<\/strong><\/td>\n<td>Metadata sent with the request (authentication, content type)<\/td>\n<\/tr>\n<tr>\n<td><strong>Body<\/strong><\/td>\n<td>The main content\/data of the request<\/td>\n<\/tr>\n<tr>\n<td><strong>JSON<\/strong><\/td>\n<td>JavaScript Object Notation \u2014 a common data format<\/td>\n<\/tr>\n<tr>\n<td><strong>Token<\/strong><\/td>\n<td>A placeholder that gets replaced with actual data<\/td>\n<\/tr>\n<tr>\n<td><strong>Key<\/strong><\/td>\n<td>The name\/identifier of a data field<\/td>\n<\/tr>\n<tr>\n<td><strong>Value<\/strong><\/td>\n<td>The actual data stored in a field<\/td>\n<\/tr>\n<tr>\n<td><strong>Nested Data<\/strong><\/td>\n<td>Data organized in a hierarchy (objects within objects)<\/td>\n<\/tr>\n<tr>\n<td><strong>REST API<\/strong><\/td>\n<td>A standard way for applications to communicate over HTTP<\/td>\n<\/tr>\n<tr>\n<td><strong>Object<\/strong><\/td>\n<td>A collection of key-value pairs: <code>{\"name\": \"John\", \"age\": 30}<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Array<\/strong><\/td>\n<td>An ordered list of items: <code>[\"apple\", \"banana\", \"cherry\"]<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Nested Object<\/strong><\/td>\n<td>An object containing other objects: <code>{\"user\": {\"name\": \"John\"}}<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Array of Objects<\/strong><\/td>\n<td>A list of objects: <code>[{\"id\": 1}, {\"id\": 2}]<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Path Separator<\/strong><\/td>\n<td>The <code>\/<\/code> character used to access nested data: <code>user\/address\/city<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Index<\/strong><\/td>\n<td>The position of an item in an array, starting at 0: <code>items\/0<\/code>, <code>items\/1<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Flat Structure<\/strong><\/td>\n<td>Data with no nesting: <code>{\"name\": \"John\", \"email\": \"john@example.com\"}<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Deep Nesting<\/strong><\/td>\n<td>Multiple levels of objects within objects<\/td>\n<\/tr>\n<tr>\n<td><strong>SSRF<\/strong><\/td>\n<td>Server-Side Request Forgery \u2014 a security attack prevented by URL validation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"version-history\">Version History<\/h2>\n<ul>\n<li><strong>Document Version<\/strong>: 1.1<\/li>\n<li><strong>Last Updated<\/strong>: January 2026<\/li>\n<li><strong>Applies to<\/strong>: Uncanny Automator 6.x+ and Uncanny Automator Pro 6.x+<\/li>\n<\/ul>\n<h3>Changelog<\/h3>\n<p><strong>v1.1 (January 2026)<\/strong><\/p>\n<ul>\n<li>Added \u201cAdvanced: Complex Objects and Arrays\u201d section<\/li>\n<li>Added visual diagrams for key-to-JSON mapping<\/li>\n<li>Added visual diagrams for incoming webhook data extraction<\/li>\n<li>Added real-world API examples (HubSpot, Mailchimp, Stripe, Slack, Airtable)<\/li>\n<li>Added array handling patterns and workarounds<\/li>\n<li>Added PHP filter example for true JSON arrays<\/li>\n<li>Expanded Quick Reference with array patterns<\/li>\n<li>Expanded Glossary with object\/array terminology<\/li>\n<\/ul>\n<p><strong>v1.0 (January 2026)<\/strong><\/p>\n<ul>\n<li>Initial release<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This guide covers everything you need to know about using webhooks in Uncanny Automator\u2014from sending data to external services (outgoing webhooks) to receiving data and triggering recipes (incoming webhooks), including nested data, array workarounds, real API examples, and troubleshooting. Table of Contents What Are Webhooks? Outgoing Webhooks: Send Data to a Webhook (Action) Incoming Webhooks: [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-330","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/posts\/330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/comments?post=330"}],"version-history":[{"count":2,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/posts\/330\/revisions"}],"predecessor-version":[{"id":332,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/posts\/330\/revisions\/332"}],"wp:attachment":[{"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/media?parent=330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/categories?post=330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/autojoseph.uncannycloud.com\/index.php\/wp-json\/wp\/v2\/tags?post=330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}