---
title: Make
description: Wire an HTTP module into a Make scenario to fire heartbeats with cost and status.
section: integrations
order: 4
---

# Make

Every Make scenario can end with an HTTP heartbeat. One HTTP module on the success path, one on the error route. Same shape as the [n8n](/docs/integrations/n8n) and [Zapier](/docs/integrations/zapier) docs.

## Setup

1. In your scenario, add a connection variable `AGENTPING_PING_TOKEN`. Paste the per-agent ping token from the AgentPing settings page.
2. At the end of the success path, add an HTTP module configured as below.
3. Add an Error handler route on any module that can fail; point it at a second HTTP module with `status=fail`.

## The success heartbeat

HTTP module configuration:

- **URL**: `https://eu.ingest.agentping.io/v1/ping`
- **Method**: `GET`
- **Query string**:

| Key | Value |
|-----|-------|
| `key` | `{{connection.AGENTPING_PING_TOKEN}}` |
| `agent` | `customer-enrichment` |
| `status` | `ok` |
| `duration_ms` | `{{round((now - executionStart) * 1000)}}` |

The dashboard shows the run within a second. For richer payloads, use a POST against `/v1/heartbeats` with a JSON body assembled from Make expressions.

## Capturing cost

If your scenario calls an LLM via Make's OpenAI or Anthropic modules, the response includes `usage.prompt_tokens` and `usage.completion_tokens`. Add a "Set variable" module to compute cost:

```
cost_usd = (1.usage.prompt_tokens / 1000000) * 5.00 + (1.usage.completion_tokens / 1000000) * 15.00
```

Pipe `cost_usd` into the heartbeat as a query parameter. See [Heartbeats](/docs/pulse/heartbeats) for why heartbeat cost is trusted as-supplied.

## The error heartbeat

On any module that can fail, right-click → "Add error handler" → "Resume". Route the error path to a second HTTP module:

- **URL**: `https://eu.ingest.agentping.io/v1/ping`
- **Method**: `GET`
- **Query string**:

| Key | Value |
|-----|-------|
| `key` | `{{connection.AGENTPING_PING_TOKEN}}` |
| `agent` | `customer-enrichment` |
| `status` | `fail` |
| `metadata` | `{{1.error.message}}` |

Two modules, same agent slug, opposite outcomes.

## Schedule monitoring

If the scenario runs on a Make schedule (every 15 minutes, daily at 3am, etc.), set the same cron on the agent in the dashboard. [Pulse](/docs/pulse) pages you when an expected fire is missed; Make doesn't notify you when a scheduled scenario fails to start.

## Idempotency

For long scenarios with retries, include Make's execution ID as the run ID so retries are deduplicated:

```
id = run_eu_{{ replace(executionId, "-", "") }}
```

Heartbeat retries with the same `id` and matching fields are 200 no-ops. See [Identifiers](/docs/concepts/identifiers).

:::warning
Put the ping token in a Make connection variable, not inline in the HTTP module. Connection variables are encrypted at rest and don't appear in execution history. Never paste an `apk_` API key into Make. See [Authentication](/docs/api/auth).
:::
