feat(googleads): support multiple conversions

This commit is contained in:
Kevin Franklin Kim 2025-05-23 13:22:28 +02:00
parent ab5bb5d07f
commit be65ea9157
No known key found for this signature in database
8 changed files with 93 additions and 24 deletions

View File

@ -53,7 +53,7 @@ Add a `sesamy.yaml` configuration
```yaml ```yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/sesamy-cli/refs/heads/main/sesamy.schema.json # 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 # Whether to redact the visitor ip
redactVisitorIp: true redactVisitorIp: true
@ -249,12 +249,20 @@ googleAds:
conversion: conversion:
# Enable Google Ads Conversion # Enable Google Ads Conversion
enabled: true enabled: true
# Google Ads Conversion Tracking Label
conversionLabel: ''
# Google Tag Manager server container settings # Google Tag Manager server container settings
serverContainer: serverContainer:
# Path to the go.mod file # Path to the go.mod file
directory: . directory: .
# Conversion settings map
settings:
add_to_cart:
- label: ''
- conversionId: ''
label: ''
purchase:
- label: ''
- conversionId: ''
label: ''
# Contemplate package config for generated events # Contemplate package config for generated events
packages: packages:
- path: github.com/foomo/sesamy-go/pkg/event - path: github.com/foomo/sesamy-go/pkg/event
@ -447,6 +455,42 @@ cookiebot:
adUserData: denied adUserData: denied
# Default consent ad_personalization # Default consent ad_personalization
adPersonalization: denied 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 ## Caveats

View File

@ -13,13 +13,14 @@ type (
} }
GoogleAdsConversionServerContainer struct { GoogleAdsConversionServerContainer struct {
contemplate.Config `json:",inline" yaml:",squash"` 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 { if value, ok := s.Settings[eventName]; ok {
return value return value
} }
return GoogleAdsConversionTracking{} return nil
} }

View File

@ -1,5 +1,8 @@
package config package config
type GoogleAdsConversionTracking struct { type GoogleAdsConversionTracking struct {
// Conversion label
Label string `json:"label" yaml:"label"` Label string `json:"label" yaml:"label"`
// Optional conversion id overriding the default
ConversionID string `json:"conversionId" yaml:"conversionId"`
} }

View File

@ -1,3 +1,3 @@
package config package config
const Version = "1.0" const Version = "1.1"

View File

@ -69,11 +69,13 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg
return errors.Wrap(err, "failed to upsert event trigger: "+event) 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 { 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 return err
} }
} }
} }
}
// remarketing // remarketing
if cfg.Remarketing.Enabled { if cfg.Remarketing.Enabled {

View File

@ -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 { 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{ return &tagmanager.Tag{
FiringTriggerId: utils.TriggerIDs(triggers), FiringTriggerId: utils.TriggerIDs(triggers),
Name: GoogleAdsConversionTrackingName(name), Name: tagName,
TagFiringOption: "oncePerEvent", TagFiringOption: "oncePerEvent",
Parameter: []*tagmanager.Parameter{ Parameter: []*tagmanager.Parameter{
{ {
@ -39,7 +46,7 @@ func NewGoogleAdsConversionTracking(name string, value, currency, conversionID *
{ {
Key: "conversionId", Key: "conversionId",
Type: "template", Type: "template",
Value: "{{" + conversionID.Name + "}}", Value: tagConversionID,
}, },
{ {
Key: "currencyCode", Key: "currencyCode",

View File

@ -15,6 +15,12 @@
}, },
"type": "array" "type": "array"
}, },
"[]config.GoogleAdsConversionTracking": {
"items": {
"$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking"
},
"type": "array"
},
"[]string": { "[]string": {
"items": { "items": {
"type": "string" "type": "string"
@ -388,7 +394,8 @@
"$ref": "#/$defs/[]*contemplate.PackageConfig" "$ref": "#/$defs/[]*contemplate.PackageConfig"
}, },
"settings": { "settings": {
"$ref": "#/$defs/map[string]config.GoogleAdsConversionTracking" "$ref": "#/$defs/map[string][]config.GoogleAdsConversionTracking",
"description": "Conversion settings map"
} }
}, },
"additionalProperties": false, "additionalProperties": false,
@ -397,7 +404,12 @@
"github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking": { "github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking": {
"properties": { "properties": {
"label": { "label": {
"type": "string" "type": "string",
"description": "Conversion label"
},
"conversionId": {
"type": "string",
"description": "Optional conversion id overriding the default"
} }
}, },
"additionalProperties": false, "additionalProperties": false,
@ -777,15 +789,15 @@
"additionalProperties": false, "additionalProperties": false,
"type": "object" "type": "object"
}, },
"map[string]config.FacebookConversionAPITag": { "map[string][]config.GoogleAdsConversionTracking": {
"additionalProperties": { "additionalProperties": {
"$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.FacebookConversionAPITag" "$ref": "#/$defs/[]config.GoogleAdsConversionTracking"
}, },
"type": "object" "type": "object"
}, },
"map[string]config.GoogleAdsConversionTracking": { "map[string]config.FacebookConversionAPITag": {
"additionalProperties": { "additionalProperties": {
"$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleAdsConversionTracking" "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.FacebookConversionAPITag"
}, },
"type": "object" "type": "object"
}, },

View File

@ -1,5 +1,5 @@
# yaml-language-server: $schema=sesamy.schema.json # yaml-language-server: $schema=sesamy.schema.json
version: '1.0' version: '1.1'
# Whether to redact the visitor ip # Whether to redact the visitor ip
redactVisitorIp: true redactVisitorIp: true
@ -200,14 +200,14 @@ googleAds:
enabled: true enabled: true
# Google Tag Manager server container settings # Google Tag Manager server container settings
serverContainer: serverContainer:
# Conversion labels map
settings:
add_to_cart:
label: ''
purchase:
label: ''
# Path to the go.mod file # Path to the go.mod file
directory: . directory: .
# Conversion settings map
settings:
add_to_cart:
- label: ''
purchase:
- label: ''
# Contemplate package config for generated events # Contemplate package config for generated events
packages: packages:
- path: github.com/foomo/sesamy-go/pkg/event - path: github.com/foomo/sesamy-go/pkg/event