fix(provider/googleads): add remarketing

This commit is contained in:
Kevin Franklin Kim 2024-08-28 11:21:06 +02:00
parent 29900c5010
commit 16c0cf0bb6
No known key found for this signature in database
11 changed files with 190 additions and 23 deletions

View File

@ -186,16 +186,24 @@ googleAnalytics:
googleAds:
# Enable provider
enabled: true
# Google Ads Conversion Tracking ID
conversionId: ''
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: ad_storage
# Google Ads Remarketing settings
remarketing:
# Enable Google Ads Remarketing
enabled: true
# Enable conversion linking
enableConversionLinker: true
# Google Ads Conversion settings
conversion:
# Google Ads Conversion Tracking ID
conversionId: ''
# Enable Google Ads Conversion
enabled: true
# Google Ads Conversion Tracking Label
conversionLabel: ''
# Google Tag Manager server container settings
@ -312,7 +320,7 @@ cookiebot:
# Enable URL passthrough
urlPassthrough: false
# Enable advertiser consent mode
AdvertiserConsentModeEnabled: false
advertiserConsentModeEnabled: false
```
## Caveats

View File

@ -1,7 +1,9 @@
package config
type GoogleAds struct {
Enabled bool `json:"enabled" yaml:"enabled"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
Conversion GoogleAdsConversion `json:"conversion" yaml:"conversion"`
Enabled bool `json:"enabled" yaml:"enabled"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
ConversionID string `json:"conversionId" yaml:"conversionId"`
Conversion GoogleAdsConversion `json:"conversion" yaml:"conversion"`
Remarketing GoogleAdsRemarketing `json:"remarketing" yaml:"remarketing"`
}

View File

@ -6,7 +6,6 @@ import (
type GoogleAdsConversion struct {
Enabled bool `json:"enabled" yaml:"enabled"`
ConversionID string `json:"conversionId" yaml:"conversionId"`
ConversionLabel string `json:"conversionLabel" yaml:"conversionLabel"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}

View File

@ -0,0 +1,6 @@
package config
type GoogleAdsRemarketing struct {
Enabled bool `json:"enabled" yaml:"enabled"`
EnableConversionLinker bool `json:"enableConversionLinker" yaml:"enableConversionLinker"`
}

View File

@ -1,8 +1,9 @@
package googleads
const (
Tag = "gads"
Name = "Google Ads"
NameConversionIDConstant = "GAds Conversion ID"
NameConversionLabelConstant = "GAds Conversion Label"
Tag = "gads"
Name = "Google Ads"
NameConversionIDConstant = "GAds Conversion ID"
NameConversionLabelConstant = "GAds Conversion Label"
NameGoogleAdsRemarketingTrigger = "Google Ads Remarketing"
)

View File

@ -24,12 +24,13 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.GoogleAds) err
}
}
{ // conversion
conversionID, err := tm.UpsertVariable(commonvariable.NewConstant(NameConversionIDConstant, cfg.Conversion.ConversionID))
if err != nil {
return err
}
conversionID, err := tm.UpsertVariable(commonvariable.NewConstant(NameConversionIDConstant, cfg.ConversionID))
if err != nil {
return err
}
// conversion
if cfg.Conversion.Enabled {
conversionLabel, err := tm.UpsertVariable(commonvariable.NewConstant(NameConversionLabelConstant, cfg.Conversion.ConversionLabel))
if err != nil {
return err
@ -74,6 +75,30 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.GoogleAds) err
}
}
}
// remarketing
if cfg.Remarketing.Enabled {
var eventTriggerOpts []trigger.GoogleAdsRemarketingEventOption
if cfg.GoogleConsent.Enabled {
if err := googleconsent.ServerEnsure(tm); err != nil {
return err
}
consentVariable, err := tm.LookupVariable(googleconsentvariable.GoogleConsentModeName(cfg.GoogleConsent.Mode))
if err != nil {
return err
}
eventTriggerOpts = append(eventTriggerOpts, trigger.GoogleAdsRemarketingEventWithConsentMode(consentVariable))
}
eventTrigger, err := tm.UpsertTrigger(trigger.NewGoogleAdsRemarketingEvent(NameGoogleAdsRemarketingTrigger, eventTriggerOpts...))
if err != nil {
return errors.Wrap(err, "failed to upsert event trigger: "+NameGoogleAdsRemarketingTrigger)
}
if _, err := tm.UpsertTag(servertagx.NewGoogleAdsRemarketing(Name, conversionID, cfg.Remarketing, eventTrigger)); err != nil {
return err
}
}
}
return nil

View File

@ -0,0 +1,50 @@
package tag
import (
"strconv"
"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)
func NewGoogleAdsRemarketing(name string, conversionID *tagmanager.Variable, cfg config.GoogleAdsRemarketing, triggers ...*tagmanager.Trigger) *tagmanager.Tag {
return &tagmanager.Tag{
FiringTriggerId: utils.TriggerIDs(triggers),
Name: name,
TagFiringOption: "oncePerEvent",
Parameter: []*tagmanager.Parameter{
{
Key: "enableConversionLinker",
Type: "boolean",
Value: strconv.FormatBool(cfg.EnableConversionLinker),
},
{
Key: "enableDynamicRemarketing",
Type: "boolean",
Value: "false",
},
{
Key: "enableCustomParams",
Type: "boolean",
Value: "false",
},
{
Key: "enableUserId",
Type: "boolean",
Value: "false",
},
{
Key: "conversionId",
Type: "template",
Value: "{{" + conversionID.Name + "}}",
},
{
Key: "rdp",
Type: "boolean",
Value: "false",
},
},
Type: "sgtmadsremarket",
}
}

View File

@ -0,0 +1,54 @@
package trigger
import (
"google.golang.org/api/tagmanager/v2"
)
type (
GoogleAdsRemarketingEventOptions struct {
consentMode *tagmanager.Variable
}
GoogleAdsRemarketingEventOption func(*GoogleAdsRemarketingEventOptions)
)
func GoogleAdsRemarketingEventWithConsentMode(mode *tagmanager.Variable) GoogleAdsRemarketingEventOption {
return func(o *GoogleAdsRemarketingEventOptions) {
o.consentMode = mode
}
}
func NewGoogleAdsRemarketingEvent(name string, opts ...GoogleAdsRemarketingEventOption) *tagmanager.Trigger {
o := &GoogleAdsRemarketingEventOptions{}
for _, opt := range opts {
if opt != nil {
opt(o)
}
}
var filter []*tagmanager.Condition
if o.consentMode != nil {
filter = append(filter,
&tagmanager.Condition{
Parameter: []*tagmanager.Parameter{
{
Key: "arg0",
Type: "template",
Value: "{{" + o.consentMode.Name + "}}",
},
{
Key: "arg1",
Type: "template",
Value: "granted",
},
},
Type: "equals",
},
)
}
return &tagmanager.Trigger{
Type: "serverPageview",
Name: name,
Filter: filter,
}
}

View File

@ -24,7 +24,7 @@
"cookiebot": {
"type": "object",
"properties": {
"AdvertiserConsentModeEnabled": {
"advertiserConsentModeEnabled": {
"type": "boolean"
},
"cdnRegion": {
@ -144,12 +144,12 @@
"conversion": {
"type": "object",
"properties": {
"conversionId": {
"type": "string"
},
"conversionLabel": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"serverContainer": {
"type": "object",
"properties": {
@ -174,6 +174,9 @@
}
}
},
"conversionId": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
@ -187,6 +190,17 @@
"type": "string"
}
}
},
"remarketing": {
"type": "object",
"properties": {
"enableConversionLinker": {
"type": "boolean"
},
"enabled": {
"type": "boolean"
}
}
}
}
},

View File

@ -162,16 +162,24 @@ googleAnalytics:
googleAds:
# Enable provider
enabled: true
# Google Ads Conversion Tracking ID
conversionId: ''
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: ad_storage
# Google Ads Remarketing settings
remarketing:
# Enable Google Ads Remarketing
enabled: true
# Enable conversion linking
enableConversionLinker: true
# Google Ads Conversion settings
conversion:
# Google Ads Conversion Tracking ID
conversionId: ''
# Enable Google Ads Conversion
enabled: true
# Google Ads Conversion Tracking Label
conversionLabel: ''
# Google Tag Manager server container settings
@ -288,4 +296,4 @@ cookiebot:
# Enable URL passthrough
urlPassthrough: false
# Enable advertiser consent mode
AdvertiserConsentModeEnabled: false
advertiserConsentModeEnabled: false