# Settings → Conversions

The **Conversions** tab in Settings (`/settings?tab=automations`, group **Events and CAPI**) sends your real conversions (leads, bookings, sales, payments) back to the ad platforms, server-side, with no code. The older addresses `/settings/automations` and `/settings/automations/meta-capi` redirect to this tab.

Why it matters: ad platforms only optimize on what they can see. A sale closed on the phone three weeks after the click does not exist for Meta or Google until someone sends it back. Here, every event received by DURUM can be forwarded to the pixel or ad account of your choice, with the amount and the account currency.

The tab reads top to bottom: **connected destinations**, **conversions** (the workflows), **send log**.

## 1. Connected destinations

One card per platform: **Facebook**, **TikTok**, **Google**, **Snapchat**, **LinkedIn**, **ChatGPT** and **Whop**. Every connected card has a **Test** button that sends a verification event and shows the result ("Facebook OK, events_received: 1", for instance), plus any point to fix.

### Facebook (Meta)

Two ways to connect a pixel:

- **Connected account (recommended)**: when the Meta Ads account is already connected under Integrations, the dialog lists your pixels (field **Meta pixel (connected account)**). No token to paste. Optional **Test Event Code** field (leave empty for production mode).
- **Manual entry (System User)**: fields `Pixel ID`, `Access Token` (system user token) and an optional `Test Event Code`.

An account can hold **several pixels** (**+ Add a pixel**). Each pixel gets routing rules by domain and by URL path of the landing page; the pixel flagged **catch-all** receives everything no rule captures. A pixel with no rule that is not the catch-all receives nothing.

### Google

No token to paste: the card reuses the **Google Ads** connection made under Integrations. You pick a **conversion action** of type "Import, other data sources or CRM" (actions incompatible with import are flagged "not compatible with sending"). Several Google Ads accounts can be added; an account still used by a conversion cannot be removed. If the enhanced conversions terms are not accepted on the account, Google will refuse conversions carrying an email or a phone: the card says so.

### TikTok, Snapchat, LinkedIn, ChatGPT, Whop

| Platform | Fields requested |
|----------|------------------|
| TikTok | `Pixel Code`, `Access Token` (long-lived), optional `Test Event Code` |
| Snapchat | `Snap Pixel ID`, `Access Token`, optional `Test Event Code` |
| LinkedIn | `Conversion Rule ID / URN`, `Access Token` (scope `rw_conversions`) |
| ChatGPT | `Pixel ID` (`px_…`, OpenAI Ads Manager, Conversions tab), `Server-side key` |
| Whop | One-click connection (Business ID `biz_…` then authorization), or an API key as fallback |

Credentials are validated with a test call before being saved (**Validate & connect**). When editing, a secret field left empty keeps the current value.

## 2. Conversions (workflows)

A conversion = a DURUM **trigger**, optional **filters**, an optional **delay** and one or more **actions** (destination + event name). The guided creator does most of the work; the full editor lets you fine-tune.

### Triggers

| Trigger | DURUM event |
|---------|-------------|
| Lead | `lead` |
| Application | `application` |
| Booking (appointment) | `booking` |
| No-show | `no_show` |
| Sale | `sale` |
| Payment | `payment` |
| Refund | `refund` |
| New customer | `new_customer` (first paid purchase of a contact; full editor only) |

Your [custom events](https://docs.durum.ai/en/dashboard/how-we-count#custom-events-events-or-unique-contacts) are also offered as triggers. A trigger can also be a **webhook URL** specific to the workflow, for a tool that is not integrated.

### Filters

One or more conditions on the event data (`utm_source`, `utm_campaign`, `calendar_name`, `product_key` or any field in dotted notation), combined with AND / OR, using the operators equals, not equals, contains, does not contain, greater than, less than, exists, does not exist, in list, not in list. For `booking` and `no_show`, a **calendar** picker restricts sending to some calendars; with no selection, every booking is sent.

### Delay

**Wait before sending**: immediate, 5 minutes, 15 minutes, 1 hour, 6 hours, 1 day, 3 days, 7 days, or a custom duration up to 30 days.

### Actions

Each action targets a destination and an **event name** on the platform (standard list, or **Custom conversion** for a free name). The recommended name is preselected from the trigger:

| Trigger | Facebook | Google | TikTok |
|---------|----------|--------|--------|
| Lead | `Lead` | `Lead` | `Lead` |
| Application | `SubmitApplication` | `SubmitLeadForm` | `SubmitForm` |
| Booking | `Schedule` | `BookAppointment` | `Subscribe` |
| No-show | `Contact` | `Lead` | `Contact` |
| Sale, Payment, Refund | `Purchase` | `Purchase` | `CompletePayment` (`PlaceAnOrder` for a refund) |
| New customer | `NewClient` (custom conversion) | `SignUp` | `CompleteRegistration` |

Per-action options:

- Destination **pixel** when the Facebook account holds several pixels (otherwise automatic routing by page URL).
- **Google Ads account** and **conversion action** when several are connected; **Customer Match** checkboxes to also feed a customer list.
- **Test mode** with a `Test Event Code` (suggested code: `DURUMTEST`): the event only shows in the Test events tab of the events manager, no real conversion is counted. A workflow in test carries the **TEST MODE** badge.

> **Tip: Amount, currency and identity: nothing to configure**
>
> DURUM automatically sends everything it received: email, phone, name, city, region, country, postal code, amount, currency, product and order number. A refund amount is sent as a negative value. The currency is the event's, otherwise the **account currency** (see [Account currency and timezone](https://docs.durum.ai/en/pages/profile#account-currency-and-timezone)). A manual mapping (`value`, `currency`, `content_name`, `content_ids`, `order_id`, `predicted_ltv`) is only useful to override one of these values.

### Conversion list

Each row shows the state (active or paused), the name, the `event → platform event` mapping, and its stats: number of fires, success rate, number filtered ("All filtered (no send)", "Never fired"). The success rate leaves out filtered events: a workflow that filters as asked is not penalized. Actions: **Pause / Enable**, **Edit**, **Delete**. Filters by source, destination, status and name.

When no destination is connected, a banner warns: "No pixel connected. Your conversions will be saved but will not fire." The guided creator also warns when an active workflow already sends the same event to the same platform without a distinguishing filter (duplicate risk).

## 3. The "no event without an identifier" guard

An ad platform cannot match an event to a person without an identifier. Before every send, DURUM checks that the event carries one; otherwise it is **not sent** and the log explains why.

- **Facebook**: at least one strong identifier is required (email `em`, phone `ph`, `fbc`, `fbp`, `external_id` or `lead_id`), failing that first name **and** last name, failing that IP address **and** browser. Otherwise, status **Skipped** with the reason `meta_sans_identifiant: ni courriel, ni telephone, ni nom, ni fbc/fbp, ni IP+navigateur (Meta refuse, sous-code 2804050)`.
- **Google**: a click identifier (`gclid`, `wbraid`, `gbraid`), an email or a phone is required. Otherwise, status **Skipped** with the reason `google_sans_identifiant: ni clic (gclid/wbraid/gbraid), ni courriel, ni telephone`.

Why this guard: Meta handles a whole batch in a single request. One empty event used to get the entire batch refused, up to 24 healthy events with it, and every retry replayed the same error. Since then, the empty event is set aside before sending, and if a batch is still refused for an invalid parameter, each event of the batch is resent **alone** to isolate the culprit.

Also set aside, never sent: test or neutralized contacts, fictional identities (`555-01xx` numbers, reserved domains) and duplicate webhook calls (same workflow, same email, a few minutes apart).

## 4. Send log

The log lists every send with its **status**, the destination, the workflow and event name sent, the date and the number of attempts. Clicking a row opens the detail: **Why this status?**, the event ID (deduplication), the scheduled and sent dates, then three blocks: **Data sent to the platform**, **Platform response**, **Trigger event data**. For a filtered event, each condition is shown with its verdict and the value actually received.

| Status | Meaning |
|--------|---------|
| Sent | Accepted by the platform |
| Pending | Queued, picked up on the next pass (every minute) |
| Sending | Send to the platform in progress |
| Failed | The send failed; it will be retried automatically, or you can resend it now |
| Abandoned | Five failed attempts, no more automatic retries: fix the cause, then resend |
| Filtered | Normal behaviour: the workflow filters exclude this event |
| Skipped | Not sent: the source data was incomplete at processing time (guard above, test contact, build failure) |

Log filters: status, destination, conversion. 50 rows per page. Per-status counters stay visible whatever the filter.

### Resend

A banner appears as soon as there are **Failed** or **Abandoned** sends: "N failed sends never reached their destination. The data is kept: resending is possible." The **Resend all** button (or **Resend** on a row) puts those events back in the queue with the attempt counter reset. A **Skipped** event cannot be replayed: the source data must be fixed, after which a new event will go out.

### Cadence and retries

Sends go out **every minute**, in batches of at most 25 events per destination, never mixing two pixels or two Google conversion actions in one call. On failure, five attempts with growing delays (5 s, 30 s, 5 min, 30 min, 6 h), then **Abandoned**.

## Troubleshooting

| Symptom | Likely cause and fix |
|---------|----------------------|
| "No pixel found via the connected Meta account" | Connect the Meta Ads account under Integrations, or enter the pixel manually |
| "Connect the Google Ads account under Integrations first" | The Google Ads connection is missing; conversions reuse it |
| "No active conversion action in this account" | Create in Google Ads an action of type "Import, other data sources or CRM" |
| Many **Skipped** rows with `meta_sans_identifiant` | Your forms or calendars send neither email nor phone: check the source integration |
| **Abandoned** rows | Expired token, invalid pixel or missing permissions: read the **Platform response**, fix the connection (**Test** button), then **Resend all** |
| A saved workflow never fires | No connected destination (**INACTIVE** badge), or workflow paused |
| Events only show under Test events | The workflow is in **TEST MODE**: untick test mode in the action |

## Who has access

The tab requires the **Integrations** permission (`settings_integrations`), granted by default to the owner, administrator, media buyer, member and client roles; the sales director, sales rep and viewer do not have it. A client or trial account only sees the conversions of its own account.

---

Source: https://docs.durum.ai/en/pages/conversions-settings
