From be65ea9157baf805dd2fc54fb0fbef4950f2c833 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 23 May 2025 13:22:28 +0200 Subject: [PATCH] feat(googleads): support multiple conversions --- README.md | 50 +++++++++++++++++-- pkg/config/googleadsconversion.go | 7 +-- pkg/config/googleadsconversiontracking.go | 3 ++ pkg/config/version.go | 2 +- pkg/provider/googleads/server.go | 6 ++- .../server/tag/googleadsconversiontracking.go | 11 +++- sesamy.schema.json | 24 ++++++--- sesamy.yaml | 14 +++--- 8 files changed, 93 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index df831b7..20f1892 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Add a `sesamy.yaml` configuration ```yaml # yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/sesamy-cli/refs/heads/main/sesamy.schema.json -version: '1.0' +version: '1.1' # Whether to redact the visitor ip redactVisitorIp: true @@ -249,12 +249,20 @@ googleAds: conversion: # Enable Google Ads Conversion enabled: true - # Google Ads Conversion Tracking Label - conversionLabel: '' # Google Tag Manager server container settings serverContainer: # Path to the go.mod file directory: . + # Conversion settings map + settings: + add_to_cart: + - label: '' + - conversionId: '' + label: '' + purchase: + - label: '' + - conversionId: '' + label: '' # Contemplate package config for generated events packages: - path: github.com/foomo/sesamy-go/pkg/event @@ -447,6 +455,42 @@ cookiebot: adUserData: denied # Default consent ad_personalization adPersonalization: denied + +# --- Mixpanel +mixpanel: + # Enable provider + enabled: true + # Project Token + projectToken: '' + # Google Consent settings + googleConsent: + # Enable consent mode + enabled: true + # Consent mode name + mode: analytics_storage + # Google Tag Manager server container settings + serverContainer: + # Track events + track: + # Directory containing the go.mod file + directory: . + # Contemplate package config for generated events + packages: + - path: 'github.com/foomo/sesamy-go/pkg/event' + types: + - AddPaymentInfo + - AddShippingInfo + - AddToCart + - BeginCheckout + - PageView + - Purchase + - RemoveFromCart + - Search + - SelectItem + - ViewCart + - ViewItem + - ViewItemList + ``` ## Caveats diff --git a/pkg/config/googleadsconversion.go b/pkg/config/googleadsconversion.go index 5c93a3c..90f1987 100644 --- a/pkg/config/googleadsconversion.go +++ b/pkg/config/googleadsconversion.go @@ -13,13 +13,14 @@ type ( } GoogleAdsConversionServerContainer struct { contemplate.Config `json:",inline" yaml:",squash"` - Settings map[string]GoogleAdsConversionTracking `json:"settings" yaml:"settings"` + // Conversion settings map + Settings map[string][]GoogleAdsConversionTracking `json:"settings" yaml:"settings"` } ) -func (s *GoogleAdsConversionServerContainer) Setting(eventName string) GoogleAdsConversionTracking { +func (s *GoogleAdsConversionServerContainer) Setting(eventName string) []GoogleAdsConversionTracking { if value, ok := s.Settings[eventName]; ok { return value } - return GoogleAdsConversionTracking{} + return nil } diff --git a/pkg/config/googleadsconversiontracking.go b/pkg/config/googleadsconversiontracking.go index 2c1227a..a0c23ef 100644 --- a/pkg/config/googleadsconversiontracking.go +++ b/pkg/config/googleadsconversiontracking.go @@ -1,5 +1,8 @@ package config type GoogleAdsConversionTracking struct { + // Conversion label Label string `json:"label" yaml:"label"` + // Optional conversion id overriding the default + ConversionID string `json:"conversionId" yaml:"conversionId"` } diff --git a/pkg/config/version.go b/pkg/config/version.go index 0f29af7..15abda1 100644 --- a/pkg/config/version.go +++ b/pkg/config/version.go @@ -1,3 +1,3 @@ package config -const Version = "1.0" +const Version = "1.1" diff --git a/pkg/provider/googleads/server.go b/pkg/provider/googleads/server.go index f2d1422..9fbe035 100644 --- a/pkg/provider/googleads/server.go +++ b/pkg/provider/googleads/server.go @@ -69,8 +69,10 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg return errors.Wrap(err, "failed to upsert event trigger: "+event) } - if _, err := tm.UpsertTag(ctx, folder, servertagx.NewGoogleAdsConversionTracking(event, value, currency, conversionID, cfg.Conversion.ServerContainer.Setting(event), eventTrigger)); err != nil { - return err + for _, setting := range cfg.Conversion.ServerContainer.Setting(event) { + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewGoogleAdsConversionTracking(event, value, currency, conversionID, setting, eventTrigger)); err != nil { + return err + } } } } diff --git a/pkg/provider/googleads/server/tag/googleadsconversiontracking.go b/pkg/provider/googleads/server/tag/googleadsconversiontracking.go index dd741ca..cc923ff 100644 --- a/pkg/provider/googleads/server/tag/googleadsconversiontracking.go +++ b/pkg/provider/googleads/server/tag/googleadsconversiontracking.go @@ -11,9 +11,16 @@ func GoogleAdsConversionTrackingName(v string) string { } func NewGoogleAdsConversionTracking(name string, value, currency, conversionID *tagmanager.Variable, settings config.GoogleAdsConversionTracking, triggers ...*tagmanager.Trigger) *tagmanager.Tag { + tagName := GoogleAdsConversionTrackingName(name) + tagConversionID := "{{" + conversionID.Name + "}}" + if settings.ConversionID != "" { + tagName += " (" + settings.ConversionID + ")" + tagConversionID = settings.ConversionID + } + return &tagmanager.Tag{ FiringTriggerId: utils.TriggerIDs(triggers), - Name: GoogleAdsConversionTrackingName(name), + Name: tagName, TagFiringOption: "oncePerEvent", Parameter: []*tagmanager.Parameter{ { @@ -39,7 +46,7 @@ func NewGoogleAdsConversionTracking(name string, value, currency, conversionID * { Key: "conversionId", Type: "template", - Value: "{{" + conversionID.Name + "}}", + Value: tagConversionID, }, { Key: "currencyCode", diff --git a/sesamy.schema.json b/sesamy.schema.json index 47e40be..d91ecfc 100644 --- a/sesamy.schema.json +++ b/sesamy.schema.json @@ -15,6 +15,12 @@ }, "type": "array" }, + "[]config.GoogleAdsConversionTracking": { + "items": { + "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking" + }, + "type": "array" + }, "[]string": { "items": { "type": "string" @@ -388,7 +394,8 @@ "$ref": "#/$defs/[]*contemplate.PackageConfig" }, "settings": { - "$ref": "#/$defs/map[string]config.GoogleAdsConversionTracking" + "$ref": "#/$defs/map[string][]config.GoogleAdsConversionTracking", + "description": "Conversion settings map" } }, "additionalProperties": false, @@ -397,7 +404,12 @@ "github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking": { "properties": { "label": { - "type": "string" + "type": "string", + "description": "Conversion label" + }, + "conversionId": { + "type": "string", + "description": "Optional conversion id overriding the default" } }, "additionalProperties": false, @@ -777,15 +789,15 @@ "additionalProperties": false, "type": "object" }, - "map[string]config.FacebookConversionAPITag": { + "map[string][]config.GoogleAdsConversionTracking": { "additionalProperties": { - "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.FacebookConversionAPITag" + "$ref": "#/$defs/[]config.GoogleAdsConversionTracking" }, "type": "object" }, - "map[string]config.GoogleAdsConversionTracking": { + "map[string]config.FacebookConversionAPITag": { "additionalProperties": { - "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking" + "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.FacebookConversionAPITag" }, "type": "object" }, diff --git a/sesamy.yaml b/sesamy.yaml index 90e56c1..08447bb 100644 --- a/sesamy.yaml +++ b/sesamy.yaml @@ -1,5 +1,5 @@ # yaml-language-server: $schema=sesamy.schema.json -version: '1.0' +version: '1.1' # Whether to redact the visitor ip redactVisitorIp: true @@ -200,14 +200,14 @@ googleAds: enabled: true # Google Tag Manager server container settings serverContainer: - # Conversion labels map - settings: - add_to_cart: - label: '' - purchase: - label: '' # Path to the go.mod file directory: . + # Conversion settings map + settings: + add_to_cart: + - label: '' + purchase: + - label: '' # Contemplate package config for generated events packages: - path: github.com/foomo/sesamy-go/pkg/event