campaignFingerprint function

String? campaignFingerprint(
  1. String? search
)

Derive a stable campaign fingerprint from a URL's query string. A change in this fingerprint (a new campaign, not its absence) forces a new session, matching GA4's "campaign change resets the session" behaviour.

Implementation

String? campaignFingerprint(String? search) {
  if (search == null || search.isEmpty) return null;
  var qs = search;
  final q = qs.indexOf('?');
  if (q != -1) qs = qs.substring(q + 1);

  final params = <String, String>{};
  for (final pair in qs.split('&')) {
    if (pair.isEmpty) continue;
    final eq = pair.indexOf('=');
    if (eq == -1) {
      params[Uri.decodeQueryComponent(pair)] = '';
    } else {
      final k = Uri.decodeQueryComponent(pair.substring(0, eq));
      final v = Uri.decodeQueryComponent(pair.substring(eq + 1));
      params[k] = v;
    }
  }

  final pairs = <String>[];
  for (final p in _campaignParams) {
    final v = params[p];
    if (v != null && v.isNotEmpty) pairs.add('$p=$v');
  }
  return pairs.isEmpty ? null : pairs.join('&');
}