Skip to main content
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. 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

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). 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. 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. Imported order history and test orders are excluded.

Delivery

One row per ad platform and origin, such as Meta · Website and Meta · App. Hover a status to read each outcome with its error_type. Every skip and failure is one of three kinds. 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. 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 for the list. These tools never return a buyer’s email, IP address, or the payload we sent.

When it does not work

Next, fix delivery problems in Conversions, or reconnect a source in Sources.