Class: Pinterest::ConversionReporter
- Inherits:
-
BaseService
- Object
- BaseService
- Pinterest::ConversionReporter
- Defined in:
- app/services/pinterest/conversion_reporter.rb
Overview
Pinterest Conversions API v5 -- server-to-server event reporting.
Sends conversion events (checkout, lead) to Pinterest so they can be used
for campaign optimization, targeting, and conversion reporting.
Mirrors the existing Invoicing::GoogleConversionReporter pattern:
- Called from PinterestConversionWorker
- Persists result metadata to the record's
pinterest_conversion_metaJSONB column - Uses
event_idfor deduplication with client-side Pinterest Tag
API reference:
POST https://api.pinterest.com/v5/ad_accounts/#ad_account_id/events
https://developers.pinterest.com/docs/api/v5/#operation/events/create
Constant Summary collapse
- API_BASE =
"https://api.pinterest.com/v5"- EVENT_CHECKOUT =
Pinterest standard event names
"checkout"- EVENT_LEAD =
"lead"
Instance Method Summary collapse
-
#send_events(events) ⇒ Object
── API Communication ────────────────────────────────────────────────.
-
#send_opportunity_conversion(opportunity) ⇒ Object
── Opportunity Conversions ──────────────────────────────────────────.
-
#send_order_conversion(order) ⇒ Object
── Order Conversions ────────────────────────────────────────────────.
Methods inherited from BaseService
#initialize, #log_debug, #log_error, #log_info, #log_warning, #logger, #options, #process, #tagged_logger
Constructor Details
This class inherits a constructor from BaseService
Instance Method Details
#send_events(events) ⇒ Object
── API Communication ────────────────────────────────────────────────
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'app/services/pinterest/conversion_reporter.rb', line 143 def send_events(events) result = Pinterest::ApiClient.new.send_events( ad_account_id: ad_account_id, token: conversion_token, events: events ) if result[:status] == :failed ErrorReporting.error("Pinterest::ConversionReporter: #{result[:error]}", { http_status: result[:http_status], event_count: events.size }) end result end |
#send_opportunity_conversion(opportunity) ⇒ Object
── Opportunity Conversions ──────────────────────────────────────────
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'app/services/pinterest/conversion_reporter.rb', line 92 def send_opportunity_conversion(opportunity) unless opportunity.sales_opportunity? return { success: false, reason: :not_a_sales_opportunity } end if opportunity..present? Rails.logger.warn "Pinterest::ConversionReporter: Opportunity #{opportunity.reference_number} already reported" return { success: false, reason: :already_reported, meta: opportunity. } end conversion_date_time = opportunity.updated_at || opportunity.created_at fractional_value = (opportunity.value || 0) * 0.2 # Same AVG_LEAD_CONVERSION_RATE as Google email = opportunity.emails.pick(:detail) || opportunity.customer&.email visit = find_visit(opportunity) event_id = SecureRandom.uuid event = build_event( event_name: EVENT_LEAD, event_time: conversion_date_time, event_id: event_id, email: email, ip: visit&.ip, user_agent: visit&.user_agent, landing_page: visit&.landing_page, custom_data: { currency: "USD", value: fractional_value.to_f.round(2).to_s, order_id: opportunity.reference_number } ) result = send_events([event]) = { result: result[:status], event_id: event_id, event_name: EVENT_LEAD, attempted_at: Time.current, reported_at: (Time.current if result[:status] == :reported), conversion_date_time: conversion_date_time, conversion_email: email, http_status: result[:http_status], error: result[:error] }.compact opportunity.update_column(:pinterest_conversion_meta, ) { success: result[:status] == :reported, meta: } end |
#send_order_conversion(order) ⇒ Object
── Order Conversions ────────────────────────────────────────────────
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/services/pinterest/conversion_reporter.rb', line 35 def send_order_conversion(order) unless order.is_sales_order? return { success: false, reason: :not_a_sales_order } end if order..present? Rails.logger.warn "Pinterest::ConversionReporter: Order #{order.reference_number} already reported" return { success: false, reason: :already_reported, meta: order. } end conversion_date_time = order.invoices.first&.created_at unless conversion_date_time Rails.logger.warn "Pinterest::ConversionReporter: No invoice for order #{order.reference_number}" return { success: false, reason: :no_invoice } end total = order.invoices.sum(&:revenue_consolidated) email = order.tracking_email&.first || order.order_emails.first visit = find_visit(order) event_id = SecureRandom.uuid event = build_event( event_name: EVENT_CHECKOUT, event_time: conversion_date_time, event_id: event_id, email: email, ip: visit&.ip, user_agent: visit&.user_agent, landing_page: visit&.landing_page, custom_data: { currency: "USD", value: total.to_f.round(2).to_s, order_id: order.reference_number, num_items: order.line_items.size } ) result = send_events([event]) = { result: result[:status], event_id: event_id, event_name: EVENT_CHECKOUT, attempted_at: Time.current, reported_at: (Time.current if result[:status] == :reported), conversion_date_time: conversion_date_time, conversion_email: email, http_status: result[:http_status], error: result[:error] }.compact order.update_column(:pinterest_conversion_meta, ) { success: result[:status] == :reported, meta: } end |