I have a website hosted in AWS with a NodeJS backend.

I have Google Ads conversion events being sent from the frontend using gtag.js, but I noticed missing events and a lot of duplication (even if I use transaction IDs with my events)

I had similar issues with Facebook Pixel and was able to resolve the problem by sending simple vanilla http calls from my backend server.

Is it possible to do the same with Google Ads? I have not been able to find any documentation for server side APIs for Javascript. This documentation here seems promising, but no Javascript SDK exists. That's is why I would like to know what vanilla http calls to make.

I have seen documentation about GTM server side, but it seems I need to host a GTM container (server?) which I would prefer not to have to. Unless I misunderstood what hosting a GTM container means in the context of a AWS cloud solution.

So in short, my task is to extract data from Google, and I'm curious if it's possible to fetch data using Google Ads API for different customers without all the required keys (developer token, refresh token, client_id and client secret). Is this possible or not? If yes, what privileges do I need, and what are the steps? If you know where I can find some clear documentation about this, it will be a lifesaver.

Thanks!

I may be doing it the wrong way but I want, at first, to extract keyword traffic information like I did with TrafficEstimationService in the (now deprecated) AdWords API. My code looks like this (with some edits here and there):

# [... some initialization (clients, service accounts, etc.) bits here] # fetch an instance of the Google Ads client gc = GoogleAdsClient.load_from_storage(gads_credentials_file, version="v10") # fetch an instance of the Google Ads service gs = gc.get_service("GoogleAdsService") # fetch an instance of the Geo Target Constant service gtcs = gc.get_service("GeoTargetConstantService").geo_target_constant_path # fetch an instance of the keyword plan idea service ks = gc.get_service("KeywordPlanIdeaService") # build the initial search request rq = gc.get_type("GenerateKeywordIdeasRequest") rq.customer_id = gads_account_id.replace("-", '') rq.geo_target_constants = [gtcs(get_location_id(gads_country))] rq.keyword_plan_network = (gc.enums.KeywordPlanNetworkEnum.GOOGLE_SEARCH_AND_PARTNERS) rq.language = gs.language_constant_path(get_language_id(gads_language)) rq.keyword_annotation = gc.enums.KeywordPlanKeywordAnnotationEnum if len(gads_keywords) > 0:     rq.keyword_seed.keywords.extend(gads_keywords) # generate keyword ideas keyword_ideas = ks.generate_keyword_ideas(request=rq) rows = [] for idea in keyword_ideas:     rows.append({         "date": r,         "text": idea.text,         "competition_value": idea.keyword_idea_metrics.competition.name,         "avg_monthly_searches": idea.keyword_idea_metrics.avg_monthly_searches     }) 

So far, so good. I can specify location and language and (of course) they keywords to look for. At the end of this request, I have something like this (just printing the first list item):

{'date': '2022-08-09', 'text': 'zapatos', 'competition_value': 'MEDIUM', 'avg_monthly_searches': 301000} 

The problem I have is I have been requested to ensure the match type is EXACT but looking at both the documentation and the source code for KeywordPlanIdeaService there is no trace of this parameter. That's why I assume I'm doing it wrong (or maybe I'm lacking something here). In any case, I'm a bit lost.

Can you tell me how can I specify this (if it can be done) or an alternate way to accomplish this?

I am trying to upload a conversion using REST API, as I am writing code in rust hence no library is there for that, I am struggling to get the correct response, as, I am not aware of what should the proper request body, and there is no sample payload for a request given by google, the help available is not sufficient to make my request thru.

URL https://googleads.googleapis.com/v10/customers/948-412-1501:uploadClickConversions

Header: 'developer-token': 'X8ec', Authorization: 'Bearer ya29', 'Content-Type': 'application/json'

Post Body { "gclid": "0988098080", "conversionAction": "Submit lead form", "conversionDateTime": "2022-08-06 12:32:45-08:00", "conversionValue": "10", "currencyCode": "10", "orderId": "11111" }

Response

{ "error": { "code": 400, "message": "Invalid JSON payload received. Unknown name "gclid": Cannot find field.\nInvalid JSON payload received. Unknown name "conversionAction": Cannot find field.\nInvalid JSON payload received. Unknown name "conversionDateTime": Cannot find field.\nInvalid JSON payload received. Unknown name "conversionValue": Cannot find field.\nInvalid JSON payload received. Unknown name "currencyCode": Cannot find field.\nInvalid JSON payload received. Unknown name "orderId": Cannot find field.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest", "fieldViolations": [ { "description": "Invalid JSON payload received. Unknown name "gclid": Cannot find field." }, { "description": "Invalid JSON payload received. Unknown name "conversionAction": Cannot find field." }, { "description": "Invalid JSON payload received. Unknown name "conversionDateTime": Cannot find field." }, { "description": "Invalid JSON payload received. Unknown name "conversionValue": Cannot find field." }, { "description": "Invalid JSON payload received. Unknown name "currencyCode": Cannot find field." }, { "description": "Invalid JSON payload received. Unknown name "orderId": Cannot find field." } ] } ] } }