| name | data-manager-api-event-ingestion |
| description | Guides developers through implementing event and conversion ingestion to Google products using the Data Manager API /v1/events/ingest endpoint and its associated client libraries. Use this skill when the user wants to upload offline conversions, enhanced conversions for leads, click conversions, Google Analytics web or app events, or any other event ingestion use case supported by the Data Manager API. Don't use for uploading audience members (use the data-manager-api-audience-ingestion skill). |
| metadata | {"version":1.1,"category":"GoogleAds"} |
Data Manager API Event Ingestion
Implementation Workflow
Prerequisites
- Authentication & Library Installation: If you need to set up access to
the Data Manager API or install the client and utility libraries, refer to
the
data-manager-api-setup skill.
Step 1: Identify Use Case & Read Documentation
- Determine Destination Account Type: [CRITICAL] If it's not
explicitly stated, STOP and CLARIFY with the user where the data is being
sent (e.g., Google Ads, Floodlight, Google Analytics)
BEFORE generating any code. Do not assume Google Ads by default. This maps
to the
account_type field of the operating_account in the Destination,
and also determines valid event identifiers and requirements.
- Read Documentation: [CRITICAL] Follow the
Send events guide
to implement the integration, as steps for configuring and sending the
request may vary between destinations.
Step 2: Retrieve Code Sample
[!IMPORTANT]
If writing or updating an ingestion script, ALWAYS retrieve the
relevant code sample to use as a reference:
Step 3: Retrieve Migration Guides
[!CRITICAL]
If refactoring code to upgrade from another Google API, ALWAYS
extract the full contents of the relevant field mapping guide.
Google Ads
Google Analytics
Campaign Manager 360 (CM360)
Step 4: Implementation
Implement the ingestion logic using the following checkpoints:
Formatting
-
Fetch the Format user data
guide and use that as the source of truth for formatting and
normalization rules.
-
Use the utility library to format, hash, and encrypt user data
(emails, phone numbers, addresses).
Python Example:
from google.ads.datamanager_util import Formatter
from google.ads.datamanager_util.format import Encoding
formatter: Formatter = Formatter()
processed_email: str = formatter.process_email_address(
email, Encoding.HEX
)
Critical Gotchas
- Format
product_destination_id as a numeric string. It is NOT a resource
name path.
- Format
event_timestamp strictly in RFC 3339 format. Use the SDK's typed
timestamp object instead of a raw string where available.
- Nest click identifiers (
gclid, gbraid, wbraid) inside the
ad_identifiers block, not directly on the base event payload.
- The enum values for
ConsentStatus are CONSENT_GRANTED and
CONSENT_DENIED. Do not use the values GRANTED and DENIED.
- Note that
consent can be set globally on the IngestEventsRequest or on
individual Events.
- Verify that
UserIdentifier uses email_address and phone_number.
Do not use the Google Ads API fields hashed_email and
hashed_phone_number.
- Ensure the currency field on the event is named
currency, not
currency_code.
- Do not call the diagnostics endpoint (
retrieve_request_status) if
validate_only is set to true.
Error Handling & Troubleshooting
Inspecting Error Payloads
[!IMPORTANT]
Refer to Understand API Errors
for a detailed guide on how to understand the structure of errors returned by
the API.
Retrieving Request Status (Diagnostics)
Periodically poll for status using exponential backoff, starting at least
30 minutes after sending the IngestEventsRequest.
- Call
client.retrieve_request_status using
RetrieveRequestStatusRequest(request_id=...).
- Loop through
request_status_per_destination in the response to inspect
each target's request_status.
- If processing is complete and
request_status is SUCCESS,
PARTIAL_SUCCESS, or FAILED, inspect diagnostic values:
- Event Record Counts: Check
events_ingestion_status.record_count
(includes both success and failure).
- Error Details: If status is
FAILED or PARTIAL_SUCCESS, inspect
each error's reason and record_count under
error_info.error_counts.
- Warning Details: Inspect each warning's
reason and record_count
under warning_info.warning_counts (even if the destination status is
SUCCESS).
API Reference