Skip to content

Paid Media: calculated-rate fields (conversionRate, ctr, engagementRate) reject values > 1.0, causing ingestion failures #2201

Description

@ejsuncy

Problem

Several calculated-rate fields in the Paid Media field groups are constrained with "maximum": 1, but in practice these rates can legitimately exceed 1.0, causing ingestion failures.

Example failure when ingesting Google Ads summary metrics:

The value (2.0) for the field: paidMedia.conversionMetrics.conversionRate with type: Double
must be less than or equal to the specified maximum limit: 1.0.

paidMedia.conversionMetrics.conversionRate maps to Google Ads metrics.conversions_from_interactions_rate, which is all_conversions / interactions — i.e. multiple conversions can be attributed to a single click, so the ratio can exceed 1.0. See Google Ads API field reference.

The same problem applies to other rates whose numerator and denominator come from different event populations (numerator is not a subset of the denominator):

  • ctr (clicks / impressions) — networks may report more tracked clicks than impressions or inflate counts
  • engagementRate (engagements / impressions) — one impression can yield multiple engagements (like + share + comment)
  • budgetUtilization / dailyBudgetUtilization (spend / allocated) — overspend exceeds 100%
  • negativeActionRate / positiveActionRate (actions / impressions) — multiple actions per impression
  • crossDeviceConversionRate — conversions can outnumber the denominator interactions

Proposed fix

Remove the "maximum": 1 constraint from the above calculated-rate fields (keep "minimum": 0, since rates are non-negative) and document in each field's description why the value can exceed 1.0.

True subset/total proportions that are mathematically bounded at 1.0 — viewabilityRate, the video view/completion/skip rates, fraudRate, validationRate, leadFormCompletionRate, invalid/bot/human traffic rates, the impressionShare set, attribution weights/confidence/contribution, and statistical indices — keep their "maximum": 1 cap.

This is a non-breaking change: removing a maximum only loosens validation, so existing valid data remains valid.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions