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.

Services

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.

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 .

Procedure

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 .

Example

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

Java

 private 
  
 void 
  
 runExample 
 ( 
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 clientCustomerId 
 , 
  
 long 
  
 managerId 
 ) 
  
 { 
  
 // 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 you use a GoogleAdsClient with the proper credentials to fetch any services 
  
 // you need to use. 
  
 // Extend an invitation to the client while authenticating as the manager. 
  
 googleAdsClient 
  
 = 
  
 googleAdsClient 
 . 
 toBuilder 
 (). 
 setLoginCustomerId 
 ( 
 managerId 
 ). 
 build 
 (); 
  
 CustomerClientLinkOperation 
 . 
 Builder 
  
 clientLinkOp 
  
 = 
  
 CustomerClientLinkOperation 
 . 
 newBuilder 
 (); 
  
 clientLinkOp 
  
 . 
 getCreateBuilder 
 () 
  
 . 
 setStatus 
 ( 
 ManagerLinkStatus 
 . 
 PENDING 
 ) 
  
 . 
 setClientCustomer 
 ( 
 ResourceNames 
 . 
 customer 
 ( 
 clientCustomerId 
 )); 
  
 String 
  
 pendingLinkResourceName 
 ; 
  
 try 
  
 ( 
 CustomerClientLinkServiceClient 
  
 customerClientLinkServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createCustomerClientLinkServiceClient 
 ()) 
  
 { 
  
 MutateCustomerClientLinkResponse 
  
 response 
  
 = 
  
 customerClientLinkServiceClient 
 . 
 mutateCustomerClientLink 
 ( 
  
 String 
 . 
 valueOf 
 ( 
 managerId 
 ), 
  
 clientLinkOp 
 . 
 build 
 ()); 
  
 pendingLinkResourceName 
  
 = 
  
 response 
 . 
 getResult 
 (). 
 getResourceName 
 (); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
  
 "Extended an invitation from customer %s to customer %s with client link resource name" 
  
 + 
  
 " %s%n" 
 , 
  
 managerId 
 , 
  
 clientCustomerId 
 , 
  
 pendingLinkResourceName 
 ); 
  
 } 
  
 // 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. 
  
 String 
  
 query 
  
 = 
  
 "SELECT customer_client_link.manager_link_id FROM customer_client_link WHERE" 
  
 + 
  
 " customer_client_link.resource_name = '" 
  
 + 
  
 pendingLinkResourceName 
  
 + 
  
 "'" 
 ; 
  
 long 
  
 managerLinkId 
 ; 
  
 try 
  
 ( 
 GoogleAdsServiceClient 
  
 googleAdsServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createGoogleAdsServiceClient 
 ()) 
  
 { 
  
 SearchPagedResponse 
  
 response 
  
 = 
  
 googleAdsServiceClient 
 . 
 search 
 ( 
 String 
 . 
 valueOf 
 ( 
 managerId 
 ), 
  
 query 
 ); 
  
 GoogleAdsRow 
  
 result 
  
 = 
  
 response 
 . 
 iterateAll 
 (). 
 iterator 
 (). 
 next 
 (); 
  
 managerLinkId 
  
 = 
  
 result 
 . 
 getCustomerClientLink 
 (). 
 getManagerLinkId 
 (); 
  
 } 
  
 // Accept the link using the client account. 
  
 CustomerManagerLinkOperation 
 . 
 Builder 
  
 managerLinkOp 
  
 = 
  
 CustomerManagerLinkOperation 
 . 
 newBuilder 
 (); 
  
 managerLinkOp 
  
 . 
 getUpdateBuilder 
 () 
  
 . 
 setResourceName 
 ( 
  
 ResourceNames 
 . 
 customerManagerLink 
 ( 
 clientCustomerId 
 , 
  
 managerId 
 , 
  
 managerLinkId 
 )) 
  
 . 
 setStatus 
 ( 
 ManagerLinkStatus 
 . 
 ACTIVE 
 ); 
  
 managerLinkOp 
 . 
 setUpdateMask 
 ( 
 FieldMasks 
 . 
 allSetFieldsOf 
 ( 
 managerLinkOp 
 . 
 getUpdate 
 ())); 
  
 googleAdsClient 
  
 = 
  
 googleAdsClient 
 . 
 toBuilder 
 (). 
 setLoginCustomerId 
 ( 
 clientCustomerId 
 ). 
 build 
 (); 
  
 try 
  
 ( 
 CustomerManagerLinkServiceClient 
  
 managerLinkServiceClient 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createCustomerManagerLinkServiceClient 
 ()) 
  
 { 
  
 MutateCustomerManagerLinkResponse 
  
 response 
  
 = 
  
 managerLinkServiceClient 
 . 
 mutateCustomerManagerLink 
 ( 
  
 String 
 . 
 valueOf 
 ( 
 clientCustomerId 
 ), 
  
 Arrays 
 . 
 asList 
 ( 
 managerLinkOp 
 . 
 build 
 ())); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
  
 "Client accepted invitation with resource name %s%n" 
 , 
  
 response 
 . 
 getResults 
 ( 
 0 
 ). 
 getResourceName 
 ()); 
  
 } 
 } 
  
  

C#

 public 
  
 void 
  
 Run 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 managerCustomerId 
 , 
  
 long 
  
 clientCustomerId 
 ) 
 { 
  
 // Remarks: For ease of understanding, this code example assumes that managerCustomerId 
  
 // and clientCustomerId have the login email (and hence the same credentials work for 
  
 // both accounts). In real life, this might not be the case, so you'd have a separate 
  
 // GoogleAdsClient for managerCustomerId and clientCustomerId. 
  
 try 
  
 { 
  
 // Extend an invitation to the client while authenticating as the manager. 
  
 string 
  
 customerClientLinkResourceName 
  
 = 
  
 CreateInvitation 
 ( 
 client 
 , 
  
 managerCustomerId 
 , 
  
 clientCustomerId 
 ); 
  
 // Retrieve the manager link information. 
  
 string 
  
 managerLinkResourceName 
  
 = 
  
 GetManagerLinkResourceName 
 ( 
 client 
 , 
  
 managerCustomerId 
 , 
  
 clientCustomerId 
 , 
  
 customerClientLinkResourceName 
 ); 
  
 // Accept the manager's invitation while authenticating as the client. 
  
 AcceptInvitation 
 ( 
 client 
 , 
  
 clientCustomerId 
 , 
  
 managerLinkResourceName 
 ); 
  
 } 
  
 catch 
  
 ( 
 GoogleAdsException 
  
 e 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Failure:" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Message: {e.Message}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Failure: {e.Failure}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Request ID: {e.RequestId}" 
 ); 
  
 throw 
 ; 
  
 } 
 } 
 /// <summary> 
 /// Extends an invitation from a manager customer to a client customer. 
 /// </summary> 
 /// <param name="client">The Google Ads client.</param> 
 /// <param name="managerCustomerId">The manager customer ID.</param> 
 /// <param name="clientCustomerId">The client customer ID.</param> 
 /// <returns>The invitation resource name.</returns> 
 private 
  
 string 
  
 CreateInvitation 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 managerCustomerId 
 , 
  
 long 
  
 clientCustomerId 
 ) 
 { 
  
 // Get the CustomerClientLinkService. 
  
 CustomerClientLinkServiceClient 
  
 customerClientLinkService 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V21 
 . 
 CustomerClientLinkService 
 ); 
  
 // Create a client with the manager customer ID as login customer ID. 
  
 client 
 . 
 Config 
 . 
 LoginCustomerId 
  
 = 
  
 managerCustomerId 
 . 
 ToString 
 (); 
  
 // Create a customer client link. 
  
 CustomerClientLink 
  
 customerClientLink 
  
 = 
  
 new 
  
 CustomerClientLink 
 () 
  
 { 
  
 ClientCustomer 
  
 = 
  
 ResourceNames 
 . 
 Customer 
 ( 
 clientCustomerId 
 ), 
  
 // Sets the client customer to invite. 
  
 Status 
  
 = 
  
 ManagerLinkStatus 
 . 
 Pending 
  
 }; 
  
 // Creates a customer client link operation for creating the one above. 
  
 CustomerClientLinkOperation 
  
 customerClientLinkOperation 
  
 = 
  
 new 
  
 CustomerClientLinkOperation 
 () 
  
 { 
  
 Create 
  
 = 
  
 customerClientLink 
  
 }; 
  
 // Issue a mutate request to create the customer client link. 
  
 MutateCustomerClientLinkResponse 
  
 response 
  
 = 
  
 customerClientLinkService 
 . 
 MutateCustomerClientLink 
 ( 
  
 managerCustomerId 
 . 
 ToString 
 (), 
  
 customerClientLinkOperation 
 ); 
  
 // Prints the result. 
  
 string 
  
 customerClientLinkResourceName 
  
 = 
  
 response 
 . 
 Result 
 . 
 ResourceName 
 ; 
  
 Console 
 . 
 WriteLine 
 ( 
 $"An invitation has been extended from the manager " 
  
 + 
  
 $"customer {managerCustomerId} to the client customer {clientCustomerId} with " 
  
 + 
  
 $"the customer client link resource name '{customerClientLinkResourceName}'." 
 ); 
  
 // Returns the resource name of the created customer client link. 
  
 return 
  
 customerClientLinkResourceName 
 ; 
 } 
 /// <summary> 
 /// Retrieves the manager link resource name of a customer client link given its resource 
 /// name. 
 /// </summary> 
 /// <param name="client">The Google Ads client.</param> 
 /// <param name="managerCustomerId">The manager customer ID.</param> 
 /// <param name="clientCustomerId">The client customer ID.</param> 
 /// <param name="customerClientLinkResourceName">The customer client link resource 
 /// name.</param> 
 /// <returns>The manager link resource name.</returns> 
 private 
  
 string 
  
 GetManagerLinkResourceName 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 managerCustomerId 
 , 
  
 long 
  
 clientCustomerId 
 , 
  
 string 
  
 customerClientLinkResourceName 
 ) 
 { 
  
 // Get the GoogleAdsService. 
  
 GoogleAdsServiceClient 
  
 googleAdsService 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V21 
 . 
 GoogleAdsService 
 ); 
  
 // Create a client with the manager customer ID as login customer ID. 
  
 client 
 . 
 Config 
 . 
 LoginCustomerId 
  
 = 
  
 managerCustomerId 
 . 
 ToString 
 (); 
  
 // Creates the query. 
  
 string 
  
 query 
  
 = 
  
 "SELECT customer_client_link.manager_link_id FROM " 
  
 + 
  
 "customer_client_link WHERE customer_client_link.resource_name = " 
  
 + 
  
 $"'{customerClientLinkResourceName}'" 
 ; 
  
 // Issue a search request by specifying the page size. 
  
 GoogleAdsRow 
  
 result 
  
 = 
  
 googleAdsService 
 . 
 Search 
 ( 
  
 managerCustomerId 
 . 
 ToString 
 (), 
  
 query 
 ). 
 First 
 (); 
  
 // Gets the ID and resource name associated to the manager link found. 
  
 long 
  
 managerLinkId 
  
 = 
  
 result 
 . 
 CustomerClientLink 
 . 
 ManagerLinkId 
 ; 
  
 string 
  
 managerLinkResourceName 
  
 = 
  
 ResourceNames 
 . 
 CustomerManagerLink 
 ( 
  
 clientCustomerId 
 , 
  
 managerCustomerId 
 , 
  
 managerLinkId 
 ); 
  
 // Prints the result. 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Retrieved the manager link of the customer client link: its ID " 
  
 + 
  
 $"is {managerLinkId} and its resource name is '{managerLinkResourceName}'." 
 ); 
  
 // Returns the resource name of the manager link found. 
  
 return 
  
 managerLinkResourceName 
 ; 
 } 
 /// <summary> 
 /// Accepts the invitation. 
 /// </summary> 
 /// <param name="client">The Google Ads client.</param> 
 /// <param name="clientCustomerId">The client customer ID.</param> 
 /// <param name="managerLinkResourceName">The manager link resource name.</param> 
 private 
  
 void 
  
 AcceptInvitation 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 clientCustomerId 
 , 
  
 string 
  
 managerLinkResourceName 
 ) 
 { 
  
 // Get the CustomerManagerLinkService. 
  
 CustomerManagerLinkServiceClient 
  
 customerManagerLinkService 
  
 = 
  
 client 
 . 
 GetService 
 ( 
 Services 
 . 
 V21 
 . 
 CustomerManagerLinkService 
 ); 
  
 // Create a client with the client customer ID as login customer ID. 
  
 client 
 . 
 Config 
 . 
 LoginCustomerId 
  
 = 
  
 clientCustomerId 
 . 
 ToString 
 (); 
  
 // Creates the customer manager link with the updated status. 
  
 CustomerManagerLink 
  
 customerManagerLink 
  
 = 
  
 new 
  
 CustomerManagerLink 
 () 
  
 { 
  
 ResourceName 
  
 = 
  
 managerLinkResourceName 
 , 
  
 Status 
  
 = 
  
 ManagerLinkStatus 
 . 
 Active 
  
 }; 
  
 // Creates a customer manager link operation for updating the one above. 
  
 CustomerManagerLinkOperation 
  
 customerManagerLinkOperation 
  
 = 
  
 new 
  
 CustomerManagerLinkOperation 
 () 
  
 { 
  
 Update 
  
 = 
  
 customerManagerLink 
 , 
  
 UpdateMask 
  
 = 
  
 FieldMasks 
 . 
 AllSetFieldsOf 
 ( 
 customerManagerLink 
 ) 
  
 }; 
  
 // Issue a mutate request to update the customer manager link. 
  
 MutateCustomerManagerLinkResponse 
  
 response 
  
 = 
  
 customerManagerLinkService 
 . 
 MutateCustomerManagerLink 
 ( 
  
 clientCustomerId 
 . 
 ToString 
 (), 
  
 new 
 [] 
  
 { 
  
 customerManagerLinkOperation 
  
 } 
  
 ); 
  
 // Prints the result. 
  
 Console 
 . 
 WriteLine 
 ( 
 $"The client {clientCustomerId} accepted the invitation with " 
  
 + 
  
 $"the resource name '{response.Results[0].ResourceName}" 
 ); 
 } 
  
  

PHP

 public static function runExample(int $managerCustomerId, int $clientCustomerId) 
 { 
 // Extends an invitation to the client while authenticating as the manager. 
 $customerClientLinkResourceName = self::createInvitation( 
 $managerCustomerId, 
 $clientCustomerId 
 ); 
 // Retrieves the manager link information. 
 $managerLinkResourceName = self::getManagerLinkResourceName( 
 $managerCustomerId, 
 $clientCustomerId, 
 $customerClientLinkResourceName 
 ); 
 // Accepts the manager's invitation while authenticating as the client. 
 self::acceptInvitation($clientCustomerId, $managerLinkResourceName); 
 } 
 /** 
 * Extends an invitation from a manager customer to a client customer. 
 * 
 * @param int $managerCustomerId the manager customer ID 
 * @param int $clientCustomerId the customer ID 
 * @return string the resource name of the customer client link created for the invitation 
 */ 
 private static function createInvitation( 
 int $managerCustomerId, 
 int $clientCustomerId 
 ) { 
 // Creates a client with the manager customer ID as login customer ID. 
 $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); 
 // Creates a customer client link. 
 $customerClientLink = new CustomerClientLink([ 
 // Sets the client customer to invite. 
 'client_customer' => ResourceNames::forCustomer($clientCustomerId), 
 'status' => ManagerLinkStatus::PENDING 
 ]); 
 // Creates a customer client link operation for creating the one above. 
 $customerClientLinkOperation = new CustomerClientLinkOperation(); 
 $customerClientLinkOperation->setCreate($customerClientLink); 
 // Issues a mutate request to create the customer client link. 
 $customerClientLinkServiceClient = $googleAdsClient->getCustomerClientLinkServiceClient(); 
 $response = $customerClientLinkServiceClient->mutateCustomerClientLink( 
 MutateCustomerClientLinkRequest::build( 
 $managerCustomerId, 
 $customerClientLinkOperation 
 ) 
 ); 
 // Prints the result. 
 $customerClientLinkResourceName = $response->getResult()->getResourceName(); 
 printf( 
 "An invitation has been extended from the manager customer %d" . 
 " to the client customer %d with the customer client link resource name '%s'.%s", 
 $managerCustomerId, 
 $clientCustomerId, 
 $customerClientLinkResourceName, 
 PHP_EOL 
 ); 
 // Returns the resource name of the created customer client link. 
 return $customerClientLinkResourceName; 
 } 
 /** 
 * Retrieves the manager link resource name of a customer client link given its resource name. 
 * 
 * @param int $managerCustomerId the manager customer ID 
 * @param int $clientCustomerId the customer ID 
 * @param string $customerClientLinkResourceName the customer client link resource name 
 * @return string the manager link resource name 
 */ 
 private static function getManagerLinkResourceName( 
 int $managerCustomerId, 
 int $clientCustomerId, 
 string $customerClientLinkResourceName 
 ) { 
 // Creates a client with the manager customer ID as login customer ID. 
 $googleAdsClient = self::createGoogleAdsClient($managerCustomerId); 
 // Creates the query. 
 $query = "SELECT customer_client_link.manager_link_id FROM customer_client_link" . 
 " WHERE customer_client_link.resource_name = '$customerClientLinkResourceName'"; 
 // Issues a search request. 
 $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); 
 $response = $googleAdsServiceClient->search( 
 SearchGoogleAdsRequest::build($managerCustomerId, $query) 
 ); 
 // Gets the ID and resource name associated to the manager link found. 
 $managerLinkId = $response->getIterator()->current() 
 ->getCustomerClientLink() 
 ->getManagerLinkId(); 
 $managerLinkResourceName = ResourceNames::forCustomerManagerLink( 
 $clientCustomerId, 
 $managerCustomerId, 
 $managerLinkId 
 ); 
 // Prints the result. 
 printf( 
 "Retrieved the manager link of the customer client link:" . 
 " its ID is %d and its resource name is '%s'.%s", 
 $managerLinkId, 
 $managerLinkResourceName, 
 PHP_EOL 
 ); 
 // Returns the resource name of the manager link found. 
 return $managerLinkResourceName; 
 } 
 /** 
 * Accepts an invitation. 
 * 
 * @param int $clientCustomerId the customer ID 
 * @param string $managerLinkResourceName the resource name of the manager link to accept 
 */ 
 private static function acceptInvitation( 
 int $clientCustomerId, 
 string $managerLinkResourceName 
 ) { 
 // Creates a client with the client customer ID as login customer ID. 
 $googleAdsClient = self::createGoogleAdsClient($clientCustomerId); 
 // Creates the customer manager link with the updated status. 
 $customerManagerLink = new CustomerManagerLink(); 
 $customerManagerLink->setResourceName($managerLinkResourceName); 
 $customerManagerLink->setStatus(ManagerLinkStatus::ACTIVE); 
 // Creates a customer manager link operation for updating the one above. 
 $customerManagerLinkOperation = new CustomerManagerLinkOperation(); 
 $customerManagerLinkOperation->setUpdate($customerManagerLink); 
 $customerManagerLinkOperation->setUpdateMask( 
 FieldMasks::allSetFieldsOf($customerManagerLink) 
 ); 
 // Issues a mutate request to update the customer manager link. 
 $customerManagerLinkServiceClient = 
 $googleAdsClient->getCustomerManagerLinkServiceClient(); 
 $response = $customerManagerLinkServiceClient->mutateCustomerManagerLink( 
 MutateCustomerManagerLinkRequest::build( 
 $clientCustomerId, 
 [$customerManagerLinkOperation] 
 ) 
 ); 
 // Prints the result. 
 printf( 
 "The client %d accepted the invitation with the resource name '%s'.%s", 
 $clientCustomerId, 
 $response->getResults()[0]->getResourceName(), 
 PHP_EOL 
 ); 
 }  
 

Python

 def 
  
 main 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 , 
 manager_customer_id 
 : 
 str 
 ) 
 - 
> None 
 : 
 # 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, where at least one points to 
 # a specific configuration file so that both clients don't read the same 
 # file located in the $HOME dir. 
 customer_client_link_service 
 : 
 CustomerClientLinkServiceClient 
 = 
 ( 
 client 
 . 
 get_service 
 ( 
 "CustomerClientLinkService" 
 ) 
 ) 
 # Extend an invitation to the client while authenticating as the manager. 
 client_link_operation 
 : 
 CustomerClientLinkOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "CustomerClientLinkOperation" 
 ) 
 client_link 
 : 
 CustomerClientLink 
 = 
 client_link_operation 
 . 
 create 
 client_link 
 . 
 client_customer 
 = 
 customer_client_link_service 
 . 
 customer_path 
 ( 
 customer_id 
 ) 
 # client_link.status expects an enum value (int) 
 client_link 
 . 
 status 
 = 
 client 
 . 
 enums 
 . 
 ManagerLinkStatusEnum 
 . 
 PENDING 
 . 
 value 
 response 
 : 
 MutateCustomerClientLinkResponse 
 = 
 ( 
 customer_client_link_service 
 . 
 mutate_customer_client_link 
 ( 
 customer_id 
 = 
 manager_customer_id 
 , 
 operation 
 = 
 client_link_operation 
 ) 
 ) 
 resource_name 
 : 
 str 
 = 
 response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 print 
 ( 
 f 
 'Extended an invitation from customer " 
 { 
 manager_customer_id 
 } 
 " to ' 
 f 
 'customer " 
 { 
 customer_id 
 } 
 " with client link resource_name ' 
 f 
 '" 
 { 
 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. Note that since we 
 # are filtering by resource_name, a unique identifier, only one 
 # customer_client_link resource will be returned in the response 
 query 
 = 
 f 
 ''' 
 SELECT 
 customer_client_link.manager_link_id 
 FROM 
 customer_client_link 
 WHERE 
 customer_client_link.resource_name = " 
 { 
 resource_name 
 } 
 "''' 
 ga_service 
 : 
 GoogleAdsServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "GoogleAdsService" 
 ) 
 manager_link_id 
 : 
 int 
 = 
 - 
 1 
 # Initialize with a default value 
 try 
 : 
 search_response 
 : 
 SearchPagedResponse 
 = 
 ga_service 
 . 
 search 
 ( 
 customer_id 
 = 
 manager_customer_id 
 , 
 query 
 = 
 query 
 ) 
 # Since the googleads_service.search method returns an iterator we need 
 # to initialize an iteration in order to retrieve results, even though 
 # we know the query will only return a single row. 
 row 
 : 
 GoogleAdsRow 
 for 
 row 
 in 
 search_response 
 : 
 # Assuming direct iteration 
 manager_link_id 
 = 
 row 
 . 
 customer_client_link 
 . 
 manager_link_id 
 except 
 GoogleAdsException 
 as 
 ex 
 : 
 # handle_googleads_exception(ex) # This function is not defined here 
 print 
 ( 
 f 
 "GoogleAdsException: 
 { 
 ex 
 } 
 " 
 ) 
 # Basic error handling 
 sys 
 . 
 exit 
 ( 
 1 
 ) 
 customer_manager_link_service 
 : 
 CustomerManagerLinkServiceClient 
 = 
 ( 
 client 
 . 
 get_service 
 ( 
 "CustomerManagerLinkService" 
 ) 
 ) 
 manager_link_operation 
 : 
 CustomerManagerLinkOperation 
 = 
 client 
 . 
 get_type 
 ( 
 "CustomerManagerLinkOperation" 
 ) 
 manager_link 
 : 
 CustomerManagerLink 
 = 
 manager_link_operation 
 . 
 update 
 manager_link 
 . 
 resource_name 
 = 
 ( 
 customer_manager_link_service 
 . 
 customer_manager_link_path 
 ( 
 customer_id 
 , 
 manager_customer_id 
 , 
 manager_link_id 
 , 
 # type: ignore 
 ) 
 ) 
 # manager_link.status expects an enum value (int) 
 manager_link 
 . 
 status 
 = 
 client 
 . 
 enums 
 . 
 ManagerLinkStatusEnum 
 . 
 ACTIVE 
 . 
 value 
 # manager_link_operation.update_mask is a FieldMask 
 update_mask 
 : 
 FieldMask 
 = 
 protobuf_helpers 
 . 
 field_mask 
 ( 
 None 
 , 
 manager_link 
 . 
 _pb 
 ) 
 client 
 . 
 copy_from 
 ( 
 manager_link_operation 
 . 
 update_mask 
 , 
 update_mask 
 , 
 ) 
 mutate_manager_link_response 
 : 
 MutateCustomerManagerLinkResponse 
 = 
 ( 
 customer_manager_link_service 
 . 
 mutate_customer_manager_link 
 ( 
 customer_id 
 = 
 customer_id 
 , 
 operations 
 = 
 [ 
 manager_link_operation 
 ] 
 ) 
 ) 
 print 
 ( 
 "Client accepted invitation with resource_name: " 
 f 
 '" 
 { 
 mutate_manager_link_response 
 . 
 results 
 [ 
 0 
 ] 
 . 
 resource_name 
 } 
 "' 
 ) 
  

Ruby

 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 
  
 = 
  
 Google 
 :: 
 Ads 
 :: 
 GoogleAds 
 :: 
 GoogleAdsClient 
 . 
 new 
  
 # 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 
  
 end 
  
 client_link 
  
 = 
  
 client 
 . 
 resource 
 . 
 customer_client_link 
  
 do 
  
 | 
 link 
 | 
  
 link 
 . 
 client_customer 
  
 = 
  
 client 
 . 
 path 
 . 
 customer 
 ( 
 client_customer_id 
 ) 
  
 link 
 . 
 status 
  
 = 
  
 :PENDING 
  
 end 
  
 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 " 
  
 \ 
  
 " 
 #{ 
 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 
  
 SELECT 
  
 customer_client_link 
 . 
 manager_link_id 
  
 FROM 
  
 customer_client_link 
  
 WHERE 
  
 customer_client_link 
 . 
 resource_name 
  
 = 
  
 ' 
 #{ 
 client_link_resource_name 
 } 
 ' 
  
 QUERY 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 google_ads 
 . 
 search 
 ( 
 customer_id 
 : 
  
 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 
  
 end 
  
 manager_link_resource_name 
  
 = 
  
 client 
 . 
 path 
 . 
 customer_manager_link 
 ( 
  
 client_customer_id 
 , 
  
 manager_customer_id 
 , 
  
 manager_link_id 
 , 
  
 ) 
  
 manager_link_operation 
  
 = 
  
 client 
 . 
 operation 
 . 
 update_resource 
 . 
 customer_manager_link 
 ( 
 manager_link_resource_name 
 ) 
  
 do 
  
 | 
 link 
 | 
  
 link 
 . 
 status 
  
 = 
  
 :ACTIVE 
  
 end 
  
 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 " 
  
 \ 
  
 " 
 #{ 
 response 
 . 
 results 
 . 
 first 
 . 
 resource_name 
 } 
 ." 
 end  
 
 . 
 rb 
  

Perl

 sub 
  
 link_manager_to_client 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $manager_customer_id 
 , 
  
 $api_client_customer_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Step 1: Extend an invitation to the client customer while authenticating 
  
 # as the manager. 
  
 $api_client 
 - 
> set_login_customer_id 
 ( 
 $manager_customer_id 
 ); 
  
 # Create a customer client link. 
  
 my 
  
 $api_client_link 
  
 = 
  
 Google::Ads::GoogleAds::V21::Resources:: 
 CustomerClientLink 
 - 
> new 
 ({ 
  
 clientCustomer 
  
 = 
>  
 Google::Ads::GoogleAds::V21::Utils::ResourceNames:: 
 customer 
 ( 
  
 $api_client_customer_id 
 ), 
  
 status 
  
 = 
>  
 PENDING 
  
 }); 
  
 # Create a customer client link operation. 
  
 my 
  
 $api_client_link_operation 
  
 = 
  
 Google::Ads::GoogleAds::V21::Services::CustomerClientLinkService:: 
 CustomerClientLinkOperation 
  
 - 
> new 
 ({ 
  
 create 
  
 = 
>  
 $api_client_link 
  
 }); 
  
 # Add the customer client link to extend an invitation to the client customer. 
  
 my 
  
 $api_client_link_response 
  
 = 
  
 $api_client 
 - 
> CustomerClientLinkService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $manager_customer_id 
 , 
  
 operation 
  
 = 
>  
 $api_client_link_operation 
  
 }); 
  
 my 
  
 $api_client_link_resource_name 
  
 = 
  
 $api_client_link_response 
 - 
> { 
 result 
 }{ 
 resourceName 
 }; 
  
 printf 
  
 "Extended an invitation from the manager customer %d to the " 
  
 . 
  
 "client customer %d with the customer client link resource name: '%s'.\n" 
 , 
  
 $manager_customer_id 
 , 
  
 $api_client_customer_id 
 , 
  
 $api_client_link_resource_name 
 ; 
  
 # Step 2: Get the 'manager_link_id' of the client link we just created, 
  
 # to construct the resource name of the manager link from the client side. 
  
 my 
  
 $search_query 
  
 = 
  
 "SELECT customer_client_link.manager_link_id FROM customer_client_link " 
  
 . 
 "WHERE customer_client_link.resource_name = '$api_client_link_resource_name'" 
 ; 
  
 my 
  
 $search_response 
  
 = 
  
 $api_client 
 - 
> GoogleAdsService 
 () 
 - 
> search 
 ({ 
  
 customerId 
  
 = 
>  
 $manager_customer_id 
 , 
  
 query 
  
 = 
>  
 $search_query 
  
 }); 
  
 my 
  
 $manager_link_id 
  
 = 
  
 $search_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 customerClientLink 
 }{ 
 managerLinkId 
 }; 
  
 my 
  
 $manager_link_resource_name 
  
 = 
  
 Google::Ads::GoogleAds::V21::Utils::ResourceNames:: 
 customer_manager_link 
 ( 
  
 $api_client_customer_id 
 , 
  
 $manager_customer_id 
 , 
  
 $manager_link_id 
 ); 
  
 # Step 3: Accept the manager customer's link invitation while authenticating 
  
 # as the client. 
  
 $api_client 
 - 
> set_login_customer_id 
 ( 
 $api_client_customer_id 
 ); 
  
 # Create a customer manager link. 
  
 my 
  
 $manager_link 
  
 = 
  
 Google::Ads::GoogleAds::V21::Resources:: 
 CustomerManagerLink 
 - 
> new 
 ({ 
  
 resourceName 
  
 = 
>  
 $manager_link_resource_name 
 , 
  
 status 
  
 = 
>  
 ACTIVE 
  
 }); 
  
 # Create a customer manager link operation. 
  
 my 
  
 $manager_link_operation 
  
 = 
  
 Google::Ads::GoogleAds::V21::Services::CustomerManagerLinkService:: 
 CustomerManagerLinkOperation 
  
 - 
> new 
 ({ 
  
 update 
  
 = 
>  
 $manager_link 
 , 
  
 updateMask 
  
 = 
>  
 all_set_fields_of 
 ( 
 $manager_link 
 )}); 
  
 # Update the customer manager link to accept the invitation. 
  
 my 
  
 $manager_link_response 
  
 = 
  
 $api_client 
 - 
> CustomerManagerLinkService 
 () 
 - 
> mutate 
 ({ 
  
 customerId 
  
 = 
>  
 $api_client_customer_id 
 , 
  
 operations 
  
 = 
>  
 [ 
 $manager_link_operation 
 ]}); 
  
 printf 
  
 "The client customer %d accepted the invitation with " 
  
 . 
  
 "the customer manager link resource name: '%s'.\n" 
 , 
  
 $api_client_customer_id 
 , 
  
 $manager_link_response 
 - 
> { 
 results 
 }[ 
 0 
 ]{ 
 resourceName 
 }; 
  
 return 
  
 1 
 ; 
 } 
  
  
Create a Mobile Website
View Site in Mobile | Classic
Share by: