Brand promotion: this article introduces Guangsuan's Google Ads management service. It is a vendor introduction, not an independent review or a commissioned evaluation.
A B2B SaaS attribution team asks for a Google Ads export in JSON, loads it, and finds that the totals do not line up with the CRM. The file is valid JSON. The problem is that a valid file and a reconcilable file are different things, and the settings that decide which one you have are mostly chosen before the first byte is written.
Short answer: Google Ads reporting downloads do not offer JSON. JSON comes from the Google Ads API's REST interface, or from a warehouse or connector layer that exports it downstream. Before either file is used for attribution, fix five things: the fields selected, the date range and its reporting basis, the account time zone, the currency and unit of cost, and which conversion actions the account counts.
There is no JSON button in the Google Ads interface
When you download a table in Google Ads, the available formats are Excel CSV, TSV, PDF, XLSX, XML and Google Sheets. JSON is not one of them. XML is the closest native format and is easy to mistake for JSON, but the two are different languages for different consumers.
If a downstream tool insists on JSON, converting a downloaded CSV or XML file locally is a legitimate route. It is also a route you own: the conversion script becomes part of the reporting chain, and it needs a version, an owner and a test on a known slice, exactly like any other transformation between the account and the dashboard.
Route 1: the REST API returns JSON
The Google Ads API supports two interfaces, gRPC and REST. The REST interface uses JSON representations of the same resources. Queries are written in the Google Ads Query Language (GAQL), and a query returns a list of rows, each carrying the attributes, metrics or segments you selected.
Access is not automatic. A developer token is required, its access level sets daily operation limits, and a new project starts at Test Account Access, which works on test accounts, before you apply for a higher level. Permissible use decides which features you are allowed to call.
For attribution work the consequence is simple: the JSON contains what the query asked for. If campaign.id, segments.date or the conversion action is missing from the query, no downstream join restores it.
Route 2: land the data in a warehouse, export JSON downstream
A BigQuery transfer or a reporting connector can hold the data and produce JSON from there. That route adds a dependency: a vendor, a project or a scheduled transfer that someone maintains. For a single file, converting a CSV locally is the shorter path. For a recurring join against CRM revenue, the warehouse route is the one that keeps history and lets two people reproduce the same total.
Fields to fix before the file leaves the account
Three groups of fields decide whether the export can be reconciled at all.
Identity and grain
- Account (customer) ID, because two accounts in one file need a key.
- campaign.id alongside campaign.name: names are edited, IDs are not.
- Every segment that distinguishes a row. A campaign total and a campaign-by-day-by-device file have different grains, and a key that ignores the difference lets valid rows overwrite each other.
Metrics and units
metrics.clicks and metrics.conversions describe platform events. Cost arrives as metrics.cost_micros, so the conversion to currency units has to be documented and applied once. A receiver that divides an already-normalised amount again produces a number that looks like money and is not.
Conversion scope
Record which conversion actions the account counts and which of them are marked primary. Secondary actions are reported separately and should be labelled as such in the export, because a total that mixes the two describes more actions than the business agreed to count.
Dates, time zones and the basis behind the conversions column
Exports are dated in the account time zone, which may not match your calendar or the timestamps your CRM stores. Write the time zone on the file, not in a chat message. A lead recorded late on the last day of a month can fall into different months on the two sides of the comparison without anyone making a mistake.
Google Ads can report conversions on more than one basis. Click-time reporting and conversion-time reporting place the same conversion in different periods, and neither is wrong. What breaks a comparison is mixing them: a month-on-month change can then reflect the setting rather than the market. Pick one basis, and record the conversion window and attribution model next to it, because changing either one changes historical comparisons.
Name files with the account, report, date range, basis and extraction time. When a job is re-run, replace the same slice rather than appending a second copy; without that rule, a retry doubles spend and clicks.
What reconciliation against CRM revenue looks like
Keep four counts apart: clicks, platform conversions, sales-qualified leads and closed revenue. They answer four questions, and adding them produces a number that means nothing. Guangsuan describes the basis for optimisation as three inputs read together, namely ad account data, website analytics and sales feedback, which is also why the export alone cannot settle a budget question.
For a JSON feed, three checks do most of the work before anyone argues about the gap. First, is the row grain defined in the import key? Second, if the route delivers results in pages, how is a delivery known to be complete? A successful first response is not proof that every row arrived. Third, what happens on a retry: replace, merge or append? Each answer belongs in the data contract, not in the head of the engineer who built it.
Then reconcile in a fixed order: one conversion action, one campaign group, one period; align the basis and the dates; separate ad-sourced leads from organic and referral ones; and check counting settings and repeated uploads before calling a difference unexplained. An export from Google Ads shows what Google was able to record. Sales-confirmed numbers stay in your own system, and the two will not match row for row. If the next step is sending qualified leads back to the platform, our offline conversion import checklist covers the matching fields and timing questions that come after this export.
Where Guangsuan fits
Guangsuan's Google Ads management work starts from the same chain the export is meant to measure: Guangsuan Google Ads management covers search terms, ads, landing pages and conversion tracking, and describes optimisation around real purchasing demand rather than clicks alone. Its published scope lists analytics linking, measurement and conversion setup, plus search-term report analysis and negative keyword maintenance as separate work items.
That matters for a reconciliation problem because some causes sit in the account, not the file: a conversion action that records the wrong step, a landing page that does not match the query, or a tracking setup that was deployed and never checked. A data team can clean a JSON export, but it cannot decide what the business should count as a qualified lead. Guangsuan states that it does not promise a fixed inquiry volume or a deal outcome, and that fees and scope are confirmed in a contract rather than implied by a report.
Two additions make a first conversation specific rather than general: the current conversion action list with primary and secondary status marked, and one real export with its date basis and time zone written on it. Guangsuan's published starting list for an account diagnosis is the website, the target market, the current problem and the historical data you are authorised to share; those two files turn that diagnosis into a concrete check. For a narrower walkthrough of the JSON route itself, Guangsuan's guide to exporting Google Ads data to JSON sets out the interface limits, the two routes and a local fixture.
FAQ
Can I export JSON directly from Google Ads?
No. The reporting download offers spreadsheet, XML, PDF and Google Sheets formats. JSON comes from the API or from a warehouse layer.
Is a syntactically valid JSON file ready for attribution?
No. Validity says nothing about completeness, row grain, currency units, date basis or which conversion actions are included.
Should we standardise on click time or conversion time?
Use the basis that answers the question and keep it on both sides. Click time evaluates the ad interaction; conversion time describes outcomes recorded in a period. Record the choice, the window and the account time zone with every file.
Do we need a developer token to get JSON?
Yes on the API route, and its access level determines what you can run. Converting a downloaded CSV locally avoids that requirement but leaves you maintaining the transformation.
None of these steps guarantees that the two systems will agree. They make the difference explainable, which is the part a bid change or a budget decision actually depends on.