Skip to content

Encoding

GA4 traffic comes in two protocols and sesamy-go round-trips between them.

GTag (pkg/encoding/gtag)

Form-encoded querystring protocol used by gtag.js. Each field maps to a short key (e.g. tid, cid, en, dl).

go
import "github.com/foomo/sesamy-go/pkg/encoding/gtag"

var p gtag.Payload
if err := gtag.Decode(url.Values{...}, &p); err != nil { /* ... */ }

values, body, err := gtag.Encode(&p)  // re-encode to url.Values + body
qs := gtag.EncodeValues(values)

Payload struct (selected fields)

FieldGTag keyDescription
ProtocolVersionvProtocol version (always 2).
TrackingIDtidMeasurement / stream ID (G-XXXXXXXXX).
ClientIDcidGA client ID (281344611.1635634925).
UserIDuidCustom user ID.
SessionIDsidSession ID.
EventNameenEvent name (e.g. page_view).
DocumentLocationdlCurrent page URL.
DocumentTitledtCurrent page title.
DocumentReferrerdrReferrer.
IsDebug_dbgDebug flag.
GTMHashInfogtmGTM container fingerprint.

Embedded sub-structs (with ,inline,squash):

  • Consent — consent-mode signals.
  • Campaign — UTM-style campaign fields.
  • ECommerce — items, value, currency.
  • ClientHints — UA-CH derived.

Full field list lives in pkg/encoding/gtag/payload.go.

Helpers

go
gtag.Get[T any](*T, T) T              // safe deref with fallback
gtag.GetDefault[T any](*T, T) T       // alias

MPv2 (pkg/encoding/mpv2)

JSON body protocol used by GA4's Measurement Protocol v2.

go
import "github.com/foomo/sesamy-go/pkg/encoding/mpv2"

p := mpv2.NewPayload[any]()
p.Events = append(p.Events, sesamy.NewEvent(sesamy.EventNamePageView, params).AnyEvent())
body, _ := json.Marshal(p)

Payload[P] (selected fields)

FieldJSON keyDescription
ClientIDclient_idGA client ID.
UserIDuser_idCustom user ID.
SessionID(per event param)Session ID lives on each event's params.
TimestampMicrostimestamp_microsHit timestamp in microseconds.
EventseventsSlice of sesamy.Event[P].
UserPropertiesuser_propertiesUser-scoped properties.
ConsentconsentConsent flags.
UserDatauser_dataEnhanced conversions (SHA-256 hashed).

Also: userdata.go, userdataaddress.go, sha256hash.go — helpers for enhanced conversions (server-side hashing of email/phone/address).

Conversion

GTag → MPv2

go
import "github.com/foomo/sesamy-go/pkg/encoding/gtagencode"

var p *mpv2.Payload[any]
err := gtagencode.MPv2(gtagPayload, &p)

MPv2 → GTag

go
import "github.com/foomo/sesamy-go/pkg/encoding/mpv2encode"

var p *gtag.Payload
err := mpv2encode.GTag[any](mpv2Payload, &p)

Used internally by gtaghttp.MiddlewareEventHandler so cross-protocol handlers can write MPv2-shaped logic regardless of inbound wire format.