Skip to content

Commit 936f88d

Browse files
jabahamondesJavier Bahamondes
andauthored
feat(ma): add reported conversion value to marketing analytics (#41939)
Co-authored-by: Javier Bahamondes <[email protected]>
1 parent 2d85d36 commit 936f88d

28 files changed

+636
-221
lines changed

frontend/src/queries/schema.json

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17986,7 +17986,18 @@
1798617986
"type": "object"
1798717987
},
1798817988
"MarketingAnalyticsBaseColumns": {
17989-
"enum": ["ID", "Campaign", "Source", "Cost", "Clicks", "Impressions", "CPC", "CTR", "Reported Conversion"],
17989+
"enum": [
17990+
"ID",
17991+
"Campaign",
17992+
"Source",
17993+
"Cost",
17994+
"Clicks",
17995+
"Impressions",
17996+
"CPC",
17997+
"CTR",
17998+
"Reported Conversion",
17999+
"Reported Conversion Value"
18000+
],
1799018001
"type": "string"
1799118002
},
1799218003
"MarketingAnalyticsColumnsSchemaNames": {
@@ -17999,7 +18010,8 @@
1799918010
"date",
1800018011
"impressions",
1800118012
"source",
18002-
"reported_conversion"
18013+
"reported_conversion",
18014+
"reported_conversion_value"
1800318015
],
1800418016
"type": "string"
1800518017
},
@@ -28050,6 +28062,9 @@
2805028062
"reported_conversion": {
2805128063
"type": "string"
2805228064
},
28065+
"reported_conversion_value": {
28066+
"type": "string"
28067+
},
2805328068
"source": {
2805428069
"type": "string"
2805528070
}

frontend/src/queries/schema/schema-general.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4321,6 +4321,7 @@ export enum MarketingAnalyticsColumnsSchemaNames {
43214321
Impressions = 'impressions',
43224322
Source = 'source',
43234323
ReportedConversion = 'reported_conversion',
4324+
ReportedConversionValue = 'reported_conversion_value',
43244325
}
43254326

43264327
export const MARKETING_ANALYTICS_SCHEMA: Record<MarketingAnalyticsColumnsSchemaNames, MarketingAnalyticsSchemaField> = {
@@ -4349,6 +4350,11 @@ export const MARKETING_ANALYTICS_SCHEMA: Record<MarketingAnalyticsColumnsSchemaN
43494350
required: false,
43504351
isCurrency: false,
43514352
},
4353+
[MarketingAnalyticsColumnsSchemaNames.ReportedConversionValue]: {
4354+
type: ['integer', 'number', 'float'],
4355+
required: false,
4356+
isCurrency: true,
4357+
},
43524358
}
43534359

43544360
export type SourceMap = Record<MarketingAnalyticsColumnsSchemaNames, string | undefined>
@@ -4395,6 +4401,7 @@ export enum MarketingAnalyticsBaseColumns {
43954401
CPC = 'CPC',
43964402
CTR = 'CTR',
43974403
ReportedConversion = 'Reported Conversion',
4404+
ReportedConversionValue = 'Reported Conversion Value',
43984405
}
43994406

44004407
export enum MarketingAnalyticsHelperForColumnNames {

posthog/schema.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,6 +2009,7 @@ class MarketingAnalyticsBaseColumns(StrEnum):
20092009
CPC = "CPC"
20102010
CTR = "CTR"
20112011
REPORTED_CONVERSION = "Reported Conversion"
2012+
REPORTED_CONVERSION_VALUE = "Reported Conversion Value"
20122013

20132014

20142015
class MarketingAnalyticsColumnsSchemaNames(StrEnum):
@@ -2021,6 +2022,7 @@ class MarketingAnalyticsColumnsSchemaNames(StrEnum):
20212022
IMPRESSIONS = "impressions"
20222023
SOURCE = "source"
20232024
REPORTED_CONVERSION = "reported_conversion"
2025+
REPORTED_CONVERSION_VALUE = "reported_conversion_value"
20242026

20252027

20262028
class MarketingAnalyticsHelperForColumnNames(StrEnum):
@@ -3147,6 +3149,7 @@ class SourceMap(BaseModel):
31473149
id: str | None = None
31483150
impressions: str | None = None
31493151
reported_conversion: str | None = None
3152+
reported_conversion_value: str | None = None
31503153
source: str | None = None
31513154

31523155

posthog/temporal/data_imports/sources/linkedin_ads/schemas.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from products.data_warehouse.backend.types import IncrementalFieldType
55

6-
FLOAT_FIELDS = {"costInUsd"}
6+
FLOAT_FIELDS = {"costInUsd", "conversionValueInLocalCurrency"}
77

88
# There are in the results from the API. The value is in the URN format.
99
URN_COLUMNS = ["campaignGroup", "account", "campaign", "creative"]
@@ -125,6 +125,7 @@ class ResourceSchema(TypedDict):
125125
"pivotValues",
126126
"costInUsd",
127127
"externalWebsiteConversions",
128+
"conversionValueInLocalCurrency",
128129
"landingPageClicks",
129130
"totalEngagements",
130131
"videoViews",
@@ -151,6 +152,7 @@ class ResourceSchema(TypedDict):
151152
"pivotValues",
152153
"costInUsd",
153154
"externalWebsiteConversions",
155+
"conversionValueInLocalCurrency",
154156
"landingPageClicks",
155157
"totalEngagements",
156158
"videoViews",

posthog/temporal/data_imports/sources/tiktok_ads/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
"conversion_rate_v2",
2727
"conversion_rate",
2828
"conversion",
29+
"complete_payment",
30+
"total_complete_payment_value",
2931
"cost_per_1000_reached",
3032
"cost_per_conversion",
3133
"cost_per_result",

products/marketing_analytics/backend/hogql_queries/__snapshots__/test_adapters.ambr

Lines changed: 15 additions & 15 deletions
Large diffs are not rendered by default.

products/marketing_analytics/backend/hogql_queries/__snapshots__/test_conversion_goal_processor.ambr

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
'''
44

55
SELECT
6+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
67
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
78
if(notEmpty(campaign_id), campaign_id, '-') AS id,
89
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
9-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
1010
count() AS conversion_0
1111

1212
FROM
@@ -67,10 +67,10 @@
6767
'''
6868

6969
SELECT
70+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
7071
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
7172
if(notEmpty(campaign_id), campaign_id, '-') AS id,
7273
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
73-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
7474
count() AS conversion_0
7575

7676
FROM
@@ -131,10 +131,10 @@
131131
'''
132132

133133
SELECT
134+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
134135
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
135136
if(notEmpty(campaign_id), campaign_id, '-') AS id,
136137
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
137-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
138138
count() AS conversion_0
139139

140140
FROM
@@ -195,10 +195,10 @@
195195
'''
196196

197197
SELECT
198+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
198199
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
199200
if(notEmpty(campaign_id), campaign_id, '-') AS id,
200201
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
201-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
202202
count() AS conversion_0
203203

204204
FROM
@@ -259,10 +259,10 @@
259259
'''
260260

261261
SELECT
262+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
262263
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
263264
if(notEmpty(campaign_id), campaign_id, '-') AS id,
264265
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
265-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
266266
count() AS conversion_0
267267

268268
FROM
@@ -323,10 +323,10 @@
323323
'''
324324

325325
SELECT
326+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
326327
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
327328
if(notEmpty(campaign_id), campaign_id, '-') AS id,
328329
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
329-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
330330
count() AS conversion_1
331331

332332
FROM
@@ -387,10 +387,10 @@
387387
'''
388388

389389
SELECT
390+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
390391
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
391392
if(notEmpty(campaign_id), campaign_id, '-') AS id,
392393
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
393-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
394394
coalesce(sum(conversion_value), 0) AS conversion_0
395395

396396
FROM
@@ -451,10 +451,10 @@
451451
'''
452452

453453
SELECT
454+
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
454455
if(notEmpty(campaign_name), campaign_name, 'organic') AS campaign,
455456
if(notEmpty(campaign_id), campaign_id, '-') AS id,
456457
if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['microsoft']), 'bing', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['facebook', 'instagram', 'messenger', 'fb', 'whatsapp', 'audience_network', 'facebook_marketplace', 'threads']), 'meta', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['li']), 'linkedin', if(in(lower(if(notEmpty(source_name), source_name, 'organic')), ['adwords', 'youtube', 'display', 'gmail', 'google_maps', 'google_play', 'google_discover', 'admob', 'waze']), 'google', if(notEmpty(source_name), source_name, 'organic'))))) AS source,
457-
if(notEmpty(campaign_name), campaign_name, 'organic') AS match_key,
458458
count() AS conversion_0
459459

460460
FROM

products/marketing_analytics/backend/hogql_queries/__snapshots__/test_marketing_analytics_aggregated_query_runner.ambr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# name: TestMarketingAnalyticsAggregatedQueryRunner.test_join_uses_match_key_not_or_condition
33
'''
44

5-
SELECT sum(round(campaign_costs.total_cost, 2)) AS Cost, sum(round(campaign_costs.total_clicks, 0)) AS Clicks, sum(round(campaign_costs.total_impressions, 0)) AS Impressions, sum(round(campaign_costs.total_reported_conversions, 2)) AS `Reported Conversion`, sum(ucg.conversion_0) AS `Test Purchase`
5+
SELECT sum(round(campaign_costs.total_cost, 2)) AS Cost, sum(round(campaign_costs.total_clicks, 0)) AS Clicks, sum(round(campaign_costs.total_impressions, 0)) AS Impressions, sum(round(campaign_costs.total_reported_conversions, 2)) AS `Reported Conversion`, sum(round(campaign_costs.total_reported_conversion_value, 2)) AS `Reported Conversion Value`, sum(ucg.conversion_0) AS `Test Purchase`
66
FROM campaign_costs LEFT JOIN ucg AS ucg ON and(equals(campaign_costs.match_key, ucg.match_key), equals(campaign_costs.source, ucg.source))
77
'''
88
# ---

0 commit comments

Comments
 (0)