Class: Marketing::AdSpend::GoogleAdapter

Inherits:
Object
  • Object
show all
Defined in:
app/services/marketing/ad_spend/google_adapter.rb

Overview

Daily campaign spend from Google Ads via GAQL.

The campaign sync (GoogleAdsCampaignSyncWorker) already mirrors every
campaign into a Source keyed by campaign_external_id, so this only has to
fetch metrics and hand back rows keyed by that same id.

Constant Summary collapse

PROVIDER =

Provider key recorded on ad spend rows produced by this adapter.

'google'

Class Method Summary collapse

Class Method Details

.call(date) ⇒ Array<Hash>

Returns { external_id:, spend:, clicks:, impressions:, conversions: }.

Parameters:

  • date (Date)

Returns:

  • (Array<Hash>)

    { external_id:, spend:, clicks:, impressions:, conversions: }



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/services/marketing/ad_spend/google_adapter.rb', line 14

def self.call(date)
  query = <<~GAQL.squish
    SELECT campaign.id,
           metrics.cost_micros, metrics.clicks,
           metrics.impressions, metrics.conversions
    FROM campaign
    WHERE segments.date BETWEEN '#{date}' AND '#{date}'
  GAQL

  client = Invoicing::GoogleConversionReporter.client
  client.configure { |c| c.log_level = 'WARN' }
  rows = client.service.google_ads.search(
    customer_id: Invoicing::GoogleConversionReporter::WY_CHILD_LOCAL_ACCOUNT, query: query
  ).to_a

  rows.map do |row|
    {
      external_id: row.campaign.id.to_s,
      spend: row.metrics.cost_micros.to_i / 1_000_000.0,
      clicks: row.metrics.clicks.to_i,
      impressions: row.metrics.impressions.to_i,
      conversions: row.metrics.conversions.to_f
    }
  end
end