# Performance metrics

Conversion metrics are used to establish when a player converts from non-paying to paying, or when a churned player returns to the game and becomes a paying player again.

Nexus derives these outcomes automatically from the `metrics` payload you send on each attribution. You configure nothing. Send accurate data on every transaction.

You send the `metrics` payload when you attribute a transaction to a member.

<Aside type="note">
Send `playerId` alongside `metrics`. Every outcome on this page is per player and cumulative, so Nexus needs a stable identifier to attach that history to. Without one it still reads each transaction, but it cannot tell whether that player has bought from you before, and none of the outcomes below can resolve. See [Track a purchase](/start-integrating/track-a-purchase/#recommended-fields) for the field and how to pseudonymize it.
</Aside>

<ApiMethod method="POST" path="/attributions/transactions" />
<LinkCard title="View full reference" description="Parameters, responses, and status codes." href="/api/operations/creatorattribution/" />

## The conversion fields

```json
"metrics": {
  "conversion": {
    "lastPurchase": {
      "date": "2026-04-01T00:00:00.000Z",
      "platform": "iOS"
    },
    "totalSpendToDate": {
      "total": 4999,
      "currency": "USD"
    }
  }
}
```

<Aside type="note">
The `lastPurchase.date` and `totalSpendToDate` fields should reflect the player's **full purchase history** across your game, not just purchases made through a creator code. These fields exist to give us an accurate picture of the player's overall spend behavior, which is what determines conversion and reactivation status.
</Aside>

| Field                       | What it represents                                                                                 | Required?            |
| --------------------------- | -------------------------------------------------------------------------------------------------- | -------------------- |
| `lastPurchase.date`         | The player's most recent purchase date **before** this transaction (regardless of creator support) | Strongly recommended |
| `lastPurchase.platform`     | Platform of that prior purchase                                                                    | Optional             |
| `totalSpendToDate.total`    | Total the player has spent **before** this transaction (not including it)                          | Strongly recommended |
| `totalSpendToDate.currency` | Currency of the spend total                                                                        | Optional             |

## What triggers what

### Converted

Send when the player has **never purchased before**.

```json
"lastPurchase": { "date": null },
"totalSpendToDate": { "total": 0, "currency": "USD" }
```

Either signal is sufficient, but sending both is preferred:

* `lastPurchase.date: null` (explicit signal, preferred)
* `totalSpendToDate.total: 0` (inferred signal if no date is available)

<Aside type="note">
Nexus counts a player as Converted at most once, ever, which it can only do while you send the same [`playerId`](/start-integrating/track-a-purchase/#recommended-fields) for that player. Converted and Reactivated are mutually exclusive.
</Aside>

### Reactivated

Send when the player **has purchased before** and their last purchase was **30 or more days ago**.

```json
"lastPurchase": { "date": "2024-09-15T00:00:00.000Z" },
"totalSpendToDate": { "total": 12999, "currency": "USD" }
```

Nexus measures the 30-day gap between `lastPurchase.date` and the transaction date on the current attribution. This applies only if Nexus has never classified the player as Converted before.

### Repeat Reactivation

No special payload required. Nexus derives this automatically.

If the player was previously Converted or Reactivated at any point in history, and the current transaction shows a `lastPurchase.date` 30 or more days prior, Nexus counts them as a Repeat Reactivation instead of a new Reactivation.

Keep sending an accurate `lastPurchase.date` on every transaction. Nexus handles the rest.

### Not counted

Send when the player is an active payer returning within their normal purchase cycle.

```json
"lastPurchase": { "date": "2024-11-20T00:00:00.000Z" },
"totalSpendToDate": { "total": 4999, "currency": "USD" }
```

If `lastPurchase.date` is less than 30 days before the transaction date, the player does not increment any metric. This avoids inflating reactivation numbers for regular active spenders.

## Decision table

| `lastPurchase.date` | `totalSpendToDate.total` | Gap to transaction                             | Result                              |
| ------------------- | ------------------------ | ---------------------------------------------- | ----------------------------------- |
| `null`              | `0`                      | N/A                                            | **Converted**                       |
| `null`              | > 0 or not sent          | N/A                                            | **Converted**                       |
| not sent            | `0`                      | N/A                                            | **Converted**                       |
| valid date          | any                      | ≥ 30 days, never Converted                     | **Reactivated**                     |
| valid date          | any                      | ≥ 30 days, previously Converted or Reactivated | **Repeat Reactivation**             |
| valid date          | any                      | < 30 days                                      | **Not counted**                     |
| not sent            | not sent                 | N/A                                            | **Not counted (payload too ambiguous)** |
