> ## Documentation Index
> Fetch the complete documentation index at: https://docs.datalyr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Health

> See whether data arrives, whether sales are matched to ads, whether they reach your ad platforms, and how well those platforms can match them.

**Health** answers one question for the last 7 days: is attribution working? It reads the same data as the rest of the product and names what needs a fix in plain words.

There is no score. The page state comes only from problems in your setup. Problems on an ad platform's side, or on ours, stay visible but never count against you.

## The layout

The page has five tabs in the left rail: **Overview**, **Capture**, **Identity**, **Delivery**, and **Match quality**. **Overview** holds the four stage cards and **To fix**. Each other tab holds one stage.

The top row has three controls.

| Control     | What it does                                                                                                        |
| ----------- | ------------------------------------------------------------------------------------------------------------------- |
| Range       | `last 24h` or `last 7d`. The default is 7 days.                                                                     |
| Status chip | The dot is the workspace state: green, amber, or red. The text is how fresh the numbers are: `live`, then `5m ago`. |
| Refresh     | Re-read the page now instead of waiting for the next refresh                                                        |

The range changes the counts and the **To fix** list. It does not change how we judge freshness. Freshness always uses the last 7 days, so a 24-hour view never reports a quiet source as broken.

Your choice is kept in the URL, so a shared link shows the same window.

## The four stages

| Stage             | The question                          | What counts as working                                     |
| ----------------- | ------------------------------------- | ---------------------------------------------------------- |
| **Capture**       | Is data arriving on time?             | Each source sends at its usual rhythm                      |
| **Identity**      | Are sales matched to an ad?           | A sale from an ad visitor links to that visit              |
| **Delivery**      | Are sales reaching your ad platforms? | Each rule's deliveries are accepted                        |
| **Match quality** | Can platforms match your sales?       | Delivered events carry the signals the platform matches on |

Each stage card shows one number, such as `6 of 8 sales from ads matched`. Select a card to open its tab.

## To fix

This list holds things in your setup, most costly first. Each item says what is wrong, what it cost, and has a button named for the fix, such as **Reconnect TikTok** or **Check Shopify setup**.

Items that need no action from you sit in **No action needed**. These are platform-side errors, faults on our side, and behavior we expect, such as a source that is connected but has not sent its first event.

The section is hidden when there is nothing to fix.

## Capture

One row per source. A Shopify store shows two rows: the storefront (the App Embed) and orders (webhooks).

| Column          | What it holds                                                                                            |
| --------------- | -------------------------------------------------------------------------------------------------------- |
| **Status**      | `Working`, `Needs a look`, `Sending, not judged`, or `Waiting for events`, with the last liveness signal |
| **Last event**  | When the last event arrived, and the source's usual rhythm                                               |
| **Last 7 days** | What arrived in the window: events, orders, payments, or clicks                                          |

We judge silence against the source's own rhythm over the last 7 days, not against a clock. A source that goes quiet every night is not reported as broken at 2 AM.

A source needs 50 events, 24 active hours, and 72 hours of history before we judge it. Below that it reads `Sending, not judged`. That is not a problem.

The liveness signal is the independent proof the source is alive.

| Source                                     | Signal                    |
| ------------------------------------------ | ------------------------- |
| Shopify storefront                         | The App Embed ping        |
| Shopify orders, Stripe, and other webhooks | The last webhook received |
| Mobile app                                 | The last SDK session      |
| Website                                    | The last page view        |

A source whose connection lost access reads `Needs a look` whatever its events say. Reconnect it in **Sources**.

## Identity

One card per revenue source.

The headline counts only sales we can tell came from an ad visitor. For Shopify, that is an order whose landing page carried a click ID or a paid UTM, or an order linked to an ad visitor. Organic orders are left out, so an unmatched organic order never lowers the number.

Stripe payments and app-store subscriptions carry no ad evidence unless they were linked, so their headline counts all payments.

**Not matched** lists each reason with a count. Hover a reason to read the code and the explanation.

| Reason shown                         | Code                           | Who fixes it                                                                           |
| ------------------------------------ | ------------------------------ | -------------------------------------------------------------------------------------- |
| Missing checkout tracking            | `pairing_lookup_miss`          | You. Check the Shopify setup in **Sources**.                                           |
| No checkout token on the order       | `pairing_no_token`             | You                                                                                    |
| Held back by a safety check          | `cart_pairing_unverified`      | No one. The cart's IP did not match the order's, so we refused the pairing on purpose. |
| In-app handoff expired               | `handoff_stale`                | No one                                                                                 |
| Ad click too old to pair             | `click_pairing_outside_window` | No one                                                                                 |
| Datalyr lookup failed                | `lookup_error`                 | Us                                                                                     |
| Buyer never seen on your site or app | `no_person`                    | No one                                                                                 |

Imported order history and test orders are excluded.

## Delivery

One row per ad platform and origin, such as `Meta · Website` and `Meta · App`.

| Column          | What it holds                                                                               |
| --------------- | ------------------------------------------------------------------------------------------- |
| **Status**      | `Working`, `Needs a fix`, `Needs reconnecting`, or `Nothing sent yet`, with one line of why |
| **Last sent**   | The last accepted delivery and its event                                                    |
| **Last 7 days** | Sent and failed counts                                                                      |

Hover a status to read each outcome with its `error_type`. Every skip and failure is one of three kinds.

| Kind     | Examples                                                                                          | Counts against you |
| -------- | ------------------------------------------------------------------------------------------------- | ------------------ |
| Problem  | An expired login, a deleted conversion action, a rejected pixel                                   | Yes                |
| Platform | A 5xx from the ad platform, a rate limit, an upload still processing                              | No                 |
| Expected | A rule's renewal exclusion, an event from another origin, a checkout with no customer details yet | No                 |

An unknown code is treated as a problem until we classify it. A connection that needs reconnecting reads `Needs reconnecting` even if no delivery failed yet.

## Match quality

One table per ad platform and origin, one row per event type, in plain names such as `Checkout started`.

| Column          | What it measures                           | Over                                               |
| --------------- | ------------------------------------------ | -------------------------------------------------- |
| **Ad click ID** | `fbc`, `ttclid`, `gclid`, or `sc_click_id` | Events whose visitor came from that platform's ads |
| **Email**       | A hashed email                             | All sent events                                    |
| **Browser ID**  | `fbp`, `ttp`, or `sc_cookie1`              | All sent events                                    |
| **Device info** | IP address and user agent together         | All sent events                                    |

The click ID uses a smaller denominator on purpose. An organic visitor never had one, so counting them would make a correct setup look broken. A gap in this column means the ID was lost between the ad click and the sale.

A dash means the platform does not use that signal. Google takes no browser ID or device info. App events carry no browser ID.

We only call out a signal the event should carry. A missing email on a product view is not a gap.

## Ask AI

Select **Ask AI** on **To fix** or on any tab. It opens a chat with a question ready to send and that tab's rows attached, including the codes. Press Enter to send it.

The chat can then look deeper than the page shows. It has read tools for the delivery log, unlinked Shopify orders and their miss codes, the match signals sent per event, your conversion rules, and connection health. Ask "which orders were not matched and why" and it quotes order numbers and codes. See [AI chat](/product/ai-chat) for the list.

These tools never return a buyer's email, IP address, or the payload we sent.

## When it does not work

| What you see                             | Cause                                              | Fix                                             |
| ---------------------------------------- | -------------------------------------------------- | ----------------------------------------------- |
| `Not available right now` on one section | That read failed                                   | Select refresh. The other sections are current. |
| `Health is not available right now`      | Every read failed                                  | Select **Try again**                            |
| `Waiting for events` on a source         | The source is connected and has not sent yet       | Send one event, then select refresh             |
| `Sending, not judged`                    | Fewer than 50 events or 72 hours of history        | Nothing. It is judged once there is a rhythm.   |
| `0 of 0 sales from ads matched`          | No sale from an ad visitor in the range            | Switch to `last 7d`, or wait for the next sale  |
| `Nothing sent yet` on a platform         | An active rule had no matching event in the window | Confirm the trigger event fires in **Events**   |

Next, fix delivery problems in [Conversions](/product/conversions), or reconnect a source in [Sources](/integrations).
