Marketing measurement specialist reviewing offline conversion mapping and reconciliation dashboards at a workstation

Move Offline Conversions to Data Manager API Without Losing the Audit Trail

Wed, Sep 16, 2026

The migration decision is not “Can we get an HTTP 200 from a new endpoint?” It is “Can we move a business-approved offline conversion from CRM evidence to the correct Google Ads conversion action, preserve a defensible audit trail, understand what the destination accepted or ignored, and then reconcile that evidence with advertising reporting without overstating what the upload proved?”

That distinction matters in September 2026. Google’s developer blog announcement (published May 15, 2026) restricted new adopters of Google Ads API offline conversion imports from June 15 while allowing established adopters to continue during migration. Google’s later deprecations table uses a more precise historical activity window than the announcement.

Separately, Google sunset developer tokens as the Google Ads API access mechanism on September 9, 2026 and moved access levels to Google Cloud projects. That is an access-management transition, not the same change as offline-conversion transport migration.

This guide is for paid-search leads, marketing analysts, CRM owners and integration engineers. It follows one synthetic CRM-qualified sale through destination mapping, identifier transformation, submission, asynchronous diagnostics and reporting reconciliation. The practical goal is a controlled pass, hold or escalate decision. Nothing in an accepted request, a Data Manager SUCCESS status or a received record count, by itself, proves that a conversion was attributed, reported, or used to improve bidding. Google’s own migration steps explicitly separate Data Manager diagnostics from Google Ads performance reporting.

Scope the migration without inventing a universal shutdown

Treat three dated facts as separate entries in the migration register. Google’s May announcement said developers without adoption or offline imports “between December 2025 and May 2026” would be affected from June 15, 2026. The Google Ads API deprecations page (updated September 10, 2026) later specifies December 17, 2025 through June 15, 2026 for the historical activity test. The sources therefore differ in precision; do not silently collapse them into one date range.

The same deprecations page says the historical restriction remains in effect even though developer tokens have since been deprecated. The developer token sunset guide (updated September 11, 2026) says developer tokens were sunset September 9 and Google Ads API access levels are now determined by the Cloud project that owns the OAuth credentials.

Change

Documented behavior

What it does not establish

Migration decision

June 15 offline-import restriction

Certain historical non-adopters are restricted from UploadClickConversions; existing adopters were given a migration path.

A universal shutdown of every legacy importer.

Verify the affected integration’s actual authorized access.

September 9 access transition

Google Ads API access levels moved from developer tokens to Google Cloud projects.

Data Manager authentication or destination authorization.

Inventory Cloud project, OAuth identity and Ads access separately.

Local cutover date

Proposed operating control: choose a controlled sender-switch date after pilot evidence is complete.

A Google-mandated migration deadline for every existing adopter.

Approve locally; record owner and rollback route.

One current documentation conflict also deserves explicit treatment. The Data Manager upgrade comparison (updated September 15, 2026) still contains a comparison row saying a developer token is “Required” for the Google Ads API, while the dedicated Google Ads access guide says tokens were already sunset and are ignored when sent. For current Google Ads API access, use the dedicated access-management guide; record the comparison row as stale or unresolved context, not as an instruction to obtain a token.

Define the five states of a conversion record

A migration is easier to control when every team uses the same evidence vocabulary. The following five states are a proposed operating model, not five Data Manager API enums. Data Manager has its own destination statuses: PROCESSING, SUCCESS, FAILURE and PARTIAL_SUCCESS. Those should remain vendor states in the ledger.

Proposed state

Minimum evidence

What it proves

What it does not prove

Business-approved

CRM source event, milestone rule, timestamp/value evidence, approver

The organization considers the event a conversion under its own definition.

Google received anything.

Submitted/received

Payload digest, submit time and successful response requestId

A non-validation ingestion request was accepted at the request boundary.

Destination processing, attribution or reporting.

Destination-processed

Per-destination terminal status plus warnings/errors

Processing finished for that destination; warnings/errors describe processing quality.

Ad attribution or report inclusion.

Attributed/measured

Google Ads measurement evidence using an agreed reporting definition

The event contributed to a Google Ads conversion metric under that definition.

Exact CRM parity or causal bidding improvement.

Reconciled/reported

Signed comparison of CRM cohort, destination evidence and Ads report

The teams explained the relevant discrepancies within their acceptance rules.

Future stability without monitoring.

“Partially ignored” is best treated as a processing-quality condition, not a sixth lifecycle state. Google documents a warning as a case where the record is not rejected but some portion of its data is ignored. A SUCCESS destination status therefore still requires warning review.

Business eligibility versus transport acceptance

The business definition must exist before serialization. For the worked example, use a wholly synthetic event: CRM-SYN-SALE-00017, hypothetically approved as a “Qualified sale” when a signed order reaches the CRM’s booked state. Its hypothetical value is USD 1,250 and event time is 2026-09-14T16:20:00+03:00. Those identifiers, values and dates are invented for this article; no upload was executed.

At transport time, Data Manager’s successful ingestion response contains an auto-generated requestId; optional invalid fields can also produce fieldWarnings. Google says diagnostics are available only for successful requests that were not validateOnly=true. A request receipt is therefore a traceable transport event, not certification of the sale, the match, or the reporting effect.

A useful rule is: business eligibility is decided upstream; transport acceptance is observed downstream. Never substitute one for the other.

Destination processing versus attribution and reporting

Data Manager processing is asynchronous. Google tells clients to retrieve status per destination until it reaches SUCCESS, PARTIAL_SUCCESS or FAILURE. SUCCESS means processing completed without errors, but warnings still need review; PARTIAL_SUCCESS means some records succeeded and others failed.

Attribution and reporting sit beyond that boundary. Google’s Data Manager upgrade steps (updated September 15, 2026) explicitly instruct implementers to verify results with both Data Manager diagnostics and performance reports in the Google Ads UI or API.

That creates a useful evidence question at every handoff:

  •        Received? Show the successful response and requestId.

  • Processed? Show destination status and diagnostics.

  •       Partially ignored? Show warning reasons/counts and their business relevance.

  •        Attributed? Show the agreed Google Ads conversion metric and action.

  •        Reported/reconciled? Show the cohort definition, time window, value rules and discrepancy disposition.

Freeze conversion definitions before moving the transport

Do not use a transport migration as an excuse to redefine the conversion. Changing the CRM milestone, value rule, conversion action, goal configuration and API route together makes a discrepancy impossible to localize. Keep SEO and SEA measurement foundations as background; this migration ledger should instead preserve the exact business event that the existing pipeline meant to send.

For each conversion action, approve a compact “conversion contract” before code changes begin. Data Manager maps the old Google Ads conversion_date_time to event_timestamp; JSON uses RFC 3339. It maps conversion_value directly to conversionValue as a currency value, not micros, and currency_code to currency.

Contract field

Hypothetical worked-example value

Owner

Acceptance evidence

Business milestone

Signed order becomes BOOKED

CRM steward + campaign owner

Versioned CRM rule

Source event ID

CRM-SYN-SALE-00017

CRM steward

Immutable source-row reference

Event timestamp

2026-09-14T16:20:00+03:00

CRM steward

Source system timestamp semantics

Value/currency

1250.00 USD

Finance/CRM rule owner

Value rule and currency source

Google Ads action

Qualified sale – offline

Campaign owner

Action ID, type and owner recorded

Conversion-action owner

ADS-OWNER-SYN-001

Google Ads admin

Verified account mapping

Approval

CHANGE-SYN-042

Named local approver

Change record

Proposed control: freeze this contract for the pilot and cutover window. Any intentional business-definition change should get a different contract version and an explicit evaluation plan. That is a local governance rule, not a Google product requirement.

For the synthetic sale, the payload boundary begins only after the CRM has asserted eligibility under the frozen contract. The integration may then transform identifiers and map the event, but it must not silently recalculate whether the sale “counts.” This keeps marketing’s conversion meaning visible while engineering changes the transport.

Map accounts, projects and destination identifiers

The most expensive mapping error is often not a malformed email; it is a perfectly formatted event sent toward the wrong account or conversion action. Google’s Data Manager send-events guide (updated September 15, 2026) states that for Google Ads offline conversions the operatingAccount must be the Google Ads account that owns the conversion action. The productDestinationId must be the ID of a conversion action whose type is UPLOAD_CLICKS; the UI source is “Website (Import from clicks).”

Build a source-to-destination ledger before making a production request.

Mapping element

Documented field/behavior

Local evidence to retain

Common failure

Conversion owner

operatingAccount

Customer ID plus screenshot/query evidence of ownership

Using campaign-serving account by habit

Credential context

loginAccount

Account in which credential user has access

Confusing login identity with owner

Target action

productDestinationId

Numeric conversion-action ID

Sending a resource name instead of numeric ID

Direct vs partner

linkedAccount only for applicable partner-link path

Access-path type and approver

Copying partner fields into advertiser path

Data Manager auth

Cloud project + enabled API + OAuth credentials/scope

Project ID, identity, scope, environment

Assuming Google Ads API access automatically enables Data Manager

The Data Manager field mappings guide (updated September 15, 2026) is particularly important for legacy migrations: the old customer_id maps to the destination operating_account, but the required account may differ from the customer ID used in legacy Google Ads API requests. The conversion action maps to a numeric product_destination_id.

Operating account, login account and conversion action

Do not assume the account running the campaign owns the action. Data Manager explicitly removed one legacy convenience: the Google Ads API could accept a parent or descendant account around the conversion customer in some cases, while Data Manager requires the conversion customer itself as operating_account.

For a direct advertiser using manager credentials, Google’s destination documentation shows the child/client as operating_account and the manager as login_account. For a data partner, the send-events guide defines a distinct DATA_PARTNER login path and may require linkedAccount when the partner link is through a parent. Keep those two architectures separate.

Proposed negative test: in a nonproduction/approved test, create a validation-only variant with an intentionally wrong owner mapping. The goal is to prove that your test harness can distinguish mapping failure from the correct path without executing a conversion. Do not assert a specific error code unless your authorized environment actually returns it; validateOnly=true validates but does not execute, and it produces no later diagnostics.

Historical allowlists versus current API access

Preserve three separate pieces of access evidence: legacy offline-import eligibility, current Google Ads Cloud-project access, and Data Manager authentication/destination access.

Google’s historical UploadClickConversions restriction is still listed, even after developer-token sunset. Current Google Ads API access levels belong to the Cloud project used for OAuth credentials. Data Manager, meanwhile, requires its API to be enabled in a Cloud project and uses the Data Manager OAuth scope; API keys are not an authentication option.

The Data Manager API access setup guide (accessed September 16, 2026) says user-account and service-account authentication are supported and identifies https://www.googleapis.com/auth/datamanager as the relevant scope. A new integrator should therefore not be told to obtain a legacy developer token.

Escalate when the same payload works under one authorized project/account path but not another. That pattern points first to access or destination context, not to normalization.

Normalize identifiers without corrupting the matching inputs

Offline conversion normalization is field-specific. Google’s user-data formatting guide (updated September 15, 2026) separates formatting, whitespace handling, SHA-256 hashing and encoding. Gmail/Googlemail addresses have rules that do not apply to other domains: remove dots before @ and strip the plus suffix for Gmail/Googlemail; for other domains, preserve dots and plus signs while lowercasing.

Synthetic input

Normalized input

Hash?

Encoding/test

[email protected]

[email protected]

SHA-256

Encode hash bytes as hex or Base64

[email protected]

[email protected]

SHA-256

Verify dots/plus were preserved

+1 (415) 555-0123

+14155550123

SHA-256

E.164, then hex/Base64

2026-09-14T16:20:00+03:00

RFC 3339 timestamp

No

Preserve valid offset semantics

Synthetic gclid placeholder

Send in adIdentifiers.gclid if valid for the use case

Do not apply email/phone hashing rules

Validate field mapping

The phone rule requires E.164 formatting with +, country code and digits; JSON timestamp fields use RFC 3339 and accept offsets. Hex output is case-insensitive while Base64 is case-sensitive.

This is where general backend API integration foundations help with deterministic transforms and tests, but the Google field rules must remain the source of truth.

Proposed control: test the pre-hash normalized value in disposable fixtures, then assert only the digest/encoding shape in production telemetry. Never print real customer identifiers or production hashes merely to debug the migration. Hashing is a transformation required for specified user identifiers; it is not, by itself, evidence of consent, anonymization, lawful use or permission to retain data. Those are separate governance questions.

Also resist “hash everything.” Google explicitly documents fields that are not hashed, including IP data in its relevant structure, and the event timestamp is a timestamp, not an identifier to hash. Apply only the transformation required for each field.

Design a privacy-conscious conversion evidence ledger

A useful CRM conversion audit trail should let an authorized reviewer reconstruct what was intended, what representation was sent, where it was sent, what Google reported about processing, and what later reporting showed, without turning operational logs into a duplicate customer database.

The ledger below is a proposed local design, not a Data Manager schema.

Evidence field

Purpose

Suggested owner

Data-minimization treatment

source_event_id

Joins back to CRM under controlled access

CRM steward

Store opaque internal key, not customer name

contract_version

Shows business definition used

Campaign owner

Non-personal metadata

payload_version_digest

Detects transform/config changes

Integration engineer

Digest canonical payload metadata; avoid raw PII

destination_owner_id

Proves intended conversion owner

Ads admin

Account ID only

conversion_action_id

Proves destination target

Campaign owner

Numeric ID

consent_review_ref

Links to governance decision

Privacy reviewer

Reference, not copied legal notes

submitted_at

Transport chronology

Integration engineer

Timestamp

request_id

Correlates successful request to diagnostics

Integration engineer

Store exactly as returned

destination_status

Persists per-destination result

Integration engineer

Vendor status + retrieval time

warning_error_summary

Captures ignored/rejected-data evidence

Integration engineer

Reasons/counts, no PII

reconciliation_disposition

Explains reporting gap

Analyst + owner

Coded reason and approver

Google’s REST ingestion response exposes the request identifier as requestId and row-level fieldWarnings; the diagnostics documentation and proto-style mappings render the same correlation concept as request_id. Later diagnostics are queried by that request ID and return status separately for each destination. Those documented identifiers make a correlation ledger possible, but Google does not define your retention period or access model for the CRM side.

Proposed privacy control: keep customer-source records in the CRM under its existing retention/access regime; keep integration telemetry in a narrower operations store with only the evidence required for replay, diagnostics and audit. Give production support access to the evidence ledger, not blanket access to raw customer profiles.

A hash should not become a retention loophole. The fact that Google requires SHA-256 for email and phone formatting does not establish that a hashed value is non-personal for your jurisdiction, risk model or contract. Record the privacy reviewer’s decision and minimize what the integration needs.

For the synthetic sale, the ledger would contain CRM-SYN-SALE-00017, the hypothetical action and owner IDs, and a payload-version digest. A real implementation would add the returned requestId only after a non-validation request. This article invents no production requestId and reports no executed test.

Submit a bounded pilot with explicit replay ownership

Data Manager uses a different request and error model from legacy UploadClickConversions. Google’s migration guide says Data Manager is fast-fail: if any field in an IngestEventsRequest fails validation, the whole request is rejected, rather than using the Google Ads API’s partial-failure model. The events.ingest REST reference (accessed September 16, 2026) allows at most 2,000 Event resources in one request.

That does not mean “send 2,000 every time.” Batch size is an operational choice within the documented limit. For a migration pilot, choose bounded cohorts that can be traced and repaired.

A robust pilot sequence is:

1.       Proposed: select synthetic records or an explicitly approved, minimized test cohort under the frozen conversion contract.

2.       Run validateOnly=true to catch request validation problems without executing the events. Google says validation-only requests are validated but not executed and only errors are returned.

3.       Obtain human approval to switch to a real submission for the bounded cohort.

4.       Have one accountable sender write the source watermark and local batch ID before sending.

5.       Persist the successful response requestId and any immediate fieldWarnings.

6.       Hand the request ID to the diagnostics process rather than re-sending because “nothing appeared yet.”

For broader patterns around integrating external APIs reliably, retries and failure isolation matter, but this pipeline needs conversion-specific replay controls.

The following is pseudocode for local correlation only. It is not a Data Manager request schema and it does not claim vendor idempotency:

# PSEUDOCODE: local state only; does not call or change Google services.
batch = reserve_batch(source_watermark, contract_version)

for event in approved_events:
    assert event.source_id not in local_completed_events
    batch.add(event.source_id, payload_digest(event))

response = data_manager_submit(reviewed_payload)   # actual API call implemented from current docs
record(batch.id, response.request_id, response.field_warnings)
mark(batch.id, "submitted_not_yet_reconciled")

Google documents transactionId as an optional unique identifier for the event in the generic reference, and the offline-conversion send-events table marks it optional for this use case. The sources inspected here do not establish a general idempotency guarantee for replaying the same offline event. Therefore, offline conversion replay controls should be local and conservative unless separate, current product documentation verifies deduplication behavior for the exact use case.

Avoid uncontrolled dual production uploads. A “backup sender” that posts the same source event through a second path can create an ambiguity you may not be able to unwind safely.

Read asynchronous diagnostics as an operating process

A successful submission is the start of asynchronous reconciliation, not the end. Google’s Data Manager diagnostics guide (updated September 15, 2026) says a successful request has status code 0/OK/HTTP 200, returns a request ID, and becomes eligible for diagnostics only when it was not validation-only. Google recommends waiting 30 minutes before the first status retrieval.

Processing can take up to 24 hours, although some requests may complete in as little as 30 minutes. Google gives an example backoff configuration that starts at 30 minutes, multiplies delay by 1.3, caps the delay at 60 minutes, and uses a 24-hour maximum total time, with jitter recommended. These are vendor polling guidelines, not an attribution service-level agreement.

Diagnostic evidence

Documented meaning

Operator action

Do not conclude

HTTP 200 + requestId

Request accepted at API boundary

Persist ID; schedule diagnostics

Attributed conversion

PROCESSING

Destination still processing; warnings/errors not populated

Keep bounded polling

Failure or success

SUCCESS

Processing complete without errors

Still inspect warnings

Full data used or reported conversion

PARTIAL_SUCCESS

Some records succeeded, others failed

Inspect errors/warnings; open repair item

Which CRM person failed unless evidence identifies it

FAILURE

All records for destination failed due to errors

Hold destination; remediate

Business event invalid

record_count

Records received for event ingestion, including successful and failed

Compare to expected destination intake

Successful or matched count

Google reports status per destination. Persist one row per request-destination pair. A single green request-level dashboard that hides a second destination’s partial failure is an operational anti-pattern.

When to poll and what terminal status proves

Keep ingestion transport retries and status polling as different state machines.

A failed HTTP submission is a transport/request problem: inspect the returned error and decide whether it is safe to retry. A successful submission with PROCESSING is not a reason to submit the conversions again; it is a reason to poll the existing request_id. Google specifically says to send a separate status request for each successful request ID and poll until every destination is terminal.

Proposed local escalation rule: use Google’s 24-hour maximum processing guidance as the outer diagnostic window, then escalate any request that still lacks a documented terminal destination state rather than silently extending polling or replaying. The 24-hour figure is documented; “escalate rather than replay” is the local control.

Validation-only requests sit outside that process. Because Google says diagnostics can only be retrieved for successful requests that do not have validate_only=true, do not create an operations ticket expecting a later destination status for validation-only testing.

Warnings, partial failure and misleading record counts

Consider a hypothetical two-destination test; these counts and outcomes are invented and are not observations from a real execution.

Destination

Hypothetical terminal status

Received record_count

Hypothetical diagnostics

Correct interpretation

Action A

SUCCESS

50

Warning reason affects 4 records

All 50 avoided processing errors, but some data portions were ignored; review warning impact.

Action B

PARTIAL_SUCCESS

50

Error reason count 3; separate warning reason count 5

Some records failed; warning-affected records were not rejected for that warning. Do not infer 42 “clean” unique records by arithmetic.

The last caution matters because Google documents warning/error information as lists of reason/count objects. It does not state in the diagnostics guide that all reason buckets are mutually exclusive at record level. Proposed safe accounting rule: never add reason counts to derive a unique-person failure count unless the API response or another current reference explicitly establishes that exclusivity.

For event ingestion, the documented record_count includes both successful and failed records. Match-rate fields described elsewhere on the diagnostics page belong to audience-member diagnostics, not event-ingestion status. Do not transplant audience match-rate concepts into Google Ads offline event diagnostics.

Repair rejected inputs without replaying every success

Repair starts by classifying the failure layer. Do not respond to every anomaly with “resend the batch.” Data Manager’s fast-fail validation model, asynchronous destination processing and absence of a verified general replay-idempotency guarantee require more disciplined recovery.

Failure/exception

Evidence

Disposition

Replay rule

Request validation error

Failed ingest response

Fix malformed/missing field; revalidate

Entire request was not accepted; retry after correction and approval

Wrong action owner/destination

Mapping review or authorization/destination failure

Hold; correct owner/action map

Do not “try nearby accounts” in production

Cloud project/auth problem

Access error under known-good payload

Escalate to project/API access owner

No payload replay until access path is resolved

Timeout/unknown transport outcome

Client timeout with uncertain server receipt

Hold and investigate request logs/correlation

No blind replay; idempotency not established here

SUCCESS with warning

Destination warning info

Assess ignored field’s business relevance

Normally not a failure replay trigger by itself

PARTIAL_SUCCESS

Terminal status + error counts

Build narrowed repair cohort where evidence permits

Do not replay known successes

FAILURE

All records failed for destination

Fix destination/reason; approve resubmission

Resubmit only after root cause and scope are documented

Google defines a warning as data being partially ignored without rejecting the record and an error as the record being completely rejected. The diagnostics guide documents aggregate reason and record counts; it does not document a per-record rejected customer identity list in that destination-status section.

That limitation changes recovery. If your local batch ledger can deterministically isolate records from immediate field-path warnings or from pre-submit validation, repair those records. If asynchronous processing gives only aggregate error counts and you cannot identify the specific rejected source rows, say so. Narrow the next approved repair batch using the strongest available partitioning evidence; do not invent a rejected person.

A proposed remediation ledger should record original local batch ID, source-event IDs included, failure layer, vendor reason, mapping/config version, repair change, approver, new submission ID and whether prior records were known successful, known failed or unknown. “Unknown” is a legitimate state and is safer than pretending diagnostic detail exists.

Reconcile with Google Ads without promising exact parity

Google Ads conversion upload reconciliation must compare like with like. The ingestion pipeline asks whether Data Manager accepted and processed the event. Google Ads reporting asks whether conversions appear under a specific conversion action, metric definition and reporting window. Those are related but different systems.

Google’s conversion reporting guide (accessed September 16, 2026) says conversion-action metadata can be queried from the conversion_action resource, and conversion metrics can be segmented by conversion_action. It also warns that conversion performance data is not available instantly and that all-zero rows may not be returned.

For teams already reasoning about Performance Max reporting boundaries, keep channel/campaign interpretation separate from source-event ingestion health.

A current, documented Google Ads Query Language example for a read-only campaign-level reconciliation is:

SELECT
  campaign.name,
  segments.conversion_action,
  metrics.conversions,
  metrics.conversions_value
FROM campaign

Prerequisites: authorized Google Ads API reporting access and an explicitly chosen date scope in the surrounding request/reporting process. This query changes no advertising state. Google publishes this field combination in its current conversion-reporting documentation.

Do not treat the query as a row-level receipt for each CRM sale. It returns aggregated performance metrics. Build the reconciliation around definitions:

Discrepancy class

Question

Primary owner

Typical next evidence

Business-scope

Were the same CRM milestones selected?

CRM steward

Contract version/source cohort

Time-window

Are source time, conversion time and report window aligned?

Analyst

Timestamp/window specification

Value/currency

Are value and currency rules identical?

CRM + analyst

Source value and action report

Destination

Was the right owner/action used?

Integration + Ads admin

Destination ledger

Processing

Did warnings/errors affect usable fields/records?

Integration engineer

Data Manager diagnostics

Reporting/attribution

Did a processed event contribute to the chosen Google Ads metric?

Analyst/campaign owner

Conversion-action segmented report

Latency

Is the comparison being made before reporting has settled?

Analyst

Re-run schedule; documented freshness context

A mismatch is not automatically “attribution latency,” and processing latency is not a universal excuse for report differences. First establish that both sides use the same conversion contract, action, window and value definition. Then classify the residual.

Work a 1,000-record hypothetical pilot

This 1,000-record exercise is invented to demonstrate bookkeeping. It is not a test that was run, not a match-rate benchmark and not evidence of expected performance.

Assume 1,000 synthetic or otherwise approved source events enter the migration review. The local ledger deliberately uses mutually exclusive states:

Hypothetical local state

Count

Meaning

Cleared by chosen evidence checks

900

Business contract, mapping, transformation and required reconciliation evidence are complete under the local pilot rules

Quarantined before submission

40

Failed pre-submit business/data checks; never sent

Awaiting diagnostics

30

Successfully submitted but not yet terminal at every destination

Repair queue

30

Known issue needs approved remediation/resubmission decision

Total

1,000

Mutually exclusive source records

The arithmetic 900 / 1,000 = 90% is a hypothetical local evidence-completion measure. It says only that 900 source records reached the locally defined “cleared” state. It says nothing by itself about Google match rate, attribution rate, incremental revenue, bidding improvement or return on investment.

Within the documented Data Manager request limit, 1,000 events could fit in one request because the REST reference currently permits at most 2,000 events per request. That is not a recommendation to use a 1,000-event batch. Smaller local batches may improve fault isolation under a fast-fail validation model.

Follow one synthetic record, CRM-SYN-SALE-00017, end to end: business-approved under contract v1; identifiers normalized with the applicable field rules; mapped to the verified conversion-action owner; included in an approved batch; successful submission correlated by the returned request ID; per-destination diagnostics reviewed; and only later compared with the chosen Google Ads conversion report. At every stage, the evidence stops where the next system begins.

Pilot decision: PASS only when the cleared cohort is understood and the remaining 100 records have explicit quarantine, waiting or repair ownership. HOLD if unknown replay exposure remains. ESCALATE when account/project access or undocumented product behavior blocks a safe decision.

Cut over with a reconciliation window and stop rules

Cutover is a routing change, not a celebration of a green API call. The aim is to move one source of truth from the legacy sender to Data Manager while preserving enough overlap evidence to prove that source coverage was neither dropped nor unintentionally duplicated.

A proposed staged plan is:

1.       Freeze conversion-contract version and source watermark.

2.       Complete the bounded pilot and close access/mapping issues.

3.       Define a cutover watermark such as “events committed after source sequence X go only to Data Manager.”

4.       Disable or drain the legacy production sender according to that watermark.

5.       Audit any intentional overlap cohort by source event ID.

6.       Reconcile Data Manager destination evidence and Google Ads reporting on an agreed schedule.

7.       Keep a bounded repair path with one replay approver.

Stop condition

Local action

Why

Owner/action mapping cannot be independently verified

HOLD

Correct transport to wrong destination is still wrong

Unknown duplicate-send exposure

HOLD

Replay behavior is not established here as generally idempotent

Repeated auth failure on known-good mapping

ESCALATE

Access problem should not be “fixed” by payload mutation

Terminal processing failure beyond approved tolerance

HOLD

Root cause before scale

Diagnostics remain unresolved beyond Google’s 24-hour processing guidance

ESCALATE

Polling window is exhausted; do not blind replay

Pilot evidence complete and exceptions owned

PASS

Proceed to controlled sender switch

Rollback must be described precisely. In this operating model, rollback means reviewed routing of future eligible events back to an approved sender, if that sender remains authorized. It does not mean that previously imported conversions are automatically deleted or reversed.

Do not assume legacy conversion-adjustment, retraction or deduplication methods have direct Data Manager equivalents. The sources used for this migration procedure establish sending, mapping and diagnostics, but not a blanket feature-parity promise for reversal. Before modifying previously imported data, obtain current, use-case-specific Google guidance and document the action separately. That unresolved boundary is safer than inventing an adjustment command.

Assign business and engineering ownership

A conversion pipeline fails organizationally when everyone can send and nobody owns the meaning. The responsibility model should put the business definition, CRM truth, API transport and privacy decision in different reviewable hands. For a broader discussion of marketing and analytics responsibilities, keep this table as the migration-specific operating split.

Role

Accountable for

Evidence owned

Escalates when

Campaign owner

Conversion meaning, action selection, reporting interpretation

Contract, action ID/name, acceptance decision

Report behavior contradicts business intent

CRM steward

Source eligibility, source ID, event time, value/currency

Source cohort and business-rule version

Source event cannot be reconstructed

Integration engineer

Mapping, normalization, request correlation, diagnostics, replay controls

Payload digest, request ID, destination status

Auth, fast-fail, processing or replay uncertainty persists

Privacy reviewer

Consent/governance review, minimization, retention/access expectations

Review reference and approved data boundary

Proposed data handling exceeds approved purpose

Proposed control: no role can unilaterally declare the migration complete. The campaign owner can validate business meaning, but cannot turn HTTP 200 into attribution evidence. The engineer can prove destination processing, but cannot redefine the sale. The analyst can reconcile reports, but cannot infer that a hashed identifier settles privacy obligations.

To strengthen the paid-search and measurement foundations beneath this specialist integration, review Refonte Learning’s SEO & SEA Mastery Program, which lists Google Advertising Fundamentals and Analytics and Performance Tracking in a three-month curriculum requiring 12–14 hours per week.

The program page also says no prior experience is required while separately listing an admission prerequisite of working toward a bachelor’s or higher-level degree; those statements should remain distinct rather than being flattened into “open to everyone.” It states that successful completion offers a Training Certificate and Certificate of Internship.

Approve the migration only when the evidence is complete

A migration should end in an explicit decision record, not an impression. The minimum pass condition is that business meaning, account/action mapping, transformation, submission correlation, destination diagnostics, replay exposure and reporting reconciliation are each evidenced at the level they actually prove.

Decision

Required evidence

Examples of blockers

PASS / cut over

Frozen contract; verified owner/action; Data Manager access proven; bounded pilot; terminal per-destination review; warnings dispositioned; replay owner; reporting reconciliation plan

None material within approved local tolerance

HOLD / repair

Evidence shows a fixable data/mapping/processing issue

Wrong owner, malformed field, unexplained warning impact, unknown duplicates

ESCALATE / platform or governance review

Problem cannot safely be solved by payload changes

Cloud-project access issue, destination authorization ambiguity, >24-hour unresolved processing, undocumented reversal requirement

The checklist before PASS should answer: Is the operatingAccount the actual conversion-action owner? Is the action UPLOAD_CLICKS for this offline-click use case? Are login/partner relationships mapped to the correct path? Are email/phone normalization tests field-specific? Is validation-only evidence separated from real submission evidence? Is every real request ID linked to per-destination diagnostics? Are warnings reviewed even on SUCCESS? Is reporting evidence kept separate from ingestion evidence?

Use this proposed 30-day follow-through schedule after cutover: days 1–3 review every migration batch and destination; day 7 sign the first cohort reconciliation; day 14 review repair/replay exceptions and access changes; day 21 sample ledger-to-CRM traceability; day 30 obtain campaign-owner, CRM, engineering and privacy sign-off or reopen the migration. These are local control points, not Google-prescribed timings.

Did June 15 stop all imports? No. Google’s May 15 announcement said new adopters would be blocked from June 15 while established adopters could continue during migration. The September deprecations table narrows the historical activity test to December 17, 2025 through June 15, 2026 and says the restriction remains effective. Because the two sources express the historical window differently, verify the specific integration’s authorized behavior rather than calling June 15 a universal end-of-service date.

Does a request ID prove attribution? No. Data Manager returns requestId after a successful ingestion request and uses it to retrieve diagnostics. Google’s migration steps separately require performance-report verification. The request ID proves correlation to an accepted ingestion request, not that the event was attributed or appeared in a Google Ads metric.

Do warnings matter on SUCCESS? Yes. Google defines SUCCESS as destination processing completed without errors and explicitly says to check warnings. A warning means the record was not rejected, but part of its data was ignored. Whether that ignored part matters to your business acceptance rule requires review.

Is a second sender a safe fallback? Not by default. The current sources inspected here do not establish a blanket idempotency or cross-sender deduplication guarantee for replaying Google Ads offline events through Data Manager. Treat dual sending as duplicate-risk until the exact behavior is verified for the use case. A safe fallback is a reviewed routing decision with source watermarks, one replay owner and documented overlap, not an automatic second POST.

The migration is approved when the organization can show where each conversion record is in the evidence chain and where its knowledge stops. That is the standard that prevents three costly category errors: calling receipt “processing,” calling processing “attribution,” and calling attribution “business impact.” A Data Manager API offline conversion migration is controlled when those boundaries remain visible after the last legacy sender is turned off.