Google Actions Center (Merchants feed) Connector
Which business application?:
Google Actions Center — the partner portal Google uses to onboard
businesses into AI Mode / Gemini as action providers. Distinct from
Google Ads. Angi is publishing a nightly Merchants feed so Google can
AI-match our ~1.4M indexable pros to Google Business Profiles and
surface Angi as a home-services action provider in AI Mode. Reference:
What object in the destination?:
A "merchant" record — one record per business (pro). Google's Merchants
feed schema requires:
- merchant_id (opaque, URL-safe, immutable identifier issued by the
partner)
- name (business name)
- category (required; constant "home_service" applied for all Angi
merchants)
- geo.address (required; country="US", locality=city, region=state,
postal_code=zip)
Optional Google fields we omit for v1: telephone, geo lat/long,
action_link, url, trust signals. Business-profile hydration (URLs,
ratings) happens via a separate Pro Lookup API keyed on merchant_id
— not via the feed itself.
Volume: ~1.4M merchant records per nightly snapshot.
Delivery format: JSON, gzip-compressed, sharded (~200 MB per shard,
~1M records per shard). Each shard carries a metadata envelope with
processing_instruction, shard_number, total_shards, nonce, and
generation_timestamp.
How will records be identified?:
Primary identifier is merchant_id — Angi's canonical business UUID,
issued by us and used opaquely by Google (also serves as the join key
for our companion Pro Lookup API). Dedupe at UUID grain: at most one
merchant record per UUID. When a single UUID appears as both an ADS
and a LEADS row in our source data, the LEADS / canonical row wins.
What sync behaviour?:
Full-snapshot replacement per run (Google's processing_instruction =
PROCESS_AS_COMPLETE). Google has deprecated incremental processing for
Merchants feeds, so incremental / upsert semantics are not applicable;
each nightly delivery fully supersedes the previous snapshot.
Cadence: nightly (one full snapshot per 24 hours).
Delivery mechanism (critical for connector design):
- Transport: SFTP to partnerupload.google.com:19321
- Auth: SSH key-based (partner uploads public key to Actions Center;
private key held on the sender side)
- Files: gzip-compressed JSON shards, ≤200 MB compressed each,
numbered as shard_number / total_shards
- Environment separation: upload username differs between production
and sandbox (Google issues separate feed-user accounts per env)
- Metadata envelope wrapping the merchant records must include
processing_instruction, shard_number, total_shards, nonce, and
generation_timestamp
Sandbox testing: Google provides a sandbox upload user for validation
against processing reports before production go-live; the connector
should support toggling between sandbox and production usernames per
environment.
Additional details:
Please sign in to leave a comment.
Comments
0 comments