ExcludeFromBidding=true are suppressed from Microsoft Ads reportsInvestigation date: 2026-05-22
Trigger: koala-au reported 0 Littledata conversions in microsoftAdsBaselineConversions despite Littledata uploading server-side conversions normally. Direct probe of the Microsoft Ads ConversionPerformanceReport confirmed every Littledata OfflineConversion goal returned Conversions=0, Revenue=0, while UET-fired “Purchase New” recorded 202 conversions / $356,753 over the same 30 days.
When a Microsoft Ads ConversionGoal is configured with ExcludeFromBidding=true, Microsoft Ads suppresses that goal’s data from ConversionPerformanceReport (and the account-level Conversions metric) entirely, even though the goal continues to record conversions internally (its TrackingStatus will show RecordingConversions).
The practical effect: until a merchant enables Littledata’s offline conversion goal in bidding, every Microsoft Ads report that aggregates by goal will return zero for Littledata — making it look like the integration is broken when it is in fact working.
This is the inverse of Google Ads’ include_in_conversions_metric flag, where excluded actions still appear in segments.conversion_action queries and can be filtered client-side. Microsoft Ads gives no client-side way to recover the suppressed data.
microsoftAdsGoalConfig — already fires WARNING (“Littledata’s offline conversion goal exists but is excluded from bidding”) on this configuration. This is the primary CSM call to action.microsoftAdsBaselineConversions — no longer affected by this suppression. The check originally ratioed UET goals against LD’s offline goal, which was unusable whenever LD was excluded from bidding (the suppressed LD row meant the ratio was always undefined). It was rewritten to use Shopify orders as ground truth instead: it compares each UET purchase goal’s snapshotted conversions and AOV against the same window’s Shopify order count and (when single-currency) Shopify sample AOV. Because Shopify is a strict superset of UET (every order, every channel), any UET goal exceeding Shopify orders is direct duplicate-tag-firing evidence — and the check produces a real status regardless of LD’s bidding inclusion.microsoftAdsRoasNegativeUplift — gated on ldRevenue > 0 so it does not fire on suppressed data (the comparison would be meaningless when LD reports zero).microsoftAdsBaselineRoas — new field on microsoftAdsGoalConfig.details, populated whenever Littledata goals exist (regardless of bidding inclusion). When LD is suppressed it carries ldSuppressed: true + the UET baseline’s standalone ROAS — useful for telling CSMs “this account spends $X to earn $Y on UET tracking; enabling LD bidding would let us measure incremental lift.”npx tsx scripts/test-microsoft-ads-api.ts <shopName>
Look at the excludeFromBidding flag on every Littledata-named OfflineConversion goal. If they are all true, the report will report zero for those goals regardless of how many conversions Littledata has actually uploaded. Cross-check by running a direct ConversionPerformanceReport against the account — the Conversions column will be zero for the same goal IDs.
There is no Microsoft Ads SOAP / Reporting endpoint that exposes ApplyOfflineConversions upload counts per goal independent of bidding inclusion. The only way to “unsuppress” the data is for the merchant to flip the goal’s ExcludeFromBidding to false in the Microsoft Ads UI or via UpdateConversionGoals. We intentionally do not mutate this on customers’ behalf — Smart Bidding behaviour changes the moment the goal becomes eligible, and that is a merchant decision.