Skip to main content

Google: add createConversionDestination (conversion-action creation) — parity with the existing LinkedIn endpoint

The Conversions API has createConversionDestination for LinkedIn — you can create the conversion rules a customer needs with one call, making conversion onboarding fully programmatic. Google has no equivalent, even though Google has the same requirement: sendConversions can only deliver into a pre-existing conversion action of type UPLOAD_CLICKS (Google: create conversion actions (https://developers.google.com/google-ads/api/docs/conversions/create-conversion-actions)), and ad accounts don't come with one.

Today that means every end customer must manually create conversion actions inside Google Ads (picking type, category, primary/secondary, counting) before anything sent via Zernio can land. For platforms building on Zernio, it's the one manual step left in an otherwise fully API-driven flow — LinkedIn proves how clean the automated version is.

Proposed endpoint

POST createConversionDestination on a googleads SocialAccount — same shape as the LinkedIn variant, backed by Google's ConversionActionService.MutateConversionActions. Minimal body:

┌────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Field │ Notes │ ├────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ name │ string; Google enforces per-account uniqueness │ ├────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ category │ Google's ConversionActionCategory enum (https://developers.google.com/google-ads/api/reference/rpc/v24/ConversionActionCategoryEnum.ConversionActionCategory) (e.g. PURCHASE, SUBSCRIBE_PAID, SIGNUP, IMPORTED_LEAD, BOOK_APPOINTMENT) │ ├────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ primaryForGoal │ boolean — must be settable and reliably honored. Google defaults it to true (field reference (https://developers.google.com/google-ads/api/fields/v24/conversion_action)), and a primary action immediately affects the advertiser's Smart Bidding │ │ │ (primary vs. secondary (https://support.google.com/google-ads/answer/11461796)). Tools need false (record-only) as the safe create state. │ ├────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ countingType │ MANY_PER_CLICK / ONE_PER_CLICK (counting guidance (https://support.google.com/google-ads/answer/3438531)) │ └────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

type is always UPLOAD_CLICKS (immutable at creation). Everything else — value settings, attribution windows — can stay at Google's defaults. Response: the created destination's id (conversion-action resource name), matching what listConversionDestinations already returns.

Two error passthroughs that make it integration-safe

  • DUPLICATE_NAME surfaced distinctly → callers can treat "already exists" as success and reuse (this is also what makes the endpoint naturally idempotent — Google enforces unique names server-side)

  • TOO_RECENT_CONVERSION_ACTION surfaced distinctly → Google rejects uploads for ~6 hours after an action is created; callers need to recognize it as retryable, not a hard failure (troubleshooting doc (https://developers.google.com/google-ads/api/docs/conversions/troubleshooting))

One implementation note

For accounts using cross-account (manager-level) conversion tracking, the action must be created in the conversion customer (customer.conversion_tracking_setting), not necessarily the connected account — same resolution the upload path already does.

Why it's broadly useful

Anyone using Zernio to send Google conversions hits this wall — the send side is fully programmatic, but the receiving object requires end-customer clicks inside Google Ads. This single endpoint closes the loop and brings Google to the same zero-touch onboarding the LinkedIn API already delivers.

Status: Completed2 comments

Log in to comment and vote

Comments2

  • Miquel Palet López

    Team•

    Jul 13

    Good news, this is already supported!

    POST /v1/accounts/{accountId}/conversion-destinations with a Google Ads account creates a new conversion action (type UPLOAD_CLICKS) via the Google Ads API. Body: adAccountId (numeric customer id or customers/{id}), name, type (unified event name like Purchase or a Google category), optional countingType and primaryForGoal. It returns 201 with the destination id (customers/{cid}/conversionActions/{aid}) to use as destinationId when sending conversions.

    Details here: docs.zernio.com/ads/create-conversion-destination. Thanks for the request!

  • Dev

    •

    Jun 12

    That didn’t render correctly, here’s the ask

    The Conversions API has createConversionDestination for LinkedIn — one call creates the conversion rules a customer needs, fully programmatic. Google has no equivalent, even though Google has the same requirement: sendConversions can only deliver into a pre-existing conversion action of type UPLOAD_CLICKS, and ad accounts don't come with one. (Google's guide: https://developers.google.com/google-ads/api/docs/conversions/create-conversion-actions)

    Today every end customer must manually create conversion actions inside Google Ads (type, category, primary/secondary, counting) before anything sent via Zernio can land. For platforms building on Zernio it's the one manual step left in an otherwise fully API-driven flow. LinkedIn proves how clean the automated version is.

    PROPOSED ENDPOINT

    POST createConversionDestination on a googleads SocialAccount — same shape as the LinkedIn variant, backed by Google's ConversionActionService.MutateConversionActions. Minimal body, four fields:

    • name — string; Google enforces per-account uniqueness

    • category — Google's ConversionActionCategory enum, e.g. PURCHASE, SUBSCRIBE_PAID, SIGNUP, IMPORTED_LEAD, BOOK_APPOINTMENT (https://developers.google.com/google-ads/api/reference/rpc/v24/ConversionActionCategoryEnum.ConversionActionCategory)

    • primaryForGoal — boolean, must be settable and reliably honored. Google defaults it to TRUE (https://developers.google.com/google-ads/api/fields/v24/conversion_action), and a primary action immediately affects the advertiser's Smart Bidding (https://support.google.com/google-ads/answer/11461796). Tools need FALSE (record-only) as the safe create state.

    • countingType — MANY_PER_CLICK or ONE_PER_CLICK (https://support.google.com/google-ads/answer/3438531)

    type is always UPLOAD_CLICKS (immutable at creation). Everything else — value settings, attribution windows — can stay at Google's defaults. Response: the created destination's id (conversion-action resource name), matching what listConversionDestinations already returns.

    TWO ERROR PASSTHROUGHS THAT MAKE IT INTEGRATION-SAFE

    • DUPLICATE_NAME surfaced distinctly, so callers can treat "already exists" as success and reuse. This also makes the endpoint naturally idempotent — Google enforces unique names server-side.

    • TOO_RECENT_CONVERSION_ACTION surfaced distinctly. Google rejects uploads for ~6 hours after an action is created; callers need to see it as retryable, not a hard failure. (https://developers.google.com/google-ads/api/docs/conversions/troubleshooting)

    ONE IMPLEMENTATION NOTE

    For accounts using cross-account (manager-level) conversion tracking, the action must be created in the conversion customer (customer.conversion_tracking_setting), not necessarily the connected account — the same resolution the upload path already does.

    WHY IT'S BROADLY USEFUL

    Anyone using Zernio to send Google conversions hits this wall: the send side is fully programmatic, but the receiving object requires end-customer clicks inside Google Ads. This single endpoint closes the loop and brings Google to the same zero-touch onboarding the LinkedIn API already delivers.