{"id":1570,"date":"2026-03-20T11:04:18","date_gmt":"2026-03-20T11:04:18","guid":{"rendered":"https:\/\/onesystemcrm.com\/help\/?post_type=docs&#038;p=1570"},"modified":"2026-03-20T11:04:18","modified_gmt":"2026-03-20T11:04:18","password":"","slug":"workflow-action-custom-webhook","status":"publish","type":"docs","link":"https:\/\/onesystemcrm.com\/help\/Supports\/workflow-action-custom-webhook\/","title":{"rendered":"Workflow Action &#8211; Custom webhook"},"content":{"rendered":"<h1 id=\"\u200b\u200bWhat-is-Custom-Webhook?\"><strong>What is Custom Webhook?<\/strong><\/h1>\n<p class=\"p2\">Custom Webhook is an outbound workflow action that makes an HTTP request to a URL you choose. When a workflow run reaches this step, OneSystemCRM assembles your headers, parameters, and payload (including mapped dynamic values) and sends the request to the external system.<\/p>\n<hr \/>\n<h2 id=\"Key-Benefits-of-Custom-Webhook\"><strong>Key Benefits of Custom Webhook<\/strong><\/h2>\n<p class=\"p2\">Understanding where Custom Webhook shines helps you pick the right automation tool and structure requests correctly for your provider.<\/p>\n<ul>\n<li class=\"p1\"><span class=\"s1\"><strong>Flexible methods:<\/strong><\/span>\u00a0Use GET, POST, PUT, DELETE to match any API operation.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><strong>Authentication options:<\/strong><span class=\"s1\">\u00a0<\/span><strong>Bearer token<\/strong><span class=\"s1\">,\u00a0<\/span><strong>API key<\/strong><span class=\"s1\">,\u00a0<\/span><strong>Basic Auth<\/strong><span class=\"s1\">,\u00a0<\/span><strong>OAuth2<\/strong><span class=\"s1\">, or\u00a0<\/span><strong>No auth<\/strong><span class=\"s1\">\u00a0with custom headers.<\/span><\/li>\n<\/ul>\n<ul>\n<li class=\"p1\" dir=\"ltr\"><span class=\"s1\"><strong>Precise data mapping:<\/strong><\/span>\u00a0<span class=\"s1\"><strong>Dynamic values<\/strong><\/span>\u00a0(e.g.,\u00a0<span class=\"s2\">{{contact.email}}<\/span>) populate headers, params, or body so every call includes the right record details.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><span class=\"s1\"><strong>Reusable patterns:<\/strong><\/span>\u00a0Build once, reuse across workflows with consistent headers, content types, and payload shapes.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\" dir=\"ltr\"><span class=\"s1\"><strong>Faster troubleshooting:<\/strong><\/span>\u00a0Optional response capture and workflow execution logs streamline testing and issue resolution.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Authentication-Options\"><strong>Authentication Options<\/strong><\/h2>\n<p class=\"p2\">External APIs often require credentials. Choose the option your provider supports and place secrets in headers\u2014not URLs\u2014for better security.<\/p>\n<ul>\n<li>\n<p class=\"p1\"><strong>Bearer Token<\/strong><\/p>\n<p class=\"p2\"><span class=\"s1\">Use header\u00a0<\/span>Authorization: Bearer &lt;token&gt;<span class=\"s1\">.<\/span><\/p>\n<p class=\"p3\"><em>Example header:<\/em><\/p>\n<\/li>\n<\/ul>\n<pre><code dir=\"ltr\">Authorization: Bearer {{location.api_token}}<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\"><strong>API Key<\/strong><\/p>\n<p class=\"p2\">Most services expect a custom header (e.g.,\u00a0<span class=\"s1\">X-API-Key: &lt;key&gt;<\/span>). Only use query\u2011string keys if the provider requires it.<\/p>\n<p class=\"p2\"><em>Header example:<\/em><\/p>\n<\/li>\n<\/ul>\n<pre><code>X-API-Key: {{location.external_api_key}}<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\"><span class=\"s1\"><em>Query example (only if required):<\/em>\u00a0<\/span>?api_key={{location.external_api_key}}<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><strong>Basic Auth<\/strong><\/p>\n<p class=\"p2\">Provide\u00a0<span class=\"s1\"><strong>Username<\/strong><\/span>\u00a0and\u00a0<span class=\"s1\"><strong>Password<\/strong><\/span> in the action\u2019s Authorization fields. OneSystemCRM sends the proper <span class=\"s2\">Authorization: Basic &#8230;<\/span>\u00a0header.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><strong>OAuth2<\/strong><\/p>\n<p class=\"p2\">If your provider uses OAuth2, first configure the token in\u00a0<span class=\"s1\"><strong>Global Workflow Settings \u2192 OAuth2 \/ Manage Tokens<\/strong><\/span>, then select it in the action. OAuth2 is recommended for providers that rotate or refresh tokens automatically.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><strong>No Auth + Custom Header<\/strong><\/p>\n<p class=\"p2\">If your provider asks for a bespoke header (e.g.,\u00a0<span class=\"s1\">X-Signature: &lt;secret&gt;<\/span>), choose\u00a0<span class=\"s2\"><strong>No auth<\/strong><\/span>, then add the header under\u00a0<span class=\"s2\"><strong>Headers<\/strong><\/span>.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"HTTP-Methods-&amp;-Request-Components\"><strong>HTTP Methods &amp; Request Components<\/strong><\/h2>\n<p class=\"p3\">Matching the correct method and placing data in the right part of the request prevents 400\/401\/422 errors and speeds up integrations.<\/p>\n<ul>\n<li class=\"p1\"><strong dir=\"ltr\">URL &amp; Path Parameters:\u00a0<\/strong><span class=\"s1\" dir=\"ltr\">You can include variables in the path, e.g.,\u00a0<\/span>https:\/\/api.example.com\/contacts\/{{contact.id}}<span class=\"s1\">.<\/span><\/li>\n<\/ul>\n<ul>\n<li class=\"p1\" dir=\"ltr\"><strong dir=\"ltr\">GET:\u00a0<\/strong>Retrieve data. Bodies are typically ignored\u2014use query parameters:\u00a0<a href=\"https:\/\/api.example.com\/leads?email={{contact.email}}&amp;status=active\">https:\/\/api.example.com\/leads?email={{contact.email}}&amp;status=active<\/a><\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><strong dir=\"ltr\">POST:\u00a0<\/strong>Create resources. Send a JSON body or form data (see Content\u2011Type).<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><strong dir=\"ltr\">PUT:\u00a0<\/strong>Update resources. Usually requires an ID in the path and a JSON body.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><strong dir=\"ltr\">DELETE:\u00a0<\/strong>Remove resources. Often includes the ID in the path.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\"><strong dir=\"ltr\">Content\u2011Type:\u00a0<\/strong>Common values:\u00a0<span class=\"s1\">application\/json<\/span>\u00a0(JSON body) or\u00a0<span class=\"s1\">application\/x-www-form-urlencoded<\/span>\u00a0(form fields). Match your provider\u2019s docs.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Event-vs-Method-(UI-Behavior)\"><strong>Event vs Method (UI Behavior)<\/strong><\/h2>\n<p class=\"p3\" dir=\"ltr\">The Custom Webhook action offers two configuration modes.\u00a0<span class=\"s2\"><strong>CUSTOM<\/strong><\/span>\u00a0exposes full control (method, content type, raw body).\u00a0<span class=\"s2\"><strong>GET\/POST<\/strong><\/span>\u00a0offer simplified experiences. Pick the mode that matches your provider\u2019s requirements.<\/p>\n<ul>\n<li>\n<p class=\"p1\"><strong>Event = CUSTOM (advanced):<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">Shows\u00a0<span class=\"s1\"><strong>Method<\/strong><\/span>\u00a0(GET, POST, PUT, DELETE),\u00a0<span class=\"s1\"><strong>Content-Type<\/strong><\/span>, and\u00a0<span class=\"s1\"><strong>Raw Body<\/strong><\/span>\u00a0editor for JSON or other formats.<\/p>\n<\/li>\n<li>\n<p class=\"p1\">Best when you need JSON payloads, non\u2011POST methods, or explicit headers\/content types.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p class=\"p1\"><strong>Event = POST (simple):<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">Shows\u00a0<span class=\"s1\"><strong>Body (Key and Value)<\/strong><\/span>\u00a0pairs for a form\u2011style payload; no Raw Body editor.<\/p>\n<\/li>\n<li>\n<p class=\"p1\">Use for simple key\/value submissions. Switch to\u00a0<span class=\"s1\"><strong>CUSTOM<\/strong><\/span>\u00a0if your provider expects JSON.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p class=\"p1\"><strong>Event = GET (simple):<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">No request body. Use\u00a0<span class=\"s1\"><strong>Query Parameters<\/strong><\/span>\u00a0for filters.\u00a0<span class=\"s1\"><strong>Save response from this Webhook<\/strong><\/span>\u00a0is available.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p class=\"p1\"><strong>Event picker:<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">The\u00a0<span class=\"s1\"><strong>Event<\/strong><\/span>\u00a0dropdown controls which fields appear. Choose\u00a0<span class=\"s1\"><strong>CUSTOM<\/strong><\/span>\u00a0for full control.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p class=\"p1\"><strong>Variable picker:<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">The small\u00a0<em>tag<\/em>\u00a0icon next to fields (URL, Headers, Query Params, Body) opens the dynamic value picker to insert values like\u00a0<span class=\"s1\">{{contact.id}}<\/span>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Headers-&amp;-Query-Parameters\"><strong>Headers &amp; Query Parameters<\/strong><\/h2>\n<p class=\"p3\">APIs commonly require specific headers and query parameters for auth, content type, versioning, or filtering. Map dynamic values when needed.<\/p>\n<ul>\n<li>\n<p class=\"p1\"><strong>Headers (examples):<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code>Authorization: Bearer {{location.api_token}} Content-Type: application\/json X-API-Key: {{location.external_api_key}} X-App-Version: 2024-11-01<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\"><strong>Query parameters (examples):<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code>lead_id={{contact.id}} email={{contact.email}} source=workflow<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\">Avoid putting secrets in query strings unless your provider requires it.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Payload-&amp;-Field-Mapping\"><strong>Payload &amp; Field Mapping<\/strong><\/h2>\n<p class=\"p3\" dir=\"ltr\">Dynamic values let you personalize each request with contact, opportunity, or other workflow data\u2014shaped to match the external API.<\/p>\n<ul>\n<li>\n<p class=\"p1\"><strong>Flat JSON payload (POST \/ create):<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code>{  \"id\": \"{{contact.id}}\",  \"first_name\": \"{{contact.first_name}}\",  \"last_name\": \"{{contact.last_name}}\",  \"email\": \"{{contact.email}}\",  \"phone\": \"{{contact.phone}}\" }<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\"><strong>Nested JSON:<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code>{  \"contact\": {    \"id\": \"{{contact.id}}\",    \"name\": \"{{contact.name}}\",    \"phones\": [\"{{contact.phone}}\"],    \"tags\": [\"{{contact.tag}}\", \"new-lead\"]  } }<\/code><\/pre>\n<ul>\n<li>\n<p class=\"p1\" dir=\"ltr\"><span class=\"s1\"><strong>Form\u2011encoded:<\/strong><\/span>\u00a0Set Content\u2011Type to\u00a0<span class=\"s2\">application\/x-www-form-urlencoded<\/span>\u00a0and provide key\/value pairs instead of JSON.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Testing-&amp;-Troubleshooting\"><strong>Testing &amp; Troubleshooting<\/strong><\/h2>\n<p class=\"p4\">Validating requests before you go live prevents broken automations. Use both provider\u2011side tools and workflow logs.<\/p>\n<ul>\n<li class=\"p1\">Use\u00a0<span class=\"s1\"><strong>Test Workflow<\/strong><\/span>\u00a0(draft mode) with a sample record to trigger the action.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\">Send test calls to tools like\u00a0<span class=\"s1\"><strong>Webhook.site<\/strong><\/span>\u00a0or\u00a0<span class=\"s1\"><strong>Postman<\/strong><\/span>\u00a0collections to confirm headers, params, and payload shape.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\">Verify basics first: correct URL, method,\u00a0<span class=\"s1\"><strong>Content\u2011Type<\/strong><\/span>, required headers, and valid credentials.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\">Check\u00a0<span class=\"s1\"><strong>Execution Logs<\/strong><\/span>\u00a0\/ run history to confirm the action fired and review status codes.<\/li>\n<\/ul>\n<ul>\n<li class=\"p1\">If you don\u2019t see\u00a0<span class=\"s1\"><strong>Content\u2011Type<\/strong><\/span>\u00a0or a\u00a0<span class=\"s1\"><strong>Raw Body<\/strong><\/span>\u00a0editor, verify the\u00a0<span class=\"s1\"><strong>Event<\/strong><\/span>\u00a0selection. Choose\u00a0<span class=\"s1\"><strong>CUSTOM<\/strong><\/span>\u00a0for JSON payloads or\u00a0<span class=\"s1\"><strong>PUT\/DELETE<\/strong><\/span>\u00a0requests.<\/li>\n<\/ul>\n<ul>\n<li>\n<p class=\"p1\">Common HTTP responses:<\/p>\n<ul>\n<li>\n<p class=\"p1\"><span class=\"s1\"><strong>400\/422<\/strong><\/span>\u00a0Invalid payload \u2192 match the provider\u2019s required fields and types.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><span class=\"s1\"><strong>401\/403<\/strong><\/span>\u00a0Unauthorized\/Forbidden \u2192 fix token, key, scope, or account permissions.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><span class=\"s1\"><strong>404<\/strong><\/span>\u00a0Wrong path\/ID \u2192 confirm endpoint and path variables.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><span class=\"s1\"><strong>409<\/strong><\/span>\u00a0Conflict\/idempotency \u2192 ensure unique IDs or follow provider\u2019s upsert rules.<\/p>\n<\/li>\n<li>\n<p class=\"p1\"><span class=\"s1\"><strong>429<\/strong><\/span>\u00a0Rate limited \u2192 slow down or add delays\/retries per provider limits.<\/p>\n<\/li>\n<li>\n<p class=\"p1\" dir=\"ltr\"><span class=\"s1\"><strong>5xx<\/strong><\/span>\u00a0Provider error \u2192 retry later and contact provider support.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"How-To-Set-Up-Custom-Webhook\"><strong dir=\"ltr\">How To Set Up Custom Webhook<\/strong><\/h2>\n<p class=\"p3\">A clear, repeatable setup reduces errors and ensures your requests match the provider\u2019s expectations. Use the steps below to configure the URL, event\/method, authorization, headers\/params, and payload correctly before testing.<\/p>\n<h3 id=\"Open-your-workflow\"><strong>Open your workflow<\/strong><\/h3>\n<p class=\"p3\">Navigate to\u00a0<span class=\"s2\"><strong>Automation \u2192 Workflows<\/strong><\/span>\u00a0and open the workflow where you want to send data so the run reaches this action with the right record context.<\/p>\n<p class=\"p3\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060390113\/original\/9QPiR4rF7uyh_YfNxki6M-a8FESN4-dekw.png?1765448444\" data-attachment=\"[object Object]\" data-id=\"155060390113\" data-index=\"0\" \/><\/p>\n<h3 id=\"Add-the-action\"><strong>Add the action<\/strong><\/h3>\n<p class=\"p3\">Click\u00a0<span class=\"s2\"><strong>+ Add action \u2192 Send Data \u2192 Custom Webhook<\/strong><\/span>\u00a0to create the step that will make the outbound HTTP call. Screenshot (placeholder): Action Drawer \u2014 Add the Custom Webhook action from Send Data. Alt text: Workflow action drawer showing Webhook and Custom Webhook.<\/p>\n<p class=\"p3\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060390153\/original\/ZfDK-0LbEyoBv-aDfjdBYq1kqyPxyV526Q.png?1765448467\" data-attachment=\"[object Object]\" data-id=\"155060390153\" data-index=\"1\" \/><\/p>\n<h3 id=\"Name-the-action\"><strong dir=\"ltr\">Name the action<\/strong><\/h3>\n<p class=\"p3\">Give the action a clear, descriptive name to simplify reading and troubleshooting later; for example,\u00a0<span class=\"s2\"><strong>Send Lead to External CRM<\/strong><\/span>.<\/p>\n<p class=\"p3\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060390603\/original\/m62IhxkcMDBAgaYHRb1wS2nhIMO1Sm2R5A.png?1765448710\" data-attachment=\"[object Object]\" data-id=\"155060390603\" data-index=\"2\" \/><\/p>\n<h3 id=\"Select-the-Event-(and-Method-when-applicable)\"><strong>Select the Event (and Method when applicable)<\/strong><\/h3>\n<p class=\"p3\" dir=\"ltr\">Choose the\u00a0<span class=\"s2\"><strong>Event<\/strong><\/span>\u00a0that matches your use case.\u00a0<span class=\"s2\"><strong>CUSTOM<\/strong><\/span>\u00a0reveals the\u00a0<span class=\"s2\"><strong>Method<\/strong><\/span>\u00a0picker (GET, POST, PUT, DELETE),\u00a0<span class=\"s2\"><strong>Content-Type<\/strong><\/span>, and a\u00a0<span class=\"s2\"><strong>Raw Body<\/strong><\/span>\u00a0editor for JSON or other formats.\u00a0<span class=\"s2\"><strong>POST<\/strong><\/span>\u00a0provides a simple\u00a0<span class=\"s2\"><strong>Body (Key and Value)<\/strong><\/span>\u00a0interface without a raw body editor.\u00a0<span class=\"s2\"><strong>GET<\/strong><\/span>\u00a0has no body; use\u00a0<span class=\"s2\"><strong>Query Parameters<\/strong><\/span>\u00a0to pass filters. The small tag icon next to fields opens the dynamic value picker (for example,\u00a0<span class=\"s3\">{{contact.id}}<\/span>).<\/p>\n<p class=\"p2\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060390671\/original\/v0KY7TzROj4I2rS8jMFuibS7UK835pXlhg.png?1765448732\" data-attachment=\"[object Object]\" data-id=\"155060390671\" data-index=\"3\" \/><\/p>\n<p class=\"p2\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391023\/original\/JyVoG0XaAdDiBdCMIE_qGJO4vO3YuSdYIA.png?1765448867\" data-attachment=\"[object Object]\" data-id=\"155060391023\" data-index=\"4\" \/><\/p>\n<h3 id=\"Enter-the-URL\"><strong dir=\"ltr\">Enter the URL<\/strong><\/h3>\n<p class=\"p3\" dir=\"ltr\">Paste your provider\u2019s endpoint and include variables in the path when needed, such as\u00a0<span class=\"s3\">https:\/\/api.example.com\/leads\/{{contact.id}}<\/span>, so each request targets the correct record.<\/p>\n<p class=\"p3\" dir=\"ltr\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391209\/original\/koqeFYqfE2cjsgJ-GggSa9u2J4CN3zj_0Q.png?1765448994\" data-attachment=\"[object Object]\" data-id=\"155060391209\" data-index=\"5\" \/><\/p>\n<h3 id=\"Choose-Authorization\"><strong dir=\"ltr\">Choose Authorization<\/strong><\/h3>\n<p class=\"p3\" dir=\"ltr\">Select the authentication method required by the provider\u2014<span class=\"s2\"><strong>Bearer Token<\/strong><\/span>,\u00a0<span class=\"s2\"><strong>API Key<\/strong><\/span>,\u00a0<span class=\"s2\"><strong>Basic Auth<\/strong><\/span>,\u00a0<span class=\"s2\"><strong>OAuth2<\/strong><\/span>, or\u00a0<span class=\"s2\"><strong>None<\/strong><\/span>\u00a0(with custom headers)\u2014and supply credentials exactly as specified to avoid 401\/403 errors.<\/p>\n<p class=\"p3\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391256\/original\/wffqrtLfdnPbdcrxh4jIKduKTetW4nFjUw.png?1765449019\" data-attachment=\"[object Object]\" data-id=\"155060391256\" data-index=\"6\" \/><\/p>\n<h3 id=\"Add-Headers-and-Query-Parameters-(if-needed)\"><strong dir=\"ltr\">Add Headers and Query Parameters (if needed)<\/strong><\/h3>\n<p class=\"p3\" dir=\"ltr\">Provide required headers like\u00a0<span class=\"s2\"><strong>Content-Type<\/strong><\/span>,\u00a0<span class=\"s2\"><strong>Authorization<\/strong><\/span>, and any custom keys, and add query parameters for GET filters or URL-based options; dynamic values such as\u00a0<span class=\"s3\">email={{contact.email}}<\/span>\u00a0ensure each call is personalized.<\/p>\n<p class=\"p2\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391899\/original\/5E42VGNcB9xSmInW79qF_9f2KM2dceWCeA.png?1765449370\" data-attachment=\"[object Object]\" data-id=\"155060391899\" data-index=\"7\" \/><\/p>\n<h3 id=\"\"><\/h3>\n<p class=\"p2\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391923\/original\/AnPUTd3sfl7O0czLwRfiEQ0fY1iL5yIASg.png?1765449387\" data-attachment=\"[object Object]\" data-id=\"155060391923\" data-index=\"8\" \/><\/p>\n<h3 id=\"Save-response-from-this-Webhook-(optional)\"><strong>Save response from this Webhook (optional)<\/strong><\/h3>\n<p class=\"p3\">Enable response capture if it is available in your account to aid troubleshooting and record-keeping.<\/p>\n<p class=\"p2\"><img decoding=\"async\" class=\"fr-fil fr-dib fr-bordered fw-lightbox-img\" src=\"https:\/\/s3.amazonaws.com\/cdn.freshdesk.com\/data\/helpdesk\/attachments\/production\/155060391950\/original\/JffuOpTCujq23Ityc_ZX5-up2SSkRDsMMw.png?1765449407\" data-attachment=\"[object Object]\" data-id=\"155060391950\" data-index=\"9\" \/><\/p>\n<h3 id=\"Save-and-test\"><strong>Save and test<\/strong><\/h3>\n<p class=\"p3\" dir=\"ltr\">Click\u00a0<span class=\"s2\"><strong>Save Action<\/strong><\/span>, trigger a test with a sample record or a sandbox endpoint such as Webhook.site or Postman, and review\u00a0<span class=\"s2\"><strong>Execution Logs<\/strong><\/span>\u00a0alongside provider logs to confirm status codes and payload shape before going live.<\/p>\n<p class=\"p4\"><strong>Additional screenshot placeholders (add later if available):<\/strong><\/p>\n<ul>\n<li>\n<p class=\"p1\">OAuth2 token management: Global Workflow Settings \u2192 OAuth2 \/ Manage Tokens (token redacted).<\/p>\n<\/li>\n<li>\n<p class=\"p1\">Execution Logs showing a successful 200 response.<\/p>\n<\/li>\n<li>\n<p class=\"p1\">Postman\/Webhook.site confirming receipt of the payload.<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"Frequently-Asked-Questions\"><strong>Frequently Asked Questions<\/strong><\/h2>\n<p class=\"p4\"><strong>Q: Do I need a specific workflow trigger for Custom Webhook to work?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">No. Any workflow trigger can be used. Ensure your mapped variables (e.g., contact fields) exist at runtime.<\/p>\n<p class=\"p4\"><strong>Q: My provider requires a static IP allowlist. Can OneSystemCRM provide one?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">No. Use header\u2011based authentication (Bearer\/API Key\/Basic\/OAuth2) instead and share the required credentials with your provider.<\/p>\n<p class=\"p4\"><strong><span dir=\"ltr\">Q: Where do I put my API key header or query string?<\/span><\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">Prefer a header (e.g.,\u00a0<span class=\"s3\">X-API-Key<\/span>). Only use query\u2011string keys if the provider specifically requires it.<\/p>\n<p class=\"p4\"><strong>Q: Why am I getting 401\/403 errors?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">Invalid or missing credentials, wrong auth type, expired token, or insufficient scopes\/permissions. Re\u2011check Authorization and required headers.<\/p>\n<p class=\"p4\"><strong>Q: The provider says my JSON is invalid (400\/422). What should I check?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">Confirm\u00a0<span class=\"s2\"><strong>Content\u2011Type<\/strong><\/span>, required fields, data types, and nested structure. Compare to the provider\u2019s schema or run a Postman test.<\/p>\n<p class=\"p4\"><strong>Q: Can I include arrays or nested objects in the payload?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">Yes. Build nested JSON or arrays and map dynamic values where needed (see examples above).<\/p>\n<p class=\"p4\"><strong>Q: Can I capture and review the response?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">If available in your account, enable\u00a0<span class=\"s2\"><strong>Save response from this Webhook<\/strong><\/span>\u00a0and review the workflow\u2019s\u00a0<span class=\"s2\"><strong>Execution Logs<\/strong><\/span>\u00a0and provider logs.<\/p>\n<p class=\"p4\"><strong>Q: How do I decide between Custom Webhook and Webhook (Outbound)?<\/strong><\/p>\n<p class=\"p3\" dir=\"ltr\">Use\u00a0<span class=\"s2\"><strong>Custom Webhook<\/strong><\/span>\u00a0when you need advanced auth and flexible request building. Use\u00a0<span class=\"s2\"><strong>Webhook (Outbound)<\/strong><\/span>\u00a0for simpler, pre\u2011defined patterns.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is Custom Webhook? Custom Webhook is an outbound workflow action that makes an HTTP request to a URL you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"doc_category":[77],"doc_tag":[],"class_list":["post-1570","docs","type-docs","status-publish","hentry","doc_category-webhooks-workflow-actions"],"year_month":"2026-07","word_count":1539,"total_views":"12","reactions":{"happy":"0","normal":"0","sad":"0"},"author_info":{"name":"usamasaeed219","author_nicename":"usamasaeed219","author_url":"https:\/\/onesystemcrm.com\/help\/author\/usamasaeed219\/"},"doc_category_info":[{"term_name":"Webhooks Workflow Actions","term_url":"https:\/\/onesystemcrm.com\/help\/Supports-category\/webhooks-workflow-actions\/"}],"doc_tag_info":[],"knowledge_base_info":[],"knowledge_base_slug":[],"_links":{"self":[{"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/docs\/1570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/comments?post=1570"}],"version-history":[{"count":1,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/docs\/1570\/revisions"}],"predecessor-version":[{"id":1571,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/docs\/1570\/revisions\/1571"}],"wp:attachment":[{"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/media?parent=1570"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/doc_category?post=1570"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/onesystemcrm.com\/help\/wp-json\/wp\/v2\/doc_tag?post=1570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}