Home Main category Outgoing Webhooks

Outgoing Webhooks

Last updated on Mar 11, 2026

Outgoing webhooks in Simply CRM let you send data to, or retrieve data from, an external system automatically when a workflow is triggered.

This is useful when you want to:

  • send CRM data to another system

  • fetch data from an external API

  • use the response from an external system to create or update records in Simply CRM

If you are new to webhooks, these related articles are also useful:


Where to find it

Go to:

Settings > Automation > Workflows

Create or edit a workflow, and in the Actions section choose Add WebHook.

If you need more background on workflows and webhook basics, see:


Main webhook settings

When adding an outgoing webhook, you can configure the following.

Action Title

An internal name for the webhook action.

Description

An optional internal description of what the webhook does.

URL to Notify

This is the external endpoint that Simply CRM will call.

Example:

https://api.example.com/offers

You can also include query parameters directly in the URL.


HTTP method

Choose the method that should be used for the request, for example:

  • GET

  • POST

The correct method depends on what the external system expects.


Authorization Type

You can choose how the request should be authenticated:

  • Basic Authentication

  • No Authentication

  • Token

  • Bearer Token

Use the type required by the receiving API.


Request Type

This controls how the data is sent.

A common option is:

  • query — sends data as query parameters

Use the request type required by the external system.


Key / Value fields

You can add as many key/value rows as needed.

  • Key = the parameter name

  • Value = the value to send

  • Header Field = if checked, the key/value pair is sent as a request header instead of normal request data

This can be used for:

  • fixed values

  • CRM field values

  • credentials

  • API keys

  • custom parameters required by the external API

Important behavior when selecting fields from dropdowns

When you select a field from a dropdown, * is appended automatically. This means the workflow will search values in the database dynamically.

If you type the field name manually instead of selecting it from the dropdown, it will not be overwritten automatically.

You can also manually enter your own custom parameter names.


Using predefined variables

You can use predefined variables in the webhook configuration.

This works in:

  • the URL

  • the Value fields

  • credentials such as username, password, token, API key, and similar fields

Examples:

  • $$global_wordpress_url$$

  • $$global_api_username$$

  • $$global_api_key$$

  • $$global_magento_apikey$$

These values are defined centrally under:

Admin > Predefined Settings

This is useful when:

  • the same integration is used in multiple workflows

  • credentials or base URLs should be maintained in one place

  • you want to avoid hardcoding sensitive values into every workflow

Example

Instead of writing:

https://my-wordpress-site.com/wp-json/custom-endpoint

you can write:

$$global_wordpress_url$$/wp-json/custom-endpoint

If the predefined setting is updated later, workflows using it will automatically use the new value.


Example: storing a temporary API token in a global value

A predefined value can also be filled from a webhook response and then reused in other webhook calls.

Example:

$$global_magento_apikey$$

This is useful when an external system requires a temporary token that only stays valid for a limited time, for example 1 hour.

Example setup

You could create a workflow with a timed trigger that runs every 45 minutes.

That workflow could contain a webhook that:

  1. logs in to Magento

  2. retrieves a valid API token

  3. saves that returned token into the predefined setting global_magento_apikey

Other workflows can then use:

$$global_magento_apikey$$

in their headers, URL values, or other webhook parameters.

This allows you to centralize token handling and reuse the latest valid token across multiple webhook actions.


Using date variables

You can also use dynamic date variables in the webhook.

Examples:

  • $$get_date('today')$$

  • $$get_date('yesterday')$$

These return dynamic date values when the workflow runs.

This is useful when the external API expects a date filter in the request, for example:

  • fetch records from today

  • fetch records from yesterday

  • limit returned data based on a date

Example

https://api.example.com/orders?date=$$get_date('today')$$

Or as a value:

  • Key: from_date

  • Value: $$get_date('yesterday')$$


Skip duplicates by saving and comparing past response

This option allows the webhook action to compare the newest response with the previous response.

When enabled:

  1. Simply CRM saves the latest webhook response

  2. on the next run, the new response is compared with the previously saved response

  3. if the response is identical to the last saved response, the action is skipped

This is useful when the webhook is used to regularly fetch data from an external system, but you only want Simply CRM to continue processing when the returned data has actually changed.

Typical use cases

  • polling an external API on a schedule

  • avoiding repeated creation of identical data

  • reducing unnecessary updates when the external result has not changed

Important note

This compares the full latest response against the previously saved response. If the response is unchanged, the webhook step is skipped.


Handle Response

The Handle Response section is used when you want to take values from the webhook response and save them into fields in Simply CRM.

For each row:

  • choose the destination CRM field on the left

  • define the source value from the webhook response on the right

Example response

[
  {
    "title": "Example Deal",
    "price": 2500,
    "customer_no": "CUST-1001",
    "created_on": "2025-03-01",
    "end_date": "2025-03-31"
  }
]

Example mapping

  • potentialname -> [*].title

  • amount -> [*].price

  • customer_no -> [*].customer_no

  • createdtime -> [*].created_on

  • closingdate -> [*].end_date

In this example, [*] means the response contains multiple records and that the mapping should use values from all returned items.


Extracting values from the response

You can extract values from the response using path expressions.

Multiple records

Use:

[*].customer_no

if you want the customer_no value from all returned records.

This is typically used when the response contains many records and you want Simply CRM to create or update multiple CRM records based on the returned data.

First record only

Use:

[0].customer_no

if you only want the value from the first record in the response.

This is useful when you only want to process the first returned item.

Nested arrays

You can also extract values from nested arrays.

Example:

items.[*].quantity

This means:

  • go into the items array

  • retrieve the quantity value from all records inside that array

You can use similar structures for other nested response formats.

Examples:

  • items.[*].sku

  • items.[*].name

  • data.[0].customer_no

  • response.items.[*].quantity

Nested object example

If the webhook response contains nested JSON objects, you can access sub-values using dot notation.

Example:

{
  "statistics": {
    "counts": {
      "all": 7380,
      "closed": 6954,
      "opened": 426
    }
  }
}

To get the value 426, use:

statistics.counts.opened

in the Handle Response source field.


Record Matching

The Record Matching dropdown allows you to define how Simply CRM should identify whether a returned record already exists.

Here you choose an existing field in Simply CRM that should act as the unique identifier.

Typical examples:

  • record number

  • email address

  • external ID

  • customer number

  • order number

How it works

When the webhook response is processed:

  1. Simply CRM reads the value from the mapped field in Handle Response

  2. it checks whether a record already exists with the same value in the field selected under Record Matching

  3. if a match is found, the existing record is updated

  4. if no match is found, a new record is created

Important requirement

For Record Matching to work, the matching value must also be filled in Handle Response.

That means you must first map the response value to a CRM field in Handle Response, and then select that same field in Record Matching.

If the value is not mapped in Handle Response, Simply CRM has nothing to compare against and cannot match existing records.

Example

If the response contains:

[
  {
    "customer_no": "CUST-1001",
    "title": "Example Deal",
    "price": 2500
  }
]

You could map:

  • customer_no -> [*].customer_no

  • potentialname -> [*].title

  • amount -> [*].price

Then choose customer_no in Record Matching.

Result:

  • if a record already exists with customer_no = CUST-1001, that record is updated

  • if no record with that customer number exists, a new record is created

This is especially useful when syncing data from external systems without creating duplicates.


Example setup

Below is a typical example of an outgoing webhook used to fetch records from an external API and create or update CRM records.

URL

$$global_external_api_url$$/offers

Authentication / header values

Examples:

  • Username -> $$global_api_username$$

  • Password -> $$global_api_password$$

  • APIKey -> $$global_api_key$$

If these should be sent as headers, enable Header Field on those rows.

Duplicate checking

Enable Skip duplicates by saving and comparing past response if you only want processing to continue when the response changes.

Handle Response example

  • potentialname -> [*].title

  • amount -> [*].price

  • customer_no -> [*].customer_no

  • createdtime -> [*].created_on

  • closingdate -> [*].end_date

Record Matching example

Choose a unique field such as:

  • customer number

  • email

  • order number

  • external ID

If a returned record matches an existing value in that field, the existing record is updated instead of creating a new one.


Testing and troubleshooting

When testing outgoing webhooks, check:

  • that the URL is correct

  • that the authentication type matches the external API

  • that required headers are marked as Header Field

  • that the response structure matches your Handle Response mappings

  • that the matching field in Record Matching is also mapped in Handle Response

For testing, tools like Postman and webhook.site are useful. The current webhooks overview article also recommends those tools. (help.simply-crm.com)

If records are not being updated as expected:

  • verify that the returned value really exists in the webhook response

  • verify that the target CRM field is mapped correctly

  • verify that the selected Record Matching field contains the same value in existing records

If no new data is being processed:

  • check whether Skip duplicates by saving and comparing past response is enabled

  • if enabled, the response may be identical to the previous run and therefore intentionally skipped


Related articles