> ## Documentation Index
> Fetch the complete documentation index at: https://deepline.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Warm outbound automation

> Turn a Warmly Website Visit Contact event into a human-reviewed outbound action without automatically sending or writing to a destination.

[Human guide: work with your agent →](https://deepline.com/docs/human/recipes/warm-outbound-web-intent.md)

> [!NOTE]
>
> Convert one authorized visitor event into a reviewed proposal without
> automatic outreach.

Use this guide to turn a Warmly **Website Visit Contact** event into a reviewed
outbound lead. Warmly pushes the visitor event to your webhook. The Play
normalizes it, applies your rules, and stops before any external activation
until a human approves it.

![Warmly sends a website visitor event to a Deepline Play, which either stops the event or routes it to human review before activation.](https://mintcdn.com/deepline2/f_FY_i-dtVrozrGn/images/warmly-deepline-flow.png?fit=max\&auto=format\&n=f_FY_i-dtVrozrGn\&q=85\&s=1a8a562a7dc41dd918e10d425d6374f4)

Warmly sends the visitor event. The Play either records a reason to stop or sends a qualified lead to human review.

## Prerequisites

* A Warmly source that can send **Website Visit Contact** events.
* A reviewer and a review destination, such as a Slack queue or CRM review
  field.
* ICP, suppression, deduplication, and approval rules that the Play can apply.
* A connected Deepline workspace and a local project folder for the Play file.

## Create the Play

Give your coding agent this request:

```text theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
/deepline-gtm Create warmly-warm-outbound.play.ts.

Use a webhook binding and a top-level Play description. Accept Warmly's raw
Website Visit Contact JSON. Normalize business email, LinkedIn URL, company
name, website, title, session ID, seen time, and pages viewed.

Deduplicate by stable visitor/session identity, LinkedIn URL, email, and any
campaign-membership rule we provide. Apply deterministic ICP and suppression
rules before paid enrichment or AI work. For every stopped event, return
status=skipped and a miss_reason. For a qualified event, draft an opener from
the page signal and route it to human review.

Do not send an email, add someone to a campaign, or write to a CRM until a
human approval step succeeds. Show the input mapping and every activation
boundary before running or publishing the Play.
```

Use the source system's supported webhook verification method when it provides
one. Keep the webhook URL and any signing secret out of source control.

## Validate it without deploying or spending credits

Check the local Play before it is published or receives an event:

```bash theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
deepline plays check ./warmly-warm-outbound.play.ts
```

`plays check` validates the local artifact. It does not publish the Play, create
a run, or call an enrichment provider.

## Publish and configure Warmly

After you review the checked source, publish it:

```bash theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
deepline plays publish ./warmly-warm-outbound.play.ts
```

Copy `triggerMetadata.webhookUrl` from the JSON response. Treat the full URL as
a secret.

![Webhook node shown as the entry point in the Deepline Plays interface.](https://mintcdn.com/deepline2/f_FY_i-dtVrozrGn/images/warmly-webhook-node.png?fit=max\&auto=format\&n=f_FY_i-dtVrozrGn\&q=85\&s=75e40f42c7ee4a9e7ff0c888fa469408)

The Webhook node is the entry point for each Warmly event.

In Warmly:

* On the free tier, open **Settings > Webhooks**, paste the full URL, and save.
* On a paid tier, use **Orchestrator**: choose **Website Visit Contact**, add
  **Send Contact to Webhook**, paste the full URL, and activate the orchestration.

Use **Send Company to Webhook** only when your Play is designed for
company-level events. See [Warmly's webhook guide](https://help.warmly.ai/articles/7839413626-setting-up-webhooks) for its current setup and payload details.

## Map the event fields

| Warmly field | Play field |
| - | - |
| `Business Email` | `email` |
| `LinkedIn URL` | `linkedin_url` |
| `First Name`, `Last Name` | `first_name`, `last_name` |
| `Company Name`, `Website` | `company_name`, `domain` |
| `Title`, `Industry` | `title`, `industry` |
| `Session ID`, `Seen At` | Deduplication and event identity |
| `Pages Viewed Details` | Page-signal evidence |

Keep the raw event available for debugging, but write the normalized fields your
logic needs. Do not assume all visitor events identify a person. A company-only
event should stop with its recorded reason.

## Test one event and inspect the result

Send one controlled Warmly test event. Then inspect the newest run:

```bash theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
PLAY_NAME="warmly-warm-outbound"
deepline runs list --play "$PLAY_NAME" --limit 1

printf 'Paste a run ID from the list: '
read -r RUN_ID
deepline runs get "$RUN_ID" --full
deepline runs logs "$RUN_ID" --limit 200
```

Check that the event is normalized, deduplicated, and either stopped with a
`miss_reason` or routed to the designated human reviewer. Confirm that no CRM,
campaign, or email action ran before approval.

## Next step

For webhook authentication and other trigger patterns, read [Webhooks and
schedules](https://deepline.com/docs/sdk-v2/webhooks-and-schedules.md). For the research that supports a
reviewed outbound action, read [Research accounts before
outreach](https://deepline.com/docs/recipes/research-workflow.md).

## Verify this task

Verify the inbound authentication, payload mapping, account identity, and review output. Keep campaign activation disabled during the pilot.

Ask your agent to explain a failed check before repeating work or expanding the scope.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.