# Attribution and unknown

> Short links, outcomes, and why a result with no known source is counted as unknown.

URL: https://mcp-docs.opennomos.com/docs/growth-loop/attribution

OpenNomos does not know what happens on your site. It only knows what is told to it, and it refuses to guess.

## Short links

`track` with `type: "link"` creates a link for one place you will post it:

```json
{ "type": "link", "link": { "target_url": "https://acme.com/pricing", "channel": "reddit", "experiment_id": "exp_7Hn2LpWc0" } }
```

| `mode` | Returns |
| --- | --- |
| `redirect` (default) | `short_url` (`https://service.opennomos.com/l/<code>`) and `final_url`. Clicks are counted. |
| `utm_only` | `final_url` only, with UTM parameters. Nothing is counted by OpenNomos. |

Both add `utm_source` (the `channel`, else `opennomos`), `utm_medium=opennomos`, `utm_campaign` (the experiment id, else the project slug) and, for redirect links, `utm_content=<code>`.

Safety limits on targets: `https` only; not an IP address, `localhost`, a known URL shortener or OpenNomos itself; and, for redirect links, at most **three distinct target hosts per project** (the host of the project's own `website`, `url` or `domain` profile field counts as one). A fourth host fails with `link_host_not_allowed`; ask the user to approve it.

### What a click records

For each redirect: time, a bot flag (empty or crawler-like user agents), a **daily-salted hash** of IP and user agent (to count unique visitors without storing either), the country, and the referrer **host** only. See [Privacy](https://mcp-docs.opennomos.com/docs/reference/privacy.md). Link previews from chat apps are bots; the briefing reports `human` and `bot` clicks separately.

## Outcomes

Record a result with the `outcome` object of `log_action` (`type` such as `signup`, `reply`, `call_booked`; optional `value`, `unit`, `evidence`).

| Attribution | When |
| --- | --- |
| `direct` | The outcome is tied to an opportunity or a short link. |
| `unknown` | It is not. |

Outcomes with attribution `unknown` are **never credited to a channel** and are excluded from `outcome:<type>` experiment metrics. The briefing's `attribution` block reports them as `unknown` and gives `unknown_share`, so a low-quality picture is visible instead of hidden. (The briefing also has a `self_reported` bucket; the current `log_action` records either `direct` or `unknown`.)

## The boundary

- **No conversion events come back.** A click is counted at the redirect. A signup on your site is counted only if you or your agent record it with `log_action` (for example from your own analytics), tied to the link or opportunity.
- **A site without accounts** can attribute clicks but not signups unless you report them.
- **Connecting analytics** (Search Console, GA4, product analytics) so the agent can read real conversions is planned, not available.

<Callout type="info">
If you do not know where a signup came from, leave it `unknown`. That is a correct answer.
</Callout>
