Class: FacebookAds::AdAccount

Inherits:
Base
  • Object
show all
Defined in:
lib/facebook_ads/ad_account.rb

Overview

Constant Summary collapse

FIELDS =
%w[id account_id account_status age created_time currency name].freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

delete, #destroy, find, find_by, get, paginate, post, #save, #update

Class Method Details

.all(query = {}) ⇒ Object



9
10
11
# File 'lib/facebook_ads/ad_account.rb', line 9

def all(query = {})
  get('/me/adaccounts', query: query, objectify: true)
end

Instance Method Details

#ad_audiences(limit: 100) ⇒ Object

AdAudience



103
104
105
# File 'lib/facebook_ads/ad_account.rb', line 103

def ad_audiences(limit: 100)
  AdAudience.paginate("/#{id}/customaudiences", query: { limit: limit })
end

#ad_campaigns(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

AdCampaign



28
29
30
# File 'lib/facebook_ads/ad_account.rb', line 28

def ad_campaigns(effective_status: ['ACTIVE'], limit: 100)
  AdCampaign.paginate("/#{id}/campaigns", query: { effective_status: effective_status, limit: limit })
end

#ad_creatives(limit: 100) ⇒ Object

AdCreative



82
83
84
# File 'lib/facebook_ads/ad_account.rb', line 82

def ad_creatives(limit: 100)
  AdCreative.paginate("/#{id}/adcreatives", query: { limit: limit })
end

#ad_images(hashes: nil, limit: 100) ⇒ Object

AdImage



61
62
63
64
65
66
67
# File 'lib/facebook_ads/ad_account.rb', line 61

def ad_images(hashes: nil, limit: 100)
  if !hashes.nil?
    AdImage.get("/#{id}/adimages", query: { hashes: hashes }, objectify: true)
  else
    AdImage.paginate("/#{id}/adimages", query: { limit: limit })
  end
end

#ad_insights(range: Date.today..Date.today, level: 'ad', time_increment: 1) ⇒ Object

AdInsight



123
124
125
126
127
# File 'lib/facebook_ads/ad_account.rb', line 123

def ad_insights(range: Date.today..Date.today, level: 'ad', time_increment: 1)
  ad_campaigns.map do |ad_campaign|
    ad_campaign.ad_insights(range: range, level: level, time_increment: time_increment)
  end.flatten
end

#ad_sets(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

AdSet



49
50
51
# File 'lib/facebook_ads/ad_account.rb', line 49

def ad_sets(effective_status: ['ACTIVE'], limit: 100)
  AdSet.paginate("/#{id}/adsets", query: { effective_status: effective_status, limit: limit })
end

#ad_users(limit: 100) ⇒ Object

AdUser



22
23
24
# File 'lib/facebook_ads/ad_account.rb', line 22

def ad_users(limit: 100)
  AdCampaign.paginate("/#{id}/users", query: { limit: limit })
end

#ads(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

Ad



55
56
57
# File 'lib/facebook_ads/ad_account.rb', line 55

def ads(effective_status: ['ACTIVE'], limit: 100)
  Ad.paginate("/#{id}/ads", query: { effective_status: effective_status, limit: limit })
end

#advertisable_applications(limit: 100) ⇒ Object

AdvertisableApplication



16
17
18
# File 'lib/facebook_ads/ad_account.rb', line 16

def advertisable_applications(limit: 100)
  AdvertisableApplication.paginate("/#{id}/advertisable_applications", query: { limit: limit })
end

#create_ad_audience_with_pixel(name:, pixel_id:, event_name:, subtype: 'WEBSITE', retention_days: 15) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/facebook_ads/ad_account.rb', line 107

def create_ad_audience_with_pixel(name:, pixel_id:, event_name:, subtype: 'WEBSITE', retention_days: 15)
  query = {
    name: name,
    pixel_id: pixel_id,
    subtype: subtype,
    retention_days: retention_days,
    rule: { event: { i_contains: event_name } }.to_json,
    prefill: 1
  }

  result = AdAudience.post("/#{id}/customaudiences", query: query)
  AdAudience.find(result['id'])
end

#create_ad_campaign(name:, objective:, status: 'ACTIVE') ⇒ Object

Raises:

  • (Exception)


32
33
34
35
36
37
38
# File 'lib/facebook_ads/ad_account.rb', line 32

def create_ad_campaign(name:, objective:, status: 'ACTIVE')
  raise Exception, "Objective must be one of: #{AdCampaign::OBJECTIVES.join(', ')}" unless AdCampaign::OBJECTIVES.include?(objective)
  raise Exception, "Status must be one of: #{AdCampaign::STATUSES.join(', ')}" unless AdCampaign::STATUSES.include?(status)
  query = { name: name, objective: objective, status: status }
  result = AdCampaign.post("/#{id}/campaigns", query: query)
  AdCampaign.find(result['id'])
end

#create_ad_creative(creative, creative_type: nil, carousel: false) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/facebook_ads/ad_account.rb', line 86

def create_ad_creative(creative, creative_type: nil, carousel: false)
  # Support old deprecated carousel param
  return create_carousel_ad_creative(creative) if carousel
  case creative_type
  when 'carousel'
    create_carousel_ad_creative(creative)
  when 'link'
    create_link_ad_creative(creative)
  when 'image'
    create_image_ad_creative(creative)
  else
    create_image_ad_creative(creative)
  end
end

#create_ad_images(urls) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/facebook_ads/ad_account.rb', line 69

def create_ad_images(urls)
  files = urls.map do |url|
    name, path = download(url)
    [name, File.open(path)]
  end.to_h

  response = AdImage.post("/#{id}/adimages", query: files)
  files.values.each { |file| File.delete(file.path) }
  !response['images'].nil? ? ad_images(hashes: response['images'].map { |_key, hash| hash['hash'] }) : []
end

#create_dynamic_ad_campaign(name:, product_catalog_id:, status: 'ACTIVE') ⇒ Object

Raises:

  • (Exception)


40
41
42
43
44
45
# File 'lib/facebook_ads/ad_account.rb', line 40

def create_dynamic_ad_campaign(name:, product_catalog_id:, status: 'ACTIVE')
  raise Exception, "Status must be one of: #{AdCampaign::STATUSES.join(', ')}" unless AdCampaign::STATUSES.include?(status)
  query = { name: name, objective: 'PRODUCT_CATALOG_SALES', status: status, promoted_object: { product_catalog_id: product_catalog_id } }
  result = AdCampaign.post("/#{id}/campaigns", query: query)
  AdCampaign.find(result['id'])
end

#delivery_estimate(targeting:, optimization_goal:, currency: 'USD') ⇒ Object

Raises:

  • (Exception)


149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/facebook_ads/ad_account.rb', line 149

def delivery_estimate(targeting:, optimization_goal:, currency: 'USD')
  raise Exception, "Optimization goal must be one of: #{AdSet::OPTIMIZATION_GOALS.join(', ')}" unless AdSet::OPTIMIZATION_GOALS.include?(optimization_goal)

  if targeting.is_a?(AdTargeting)
    if targeting.validate!
      targeting = targeting.to_hash
    else
      raise Exception, 'The provided targeting spec is not valid.'
    end
  end

  query = {
    targeting_spec: targeting.to_json,
    optimization_goal: optimization_goal,
    currency: currency
  }

  self.class.get("/#{id}/delivery_estimate", query: query, objectify: false)
end

#reach_estimate(targeting:, optimization_goal:, currency: 'USD') ⇒ Object

Raises:

  • (Exception)


129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/facebook_ads/ad_account.rb', line 129

def reach_estimate(targeting:, optimization_goal:, currency: 'USD')
  raise Exception, "Optimization goal must be one of: #{AdSet::OPTIMIZATION_GOALS.join(', ')}" unless AdSet::OPTIMIZATION_GOALS.include?(optimization_goal)

  if targeting.is_a?(AdTargeting)
    if targeting.validate!
      targeting = targeting.to_hash
    else
      raise Exception, 'The provided targeting spec is not valid.'
    end
  end

  query = {
    targeting_spec: targeting.to_json,
    optimize_for: optimization_goal,
    currency: currency
  }

  self.class.get("/#{id}/reachestimate", query: query, objectify: false)
end