Skip to content

Commit

Permalink
Merge pull request #44 from foomo/sesamy-cli-0.4.x
Browse files Browse the repository at this point in the history
fix(provider/cookiebot): add cookiebot and integrate consent mode v2
  • Loading branch information
franklinkim committed Aug 27, 2024
2 parents b014843 + 7aadfb2 commit 612f42e
Show file tree
Hide file tree
Showing 39 changed files with 893 additions and 114 deletions.
48 changes: 46 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ googleAnalytics:
priority: 10
# Patch ecommerce items
ecommerceItems: true
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: analytics_storage
# Google Tag Manager web container settings
webContainer:
# Contemplate package config for generated events
Expand All @@ -180,6 +186,12 @@ googleAnalytics:
googleAds:
# Enable provider
enabled: true
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: ad_storage
# Google Ads Conversion settings
conversion:
# Google Ads Conversion Tracking ID
Expand Down Expand Up @@ -210,6 +222,12 @@ umami:
websiteId: ''
# Endpoint url of the umami api
endpointUrl: https://umami.your-domain.com
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: analytics_storage
# Google Tag Manager server container settings
serverContainer:
# Contemplate package config for generated events
Expand All @@ -230,6 +248,12 @@ facebook:
apiAccessToken: ''
# Code used to verify that your server events are received correctly by Conversions API
testEventToken: ''
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: ad_storage
# Google Tag Manager server container settings
serverContainer:
# Contemplate package config for generated events
Expand All @@ -252,8 +276,12 @@ emarsys:
enabled: true
# Emarsys merchant id
merchantId: ''
# Name of the event to mark as new page view
newPageViewEvent: '''
# Google Consent settings
googleConsent:
# Enable consent mode
enabled: true
# Consent mode name
mode: analytics_storage
# Google Tag Manager server container settings
serverContainer:
# Contemplate package config for generated events
Expand All @@ -263,6 +291,22 @@ emarsys:
- Purchase
- ViewItem
- ViewItemList

# --- Cookiebot CMP
cookiebot:
# Enable provider
enabled: true
# Name of the manually installed Cookiebot CMP tag template
# "https://tagmanager.google.com/gallery/#/owners/cybotcorp/templates/gtm-templates-cookiebot-cmp
templateName: "Cookiebot CMP"
# Cookiebot id
cookiebotId: ''
# CDN Region (eu, com)
cdnRegion: eu
# Enable URL passthrough
urlPassthrough: false
# Enable advertiser consent mode
AdvertiserConsentModeEnabled: false
```
## Caveats
Expand Down
7 changes: 0 additions & 7 deletions cmd/tagmanager/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
facebookprovider "github.com/foomo/sesamy-cli/pkg/provider/facebook"
googleadsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleads"
googleanalyticsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics"
googletagprovider "github.com/foomo/sesamy-cli/pkg/provider/googletag"
googletagmanagerprovider "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager"
umamiprovider "github.com/foomo/sesamy-cli/pkg/provider/umami"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
Expand Down Expand Up @@ -46,12 +45,6 @@ func NewServer(root *cobra.Command) {
return err
}

if pkgcmd.Tag(googletagprovider.Tag, tags) {
if err := googletagprovider.Server(tm); err != nil {
return errors.Wrap(err, "failed to provision google tag")
}
}

if pkgcmd.Tag(googletagmanagerprovider.Tag, tags) {
if err := googletagmanagerprovider.Server(tm, cfg.GoogleTagManager); err != nil {
return errors.Wrap(err, "failed to provision google tag manager")
Expand Down
13 changes: 10 additions & 3 deletions cmd/tagmanager/web.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package tagmanager

import (
pkgcmd "github.com/foomo/sesamy-cli/pkg/cmd"
cookiebotprovider "github.com/foomo/sesamy-cli/pkg/provider/cookiebot"
emarsysprovider "github.com/foomo/sesamy-cli/pkg/provider/emarsys"
googleanaylticsprovider "github.com/foomo/sesamy-cli/pkg/provider/googleanalytics"
googletagprovider "github.com/foomo/sesamy-cli/pkg/provider/googletag"
Expand Down Expand Up @@ -43,19 +44,25 @@ func NewWeb(root *cobra.Command) {

if pkgcmd.Tag(googletagprovider.Tag, tags) {
if err := googletagprovider.Web(tm, cfg.GoogleTag); err != nil {
return errors.Wrap(err, "failed to provision google tag")
return errors.Wrap(err, "failed to provision google provider")
}
}

if cfg.GoogleAnalytics.Enabled && pkgcmd.Tag(googleanaylticsprovider.Tag, tags) {
if err := googleanaylticsprovider.Web(tm, cfg.GoogleAnalytics); err != nil {
return errors.Wrap(err, "failed to provision google analytics tag")
return errors.Wrap(err, "failed to provision google analytics provider")
}
}

if cfg.Emarsys.Enabled && pkgcmd.Tag(emarsysprovider.Tag, tags) {
if err := emarsysprovider.Web(tm, cfg.Emarsys); err != nil {
return errors.Wrap(err, "failed to provision emarsys tag")
return errors.Wrap(err, "failed to provision emarsys provider")
}
}

if cfg.Cookiebot.Enabled && pkgcmd.Tag(cookiebotprovider.Tag, tags) {
if err := cookiebotprovider.Web(tm, cfg.Cookiebot); err != nil {
return errors.Wrap(err, "failed to provision cookiebot provider")
}
}

Expand Down
1 change: 1 addition & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ type Config struct {
GoogleTagManager GoogleTagManager `json:"googleTagManager" yaml:"googleTagManager"`
// Providers
GoogleAds GoogleAds `json:"googleAds" yaml:"googleAds"`
Cookiebot Cookiebot `json:"cookiebot" yaml:"cookiebot"`
GoogleAnalytics GoogleAnalytics `json:"googleAnalytics" yaml:"googleAnalytics"`
ConversionLinker ConversionLinker `json:"conversionLinker" yaml:"conversionLinker"`
Facebook Facebook `json:"facebook" yaml:"facebook"`
Expand Down
10 changes: 10 additions & 0 deletions pkg/config/cookiebot.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package config

type Cookiebot struct {
Enabled bool `json:"enabled" yaml:"enabled"`
TemplateName string `json:"templateName" yaml:"templateName"`
CookiebotID string `json:"cookiebotId" yaml:"cookiebotId"`
CDNRegion string `json:"cdnRegion" yaml:"cdnRegion"`
URLPassthrough bool `json:"urlPassthrough" yaml:"urlPassthrough"`
AdvertiserConsentModeEnabled bool `json:"advertiserConsentModeEnabled" yaml:"advertiserConsentModeEnabled"`
}
10 changes: 5 additions & 5 deletions pkg/config/emarsys.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import (
)

type Emarsys struct {
Enabled bool `json:"enabled" yaml:"enabled"`
MerchantID string `json:"merchantId" yaml:"merchantId"`
NewPageViewEvent string `json:"newPageViewEvent" yaml:"newPageViewEvent"`
WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
Enabled bool `json:"enabled" yaml:"enabled"`
MerchantID string `json:"merchantId" yaml:"merchantId"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
1 change: 1 addition & 0 deletions pkg/config/facebook.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ type Facebook struct {
PixelID string `json:"pixelId" yaml:"pixelId"`
APIAccessToken string `json:"apiAccessToken" yaml:"apiAccessToken"`
TestEventToken string `json:"testEventToken" yaml:"testEventToken"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
5 changes: 3 additions & 2 deletions pkg/config/googleads.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package config

type GoogleAds struct {
Enabled bool `json:"enabled" yaml:"enabled"`
Conversion GoogleAdsConversion `json:"conversion" yaml:"conversion"`
Enabled bool `json:"enabled" yaml:"enabled"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
Conversion GoogleAdsConversion `json:"conversion" yaml:"conversion"`
}
1 change: 1 addition & 0 deletions pkg/config/googleanalytics.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
type GoogleAnalytics struct {
Enabled bool `json:"enabled" yaml:"enabled"`
GoogleGTag GoogleGTag `json:"googleGTag" yaml:"googleGTag"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
WebContainer contemplate.Config `json:"webContainer" yaml:"webContainer"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
6 changes: 6 additions & 0 deletions pkg/config/googleconsent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package config

type GoogleConsent struct {
Enabled bool `json:"enabled" yaml:"enabled"`
Mode string `json:"mode" yaml:"mode"`
}
1 change: 1 addition & 0 deletions pkg/config/umami.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ type Umami struct {
Domain string `json:"domain" yaml:"domain"`
WebsiteID string `json:"websiteId" yaml:"websiteId"`
EndpointURL string `json:"endpointUrl" yaml:"endpointUrl"`
GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"`
ServerContainer contemplate.Config `json:"serverContainer" yaml:"serverContainer"`
}
7 changes: 7 additions & 0 deletions pkg/provider/cookiebot/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package cookiebot

const (
Tag = "cookiebot"
Name = "Cookiebot"
NameCookiebotTag = "Cookiebot Initialization"
)
31 changes: 31 additions & 0 deletions pkg/provider/cookiebot/web.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package cookiebot

import (
"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/provider/cookiebot/web/tag"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
"github.com/pkg/errors"
)

func Web(tm *tagmanager.TagManager, cfg config.Cookiebot) error {
{ // create folder
if folder, err := tm.UpsertFolder("Sesamy - " + Name); err != nil {
return err
} else {
tm.SetFolderName(folder.Name)
}
}

{ // create event tags
temmplate, err := tm.LookupTemplate(cfg.TemplateName)
if err != nil {
return errors.Wrapf(err, "Failed to lookup `%s`, please install the `%s` gallery tag template first (%s)", cfg.TemplateName, "Cookiebot CMP", "https://tagmanager.google.com/gallery/#/owners/cybotcorp/templates/gtm-templates-cookiebot-cmp")
}

if _, err := tm.UpsertTag(tag.NewCookiebotInitialization(NameCookiebotTag, cfg, temmplate)); err != nil {
return err
}
}

return nil
}
71 changes: 71 additions & 0 deletions pkg/provider/cookiebot/web/tag/cookiebotinitialization.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package tag

import (
"strconv"

"github.com/foomo/sesamy-cli/pkg/config"
"github.com/foomo/sesamy-cli/pkg/tagmanager/web/trigger"
"github.com/foomo/sesamy-cli/pkg/utils"
"google.golang.org/api/tagmanager/v2"
)

func NewCookiebotInitialization(name string, cfg config.Cookiebot, template *tagmanager.CustomTemplate) *tagmanager.Tag {
return &tagmanager.Tag{
Name: name,
FiringTriggerId: []string{trigger.IDConsentInitializtion},
TagFiringOption: "oncePerEvent",
Parameter: []*tagmanager.Parameter{
{
Key: "adsDataRedaction",
Type: "template",
Value: "dynamic",
},
{
Key: "addGeoRegion",
Type: "boolean",
Value: "false",
},
{
Key: "serial",
Type: "template",
Value: cfg.CookiebotID,
},
{
Key: "iabFramework",
Type: "boolean",
Value: "false",
},
{
Key: "cdnRegion",
Type: "template",
Value: cfg.CDNRegion,
},
{
Key: "advertiserConsentModeEnabled",
Type: "boolean",
Value: "true",
},
{
Key: "language",
Type: "template",
Value: "auto",
},
{
Key: "urlPassthrough",
Type: "boolean",
Value: strconv.FormatBool(cfg.URLPassthrough),
},
{
Key: "consentModeEnabled",
Type: "boolean",
Value: "true",
},
{
Key: "waitForUpdate",
Type: "template",
Value: "2000",
},
},
Type: utils.TemplateType(template),
}
}
26 changes: 20 additions & 6 deletions pkg/provider/emarsys/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import (
serverclientx "github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/client"
servertagx "github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/tag"
"github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/template"
"github.com/foomo/sesamy-cli/pkg/provider/googletag"
"github.com/foomo/sesamy-cli/pkg/provider/emarsys/server/trigger"
"github.com/foomo/sesamy-cli/pkg/provider/googleconsent"
googleconsentvariable "github.com/foomo/sesamy-cli/pkg/provider/googleconsent/server/variable"
"github.com/foomo/sesamy-cli/pkg/tagmanager"
commontrigger "github.com/foomo/sesamy-cli/pkg/tagmanager/common/trigger"
commonvariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable"
"github.com/foomo/sesamy-cli/pkg/utils"
"github.com/pkg/errors"
)

Expand Down Expand Up @@ -45,18 +47,30 @@ func Server(l *slog.Logger, tm *tagmanager.TagManager, cfg config.Emarsys) error
}

{ // create tags
eventParameters, err := googletag.CreateServerEventTriggers(tm, cfg.ServerContainer)
eventParameters, err := utils.LoadEventParams(cfg.ServerContainer)
if err != nil {
return err
}

for event := range eventParameters {
eventTrigger, err := tm.LookupTrigger(commontrigger.EventName(event))
var eventTriggerOpts []trigger.EmarsysEventOption
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.EmarsysEventWithConsentMode(consentVariable))
}

eventTrigger, err := tm.UpsertTrigger(trigger.NewEmarsysEvent(event, eventTriggerOpts...))
if err != nil {
return errors.Wrap(err, "failed to lookup event trigger: "+event)
return errors.Wrap(err, "failed to upsert event trigger: "+event)
}

if _, err := tm.UpsertTag(servertagx.NewEmarsys(event, cfg.NewPageViewEvent == eventTrigger.Name, merchantID, tagTemplate, eventTrigger)); err != nil {
if _, err := tm.UpsertTag(servertagx.NewEmarsys(event, merchantID, tagTemplate, eventTrigger)); err != nil {
return err
}
}
Expand Down
Loading

0 comments on commit 612f42e

Please sign in to comment.