# Conversion goals (/guides/conversion-goals)

Opens and clicks tell you an email was interesting. They do not tell you whether it worked. A
**conversion goal** names the event that counts as the outcome — a purchase, a signup, a booking —
and credits it back to the email that earned it.

## Defining a goal

In **Settings → Data → Conversion goals**, name the event that counts. It does not have to exist
yet: you can define `purchase` before your application has ever sent one, the same way you can
[declare an event](/docs/guides/declaring-events) before building a workflow around it.

A goal has:

* **The event name.** Exactly the name your application sends to `/v1/track`.
* **An attribution window** — how long after an email a conversion still counts. Fourteen days by
  default.
* **An amount field and a currency field**, optional. Both are paths into the event's `data`, so an
  event like `{"revenue": 49.90, "currency": "EUR"}` needs `revenue` and `currency`.

Leave the amount empty to count conversions without money attached. Signups and bookings are real
outcomes with no price.

## The window belongs to the campaign, the goal does not

You set the window on the goal, but **any campaign can override it** — and only the window.

That split is deliberate. What counts as a purchase is a property of your business: it has to mean
the same thing on every report, or two campaigns are no longer comparable. How long a purchase can
still be credited to a particular send is a property of *that send*. A flash sale converts in
hours; a mattress converts in weeks. One default cannot be right for both, and forcing one would
either lose the mattress conversions or credit the flash sale for purchases it had nothing to do
with.

So: define `purchase` once, then give the flash sale a two-day window and the mattress campaign
sixty.

## How a conversion is credited

When a goal's event arrives, Bitelio looks back over the window for the emails that contact
engaged with, and credits **the most recent click**. If there were no clicks, it credits **the most
recent open**.

A click is intent. An open increasingly is not — Apple's Mail Privacy Protection opens messages
nobody read — so the open is a fallback, never a tie-break.

This is the same rule used for Shopify order attribution, deliberately.
Two attribution rules would credit different campaigns for the same contact, and the first time
both numbers appeared on one screen, neither would be believable.

## What the numbers mean

The campaign report shows conversions, the attributed conversion rate, revenue, and the average
time from engagement to conversion — plus unsubscribes and complaints in the same card, because a
campaign that converts well and burns your list is not doing well.

Two things are worth being precise about.

### The attributed rate is not your conversion rate

It counts only conversions by contacts who clicked or opened one of these emails inside the window.
Customers who bought without ever engaging with the campaign are not in it — and neither are those
who would have bought anyway.

It will therefore be **lower** than the conversion rate in your own analytics, and that is correct,
not a bug in either system. They are answering different questions: yours asks how many visitors
bought, this one asks how many purchases can be traced back to an email.

### Revenue is never combined across currencies

If a campaign earns 1,000 EUR and 1,000 USD, the report shows both figures, separately. It never
shows 2,000.

Bitelio does not know your exchange rates, and a converted total would be a number with no
defensible date attached to it. Adding them anyway would produce something that looks entirely
reasonable and means nothing.

## Conversions are final

A recorded conversion is never revised. There are **no refunds, no cancellations and no
reversals** — if a customer converts and later gets their money back, the conversion and its
revenue stay in the report.

This is a real limitation, and worth knowing before you use these figures for anything financial.
Attribution answers "which email led to this?", and the answer to that does not change when the
order is later refunded: the email did lead to it. If you need revenue net of refunds, the Shopify
integration tracks order cancellations and refunds against the order itself, and that is the number
to use.

## A/B tests

If the campaign is running an [experiment](/docs/guides/experiments), the report breaks each goal
down by arm, with each arm's recipient count next to its rate.

The recipient counts are shown rather than assumed because arms are rarely the same size — a
[holdout](/docs/guides/holdouts) least of all — and two bare percentages invite exactly the
comparison that sample size is supposed to qualify.

## Timing

Attribution runs in the background, within seconds of the event arriving. It never delays or fails
the event itself: if attribution cannot run, the event is still recorded, and only the crediting is
lost.

Goals also apply to [workflows](/docs/guides/workflow-experiments), with the same window override
and the same report.

## The campaign that never wins the last click

Attribution credits one email. A newsletter that is never the thing clicked five minutes before
the purchase — because it is not the one with the discount code in it — reports near-zero
conversions and looks like something to cut.

So each campaign also reports **what it was in the path of**:

* **assisted conversions** — how many conversions it was engaged with before, without earning them
* **linear model revenue** — each conversion's amount divided by the number of campaigns in its
  path, this campaign's share summed

### Two models, one amount of money

Last click and the linear model are **two ways of dividing the same money, not two amounts**. Each
one, added across all your campaigns, comes to what actually came in. They disagree per campaign,
which is the entire point: last click says the discount email did all the work, linear says the
newsletter read ten days earlier did an equal share.

Adding one to the other is not a number. Nothing in Bitelio will show you that sum.

Neither is true, either. Both are conventions. The only thing here that measures whether sending
caused anything is a [holdout](/docs/guides/holdouts), which withholds email from part of your
audience and compares — which is why the two conventions sit beside each other, labelled, instead
of one of them quietly claiming to be the correct one.

### What counts as being in the path

A campaign counts **once** per conversion, however many of its emails the contact opened. Two runs
of the same automation are one thing in the path. And **transactional email is not in the path at
all**: nobody would credit a password reset for a purchase.

Assists start from the day this feature shipped. Conversions recorded before it have no path, and
the report says so rather than presenting a partial history as a complete one.

## Did any of it help?

Attribution answers which email earned a conversion. It cannot answer whether the conversion would
have happened anyway — the customer who was going to buy regardless still clicked, and still gets
credited.

A [holdout](/docs/guides/holdouts) can measure a goal, and that is the question it answers. Note
that it counts the goal's events for **everyone**, attributed or not: the held-out group receives
no email, so it has nothing attributed by definition, and comparing attributed figures between the
two would measure the split rather than your email. The two reports are meant to disagree.
