<!-- BusyBot node reference — https://busybot.net/tools/keap-trigger/ -->

> Node: Keap Trigger (`keap_trigger`) · Webhook trigger · v1
> Category: Marketing · Credentials: Keap OAuth2 (`keapOAuth2Api`)
> Updated: 2026-08-16

# Keap Trigger

> Triggers on Keap CRM events such as contact changes, invoices, orders, and opportunities

## Overview

Receives webhook notifications from Keap (formerly Infusionsoft) when CRM events occur, such as contact creation, invoice payments, opportunity stage changes, order placements, task completions, and more. Keap uses a confirmation handshake protocol: when a webhook is first registered, Keap sends a request with an x-hook-secret header that must be echoed back. Once verified, subsequent event payloads contain event_key, object_type, and an array of object_keys with id, timestamp, and apiUrl references. Supports both raw data mode (full payload as-is) and normalized mode (individual items per object key). Events are selected from the full set of Keap webhook event keys. Useful for automating CRM workflows, syncing contacts to other systems, triggering follow-ups on deal changes, and building notification pipelines around Keap activity.

**Category:** Marketing  
**Tool Name:** `keap_trigger`  
**Version:** 1

**Appearance:** Icon: `lucide-CircleDollarSign` | Color: `#159570`

## Node Type

**Trigger** — webhook (receives incoming HTTP callbacks)

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | None (trigger node) |
| Output | `Output` |

## Credentials

This tool requires **Keap OAuth2** credentials.
See the [Credentials Guide](https://busybot.net/credentials/keap-oauth2-api/) for setup instructions.

### Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Keap Account | `credential` | No | — | Connect your Keap account via OAuth2. |
| Event | `options` | Yes | — | Which Keap event to listen for. Events are fired when the corresponding CRM action occurs. |
| | | | | Options: `company.add`, `company.delete`, `company.edit`, `contact.add`, `contact.delete`, `contact.edit`, `contact.email`, `contact.form`, `contact.note`, `contact.submit`, `contact.tag.add`, `contact.tag.remove`, `invoice.add`, `invoice.delete`, `invoice.edit`, `invoice.payment.add`, `invoice.payment.delete`, `note.add`, `note.delete`, `note.edit`, `opportunity.add`, `opportunity.delete`, `opportunity.edit`, `order.add`, `order.delete`, `order.edit`, `task.add`, `task.complete`, `task.delete`, `task.edit`, `tag.add`, `tag.delete`, `tag.edit`, `appointment.add`, `appointment.delete`, `appointment.edit`, `email.bounce`, `email.click`, `email.complete`, `email.open`, `email.optIn`, `email.optOut`, `email.send`, `email.statusReport` |
| RAW Data | `boolean` | No | `false` | Whether to return the data exactly as received from the Keap API, or normalize it into individual items per object key. |

One node subscribes to one event. To react to several events, add one Keap Trigger node per event.

## Output Data

With **RAW Data** off (the default), Keap's `object_keys` array is expanded so that **each referenced record becomes its own output item**:

```json
{
  "_trigger": "keap_webhook",
  "_timestamp": "2026-01-01T00:00:00.000Z",
  "_webhookEvent": "contact.add",
  "eventKey": "contact.add",
  "objectType": "contact",
  "id": "123",
  "timestamp": "2026-01-01T00:00:00.000Z",
  "apiUrl": "https://api.infusionsoft.com/crm/rest/v1/contacts/123"
}
```

- `eventKey` — the Keap event key from the payload's `event_key`.
- `objectType` — the payload's `object_type`, for example `contact`.
- `id`, `timestamp`, `apiUrl` — one entry from the payload's `object_keys` array. `apiUrl` is the Keap REST URL for the record, so a downstream HTTP Request node can fetch the full object.

With **RAW Data** on, a single item carries the Keap payload exactly as sent, under the same three metadata fields:

```json
{
  "_trigger": "keap_webhook",
  "_timestamp": "2026-01-01T00:00:00.000Z",
  "_webhookEvent": "contact.add",
  "event_key": "contact.add",
  "object_type": "contact",
  "object_keys": []
}
```

- `_trigger` — always `keap_webhook`.
- `_timestamp` — ISO 8601 timestamp of when the delivery arrived.
- `_webhookEvent` — the payload's `event_key`.

If a delivery arrives with no `object_keys`, one item is emitted carrying `eventKey`, `objectType` and the rest of the payload. Keap's initial verification request is answered with the required handshake header and does not start the workflow.

Reference values downstream by expression, for example `{{ $json.id }}` or `{{ $json.apiUrl }}`.

## Usage Examples

- Start a workflow when a new contact is added in Keap
- Trigger a notification when an invoice is paid in Infusionsoft
- Automate follow-ups when a contact is updated in Keap
- Sync data to another system when a Keap opportunity stage changes

## Example Configuration

Fire when a contact is added:

```json
{
  "type": "keap_trigger",
  "parameters": {
    "eventId": "contact.add",
    "rawData": false
  }
}
```

Fire when an invoice payment is recorded:

```json
{
  "type": "keap_trigger",
  "parameters": {
    "eventId": "invoice.payment.add",
    "rawData": false
  }
}
```

Track opportunity edits and keep the payload untouched:

```json
{
  "type": "keap_trigger",
  "parameters": {
    "eventId": "opportunity.edit",
    "rawData": true
  }
}
```

React to email engagement:

```json
{
  "type": "keap_trigger",
  "parameters": {
    "eventId": "email.click",
    "rawData": false
  }
}
```

### Trigger Behavior

- **Activation:** When the workflow is activated, a webhook endpoint is registered with the service.
- **Deactivation:** The webhook is automatically unregistered when the workflow is deactivated.
- **Payload:** The incoming webhook payload is parsed and output as workflow items.
- **Verification:** Supports signature verification where applicable.

## Tips

Entry point that fires when Keap sends a webhook for a subscribed CRM event. Select which event to listen for (e.g., contact.add, invoice.add, opportunity.add). Keap uses a handshake protocol: on webhook creation, it sends an x-hook-secret header that must be echoed back. Once confirmed, event payloads include event_key, object_type, and object_keys with id, timestamp, and apiUrl. Enable RAW Data to receive the full payload as-is, or leave it off for normalized individual items.