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

# Numbers don't match the source platform

> The dashboard total doesn't match the ad platform's UI for the same date range. Nearly always: a different metric variant, a different attribution window, or a platform-side data restriction.

The single most common question support handles: "the dashboard shows a different number than the platform's own UI." In almost every case the numbers are correct on both sides — but they're measuring slightly different things. The mismatch traces to one of five patterns below, and the specific fix lives on the connector's FAQs page.

## Quick checks

<Steps>
  <Step title="Confirm the date ranges match exactly">
    Include time zone. Adriel and the platform UI don't always default to the same time zone; a one-day misalignment produces very different totals for short ranges.
  </Step>

  <Step title="Confirm the metric names refer to the same thing">
    Similar names measure different things. Meta `Lead` and `Lead (Grouped)`, Google Ads `Purchase` and `Category: PURCHASE`, GA4 `Total Sales` and `Net Sales` — these are separate metrics.
  </Step>

  <Step title="Check for status filters that differ across surfaces">
    Comparing DV360, Google Ads, or Meta against their native UI requires matching the ad status filter (active only vs. active + paused + removed) as well.
  </Step>
</Steps>

## Pattern 1 — different metric variant

The platform exposes several metrics that look interchangeable but measure different populations.

| Platform              | Symptom                                                           | Where the difference lives                                                                                                                                                                |
| --------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Meta                  | `Lead` count is higher than the Meta UI's `Leads (Form)` column   | `Lead` = `action_type=lead` (all lead events); Meta UI's `Leads (Form)` = `leadgen_grouped` (form leads only). Switch the widget metric to `Lead (Grouped)`.                              |
| Google Ads            | `Purchase` doesn't match the Google Ads UI Purchase column        | `Purchase` is one specific conversion action named "Purchase". The Google Ads UI usually shows `Category: PURCHASE` (all actions in that category), `Conversions`, or `Conversion Value`. |
| GA4                   | Adriel and the GA4 UI disagree on revenue                         | GA4 has separate `Total Sales` and `Net Sales` — a discrepancy usually traces to comparing different metrics or applying different filters on each side.                                  |
| Google Search Ads 360 | Conversion metrics don't match                                    | Metrics with `(conv time)` measure the conversion date; the asterisked variants measure the click date. Different metrics.                                                                |
| Shopify               | Sales numbers don't match                                         | Shopify's `Total Sales` and `Net Sales` are different metrics. Match the metric and filters exactly.                                                                                      |
| TikTok Ads            | Can't find `Purchases (website)`                                  | It's not a separate metric — it's TikTok's `complete_payment` conversion. Search for `Complete Payment` in the metric picker.                                                             |
| CallRail              | `total_calls` is lower than the number of individual call records | `total_calls` follows CallRail's API definition: unique customer phone numbers, aggregated per caller. Use `row_count` to count individual call records.                                  |

→ Each connector's [FAQs](/data-sources/overview) page carries the definitive variant list.

## Pattern 2 — cache-only aggregation vs. deduplicated platform totals

Unique metrics like `Reach` and `Frequency` are counted once per person by the platform but summed by day in Adriel, so period totals appear inflated.

* TikTok Reach: 48M in Adriel for a range where the platform's deduplicated UI shows 21M — same source data, different aggregation grain.
* DV360 Unique Reach and Average Impression Frequency have the same limitation.
* TikTok Overview widget's `Reach` tile is mapped to `Post Reach (Delta)`, which is the change in reach vs. the prior day — it can legitimately be negative when yesterday's reach was higher.
* Organic reach across every platform: summed daily reach is not equivalent to true period reach.

Adriel marks these with an asterisk and a tooltip explaining the aggregation.

## Pattern 3 — platform API returns different data by level or date range

Some metrics are only available at certain levels or for certain date ranges — a dashboard total intentionally excludes them.

* Google Ads `video_quartile_p100_rate` is only available at the campaign level. Ad-account totals exclude it.
* Google Ads `unique_users` and `average_impression_frequency_per_user` are only requestable for date ranges ≤ 92 days, and only on Display, Video, Discovery, Demand Gen, and App campaigns — not requestable at ad-account level at all.
* Performance Max campaigns have no Ad level in the Google Ads API. Nested breakdowns that force a fetch at ad level exclude PMax from the child breakdown while still including it in the parent — totals will legitimately not match. Isolate PMax into a separate label as a workaround.
* Meta detail breakdowns (age, gender, country, platform, device, placement) are only supported up to the campaign level; applying an ad-set filter alongside triggers `INVALID_DIMENSIONS_COMBINATION`.
* Meta stops returning data for deleted / archived campaigns, ad sets, and ads. Historical rows disappear from the API even though they existed during the active period. The `useCache` flag preserves the cached rows at the cost of not picking up new data for those objects.
* LinkedIn Ads returns approximate values live from the API — sums of period-split queries may not match a full-period query.
* X (Twitter) Ads has had documented API degradations returning inflated ad-level totals (deleted-ad data still counted at ad level but not at ad-set level) and null metrics for promoted tweets in some campaign types.
* Microsoft Ads deleted campaigns aren't visible in Adriel even if the platform still has historical performance data. Missing campaigns in a comparison are usually deleted on the Microsoft side.
* YouTube Analytics reports are date-based: `Views` is the sum of views during the range, not the video's lifetime views. YouTube's own API also withholds values below undisclosed activity thresholds and returns nothing for dates with no activity.

## Pattern 4 — attribution or scope difference

The platform and Adriel are counting the same events, but attribute or scope them differently.

* Revenue in GA4 vs. Google Ads — the two platforms attribute across different traffic scopes and different attribution windows. → See [Revenue: GA4 vs Google Ads](/troubleshooting/revenue-ga4-vs-google-ads).
* Instagram Organic: Adriel's `Post Profile Visits` is the post-level `profile_visits` metric (visits attributable to a specific post). The Instagram UI shows account-level Profile Visits, which is a different metric. Some Instagram UI aggregates include Facebook views; Adriel's Instagram Organic widget is scoped to Instagram views only.
* TikTok Organic: TikTok's video and list API returns totals that include both organic and paid activities, while TikTok's native UI shows organic only.
* Google Ads status field: reflects the current resource state (`ENABLED`, `PAUSED`, `REMOVED`), not whether delivery occurred in the selected date range. An `ENABLED` ad shows as Active even if it didn't deliver in the range.

## Pattern 5 — wrong ad account, profile, or channel connected

The data source connected is not the one the reporter has in mind.

* TikTok Ads: campaigns on a different TikTok ad account than the one connected to the workspace will not appear. Connect the other ad account to see them.
* Amazon DSP: multiple profiles per region, and advertiser names can be duplicated across profiles with different underlying advertiser IDs. Connecting the advertiser under the wrong profile (JP when the correct one is US) yields no data.
* Spotify: `getBusinesses` only returns businesses linked to the OAuth user. Connect using the same Spotify account used at `ads.spotify.com`.
* YouTube Analytics: filters videos by `Video Published At` — connecting a different channel won't return videos published on another channel.
* LinkedIn Organic: the OAuth user must have access to the specific Page. Verify which user is connected and their Page access.

## How to reconcile

1. Confirm the date range and time zone match exactly.
2. Confirm the metric name in Adriel refers to the same thing as the column in the platform UI (use the connector's FAQs page for the definitive mapping).
3. Confirm ad status filters and channel/account filters are the same on both sides.
4. Confirm the metric isn't a cache-only unique metric (Reach, Frequency, or a Delta variant).
5. If a specific connector variant is in play (LinkedIn approximate values, Meta deleted-object drop-off, Google Ads PMax structural gap), the connector FAQs page documents the exact behavior.

## Still stuck?

<Card title="Contact support" icon="life-ring" href="mailto:support@adriel.com">
  Email `support@adriel.com` with the connector name, the exact metric names on both sides, the date range with time zone, and screenshots of the two totals.
</Card>
