Not Yet Done
5
Critical requirements
In Progress
3
Partially complete
Completed
4
Portal MVP ready
Overall Readiness
33%
Google Ads connection needed

Reporting Stack Architecture

🏢
Google Ads
MCC Manager Account
All dealer campaigns
Call Assets (GFN)
🔌
Google Ads API
OAuth 2.0 connection
Read-only token
Nightly data sync
📊
This Portal
Performance reports
Call detail reports
Dealer dashboards
🏗️
One Shared Account Architecture: All dealer campaigns live inside a single Google Ads Manager Account (MCC). Each dealer is assigned one or more campaign IDs. The portal uses campaign labels, naming conventions, and dealer-to-campaign mapping (stored in the Dealer Accounts table) to separate and display per-dealer data. No sub-accounts are required — this simplifies billing, access, and API connections.
Phase 1 — Google Ads Account Setup
Manager account, campaign naming, call assets, API access
Required
Create or use existing Google Ads Manager Account (MCC) All dealer campaigns must live under one MCC. Go to ads.google.com → Create Manager Account. Enable Manager Account Security Mandates: require 2-Step Verification across all sub-users.
Set up campaign naming convention Example: [DealerName] – [Type]Riverside Toyota – Search, Metro Honda – PMax. Consistent naming enables reliable filtering in this portal and in Google Ads reports.
Enable Call Reporting on all dealer campaigns Add call assets (formerly call extensions) or use call-only ads. Google will assign Google Forwarding Numbers (GFN) to each. Call Details report will then show: start time, duration, caller area code, caller phone, call status, call type, keyword, and ad group.
Configure call conversion tracking In Google Ads → Tools → Conversions → New Conversion → Phone calls. Set the minimum call duration (recommended: 60 seconds for dealer campaigns). This powers the "Conversion" column in the Call Details report.
Label campaigns by dealer (optional but recommended) Apply Google Ads Labels to each campaign using the dealer name or ID. This makes bulk filtering easier in the native Google Ads UI and in API queries.
Phase 2 — Secure API Connection
OAuth 2.0, Read-only token, nightly data sync
Required
Create Google Cloud Project & enable Google Ads API Go to console.cloud.google.com → New Project → APIs & Services → Enable "Google Ads API". Apply for a developer token at ads.google.com → Tools → API Center.
Set up OAuth 2.0 — Read-Only access Create OAuth credentials (Web or Desktop app). Request only the https://www.googleapis.com/auth/adwords scope with read-only access. Never use Admin or Write access for a reporting-only connection. Store the refresh token in a secure secrets manager (e.g. Google Cloud Secret Manager), never in code.
Build or use a data sync service (nightly ETL) Set up a scheduled job (Cloud Scheduler, Zapier, Make, or a cron script) to pull: Campaign Performance report + Call Details report for each dealer's campaigns into this portal's data tables. Recommended cadence: nightly at 2am, with a manual refresh trigger.
Revoke access for unused/old tools Review google.com/account/permissions and Google Ads → Admin → Access & Security. Remove any old reporting tools, agencies, or accounts that no longer need access. Enforce allowed email domains at the MCC level.
Phase 3 — Required Data Fields
What data this portal needs from Google Ads to function
Reference
Report Google Ads Field Portal Column Required?
Campaign Performancecampaign.idcampaign_idRequired
campaign.namecampaign_nameRequired
metrics.impressionsimpressionsRequired
metrics.clicksclicksRequired
metrics.cost_microscostRequired
metrics.conversionsconversionsRequired
metrics.phone_callsphone_callsImportant
metrics.phone_impressionsphone_impressionsImportant
campaign.advertising_channel_typecampaign_typeRecommended
Call Detailscall_detail.call_date_timecall_start_timeRequired
call_detail.duration_secondsduration_secondsRequired
call_detail.call_statuscall_statusRequired
call_detail.caller_area_codecaller_area_codeRequired
call_detail.caller_phone_numbercaller_phoneImportant
call_detail.call_typecall_typeImportant
keyword.info.textkeywordImportant
campaign.id (join)campaign_idRequired
Phase 4 — Security Hardening
Protecting your dealer ad accounts from unauthorized access
Required
Enable 2-Step Verification on all Google Ads / Google Account logins At MCC level: Admin → Access & Security → Security → Authentication → Require 2-Step Verification. Apply to "This manager account and all accounts it owns."
Apply Allowed Email Domains restriction MCC → Security → Allowed Domains. Add your agency domain (e.g. youragency.com). This prevents unauthorized external email addresses from being invited to any dealer account.
Assign minimum access level per user / integration Reporting tools: Read-only access only. Campaign managers: Standard access. Never give API/reporting integrations Admin access. Never share Google Account passwords — always use OAuth invitations.
Understand access levels (documented) Email-only → Billing → Read-only → Standard → Admin. This portal uses the API in read-only mode. Dealer contacts receive read-only dashboard access.
Know how to revoke access Google Ads: Admin → Access & Security → Remove user. Google Account: myaccount.google.com/permissions → Remove third-party app. Review quarterly and remove inactive users and ex-agency connections.
Phase 5 — Portal Configuration
Dealer records, campaign mapping, report scheduling
In Progress
Portal UI built and functional Dashboard, Performance Report, Call Details Report, Dealer Management, and this Launch Guide are all live.
Dealer accounts table configured Add all dealer records in the Dealer Accounts page. Each dealer needs: name, brand, location, campaign IDs, contact email, and monthly budget.
Demo data loaded (seeded) 6 dealers, 9 campaigns, 10 call records pre-loaded for review and testing. Replace with live Google Ads API data before sharing with clients.
Connect live Google Ads data (replace demo data) Build or configure an ETL/sync to populate campaign_performance and call_details tables from the Google Ads API nightly. The portal reads these tables via REST API automatically.
Set up automated email report delivery Options: (A) AgencyAnalytics/TapClicks for white-labeled PDF delivery. (B) Custom Looker Studio report emailed monthly. (C) This portal's print/export function as a manual stop-gap. The portal currently supports CSV export and print-to-PDF from every report page.

Step-by-Step: Connect Google Ads Data

1
Get a Google Ads Developer Token

In your Google Ads Manager Account: Tools → API Center → Apply for token. For a reporting-only integration, Basic access level is sufficient. Keep this token private — store it in an environment variable or secrets manager.

2
Create OAuth 2.0 Credentials

Go to console.cloud.google.com → APIs & Services → Credentials → Create OAuth 2.0 Client ID. Choose "Web application." Add your redirect URI. Download the client_secret.json. Never commit this to a code repository.

3
Authorize & Generate Refresh Token

Run the OAuth flow once (using a Google Ads client library or the OAuth Playground). After authorization, save the refresh_token securely. This token lets your system call the Google Ads API without re-authenticating daily. Access tokens expire in 1 hour; the library handles refreshes automatically.

4
Pull Campaign Performance Report

Use the Google Ads Query Language (GAQL) to pull: impressions, clicks, cost, conversions, phone_calls, phone_impressions, ctr, average_cpc, conversion_rate, cost_per_conversion grouped by campaign.id and campaign.name, date range = previous month.

5
Pull Call Details Report

Query the call_view resource in the Google Ads API. Fields: call_view.call_date_time, call_view.duration_seconds, call_view.call_status, call_view.caller_area_code, call_view.caller_phone_number, call_view.call_type, segments.keyword.info.text, campaign.id. Join to the dealer mapping table using campaign ID.

6
Write data to portal tables

POST the cleaned records to tables/campaign_performance and tables/call_details via the portal's REST API. The portal's dashboard and reports will reflect the live data immediately. Run this as a nightly scheduled job.

7
Audit access quarterly

Review: Google Ads Access & Security users, linked manager accounts, OAuth app permissions at myaccount.google.com/permissions, and this portal's dealer records for accuracy. Remove any inactive users, old agencies, or stale tokens.

Google Ads Native Report Navigation

Where to find these reports manually in Google Ads UI
ReportNavigation Path in Google AdsNotes
Call Details Report Campaigns → Insights & Reports → Report Editor → Ads & Assets → Call Details Shows per-call data: start time, duration, caller phone, status, keyword, ad group
Campaign Performance Campaigns → Campaigns → Columns: Add "Call Details" columns Add Phone Calls, Phone Impressions, PTR columns from column settings
Call Conversion Summary Campaigns → Campaigns → Columns → Conversions → Phone Calls (view-through) Counts calls meeting your conversion duration threshold
Account Access Admin → Access & Security → Users tab Review and revoke user access; set access levels per user
Manager Account Security Admin → Access & Security → Security tab Set 2SV requirements and allowed email domains for all sub-accounts
API Center Tools → Setup → API Center Apply for developer token, view token status and usage