Linking to Manager Accounts

Manager accounts are Google Ads accounts that are used for administrative purposes and not for serving ads. They act as single points of access for the accounts they manage, so are used in setting up consolidated billing and other features across multiple accounts.


The two services that are used to create a link between two accounts in the Google Ads API are the CustomerClientLinkService and the CustomerManagerLinkService. In the names for these services, the word "Customer" refers to the current account in the context of the request.

  • If you're a manager account looking down at your managed clients, you would employ the CustomerClientLinkService.

  • If you're a client account interested in the link to a manager account above you in the hierarchy, you would select the CustomerManagerLinkService.

These two services are essentially two different views of the same link. If manager account M manages client account C, then the CustomerClientLink when viewed from account M is the same entity as the CustomerManagerLink viewed from account C.


Linking two accounts must always be initiated from the manager account, and then the link must be accepted from the client account. The state of the link is stored in the status field of the CustomerClientLink or CustomerManagerLink. See the list of valid statuses. Use PENDING to initiate the link, and ACTIVE to accept the link.

Linking two pre-existing Google Ads accounts can be accomplished in three steps.

  1. While authenticating as the manager account, extend an invitation to the client account by creating a CustomerClientLink with status PENDING.
  2. While authenticating as the manager account, query the GoogleAdsService to find the manager_link_id of the CustomerClientLink you created.
  3. While authenticating as the client account, accept the invitation from the manager account by mutating the CustomerManagerLink to have status ACTIVE.


The following code example demonstrates how to establish a link between a manager account and its client:


def link_manager_to_client(manager_customer_id, client_customer_id)
  # GoogleAdsClient will read a config file from
  # ENV['HOME']/google_ads_config.rb when called without parameters
  client =

  # This example assumes that the same credentials will work for both customers,
  # but that may not be the case. If you need to use different credentials
  # for each customer, then you may either update the client configuration or
  # instantiate two clients, one for each set of credentials. Always make sure
  # to update the configuration before fetching any services you need to use.

  # Extend an invitation to the client while authenticating as the manager.
  client.configure do |config|
    config.login_customer_id = manager_customer_id.to_i

  client_link = client.resource.customer_client_link do |link|
    link.client_customer = client.path.customer(client_customer_id)
    link.status = :PENDING

  client_link_operation = client.operation.create_resource.customer_client_link(client_link)

  response = client.service.customer_client_link.mutate_customer_client_link(
    customer_id: manager_customer_id,
    operation: client_link_operation,

  client_link_resource_name = response.result.resource_name
  puts "Extended an invitation from customer #{manager_customer_id} to " \
      "customer #{client_customer_id} with client link resource name " \

  # Find the manager_link_id of the link we just created, so we can construct
  # the resource name for the link from the client side.
  query = <<~QUERY
      customer_client_link.resource_name = '#{client_link_resource_name}'

  response = manager_customer_id, query: query)
  manager_link_id = response.first.customer_client_link.manager_link_id

  # Accept the link using the client account.
  client.configure do |config|
    config.login_customer_id = client_customer_id.to_i

  manager_link_resource_name = client.path.customer_manager_link(

  manager_link_operation =
      client.operation.update_resource.customer_manager_link(manager_link_resource_name) do |link|
    link.status = :ACTIVE

  response = client.service.customer_manager_link.mutate_customer_manager_link(
    customer_id: client_customer_id,
    operations: [manager_link_operation],

  puts "Client accepted invitation with resource name " \