exs/lander-tracking-house-bundle
Symfony bundle that detects tracking parameters in incoming requests, stores them in cookies, and appends them to any URL through Twig filters such as appendTracking and getTracking. Includes built-in extractors for cmp, cup, cu, exid, and visit parameters, with configurable default values.
Architecture fit. The package is not a Laravel package. It is a Symfony bundle — AppKernel::registerBundles, YAML under exs_lander_tracking_house, DI service tags (exs_tracking.parameter_extracter, exs_tracking.parameter_formatter), and a Twig extension. As presented to a Laravel team it has no architectural fit: no service provider, no config publish, no Blade integration, no middleware. The pattern, however, is framework-agnostic and sound: request-scoped extraction → cookie persistence → formatter services → template-time URL decoration. That four-stage pipeline maps cleanly onto a Laravel middleware + cookie jar + service class + Blade directive, which is the realistic way a TPM should frame this. The bundle assumes server-rendered HTML and a cookie-bearing browser request; it is not designed for SPA/JSON-API funnels where URL decoration happens client-side.
Integration feasibility. As a Composer install into a Laravel app: infeasible. As a port: small. The functional surface is a few hundred lines — roughly ten extractors (cmp, cup, cu, cuvp, cuv, exid, product_id, uvp, uv, visit), six formatters, a placeholder replacer, and a Twig filter/function. A single engineer can reproduce it in days. The important unknown is composer.json version constraints (not provided); the AppKernel/Travis signals suggest a Symfony 2/3-era codebase, so even in a Symfony shop I would verify PHP and Symfony version pins before assuming it installs.
Technical risk. Material, in four buckets:
appendParameter vs appendTracking; tag key misspelled priotiry). That is evidence of low ongoing stewardship, not a nitpick.Secure/HttpOnly/SameSite, or PII handling. For an EU/UK audience this is a GDPR/ePrivacy problem, not a detail.cmp= yourself, it persists), and reflected values flow into href attributes. Injection is mitigated only if the template layer escapes correctly.Key questions.
cmp / exid / visit / product_id, and who in marketing/affiliate ops owns it?Stack fit. In a Symfony codebase: native fit, low friction. In Laravel: do not attempt direct integration; treat the repository as a specification. The Laravel-shaped equivalent is (a) a TrackParameters middleware that reads query + cookies and queues a signed cookie on the response, (b) a TrackingFormatter service with named formatters mirroring cu, cuv, cup, cuvp, uv, uvp, (c) a config file for defaults and formatter bindings, (d) a Blade directive or Url::withTracking() helper, (e) placeholder replacement for {cmp}/{exid}/{visit}.
Migration path.
~-delimited compound strings are the contract to preserve).Compatibility. Two incompatibility layers: framework (Symfony bundle mechanics have no Laravel analogue — service tags become container bindings, YAML becomes config/*.php, Twig becomes Blade) and syntax (the {cmp} placeholder token is harmless in Blade, but any attempt to reuse Twig {{ }} output syntax will collide with Blade; keep the token scheme distinct). Placeholder-in-URL construction also interacts with route helpers — verify behavior with existing query strings, fragments, and already-encoded URLs.
Sequencing. The first decision is buy-vs-build, not which package to install. If build: parameter contract → port → consent and cookie hardening → security review → single-funnel pilot → general rollout. Do not sequence the security review after rollout; cookie behavior is expensive to change once live.
Maintenance. Assume zero upstream maintenance. Either vendor the code into the app or rewrite it; in both cases your team owns it permanently. Budget periodic review for PHP deprecations, browser cookie default changes (SameSite in particular), and privacy-regulation shifts. The README has no upgrade guide and no changelog, so internal documentation is mandatory.
Support. No vendor, no SLA, no community. Name an owning team and an on-call path for "attribution broke" tickets — because marketing will notice before engineering does. Publishing a parameter contract as an internal doc is the difference between a supportable system and folklore.
Scaling. Compute cost is negligible — a handful of cookie reads and string operations per request. The real scaling concerns are (a) cookie bloat, since these cookies ride every request and browsers cap total cookie size, (b) cache fragmentation or leakage: decorating URLs per-visitor inside cached HTML either destroys CDN hit rate or, worse, serves one visitor's tracking params to another — decoration must happen in uncached fragments or be made deterministic per campaign, and (c) cross-domain cookie scope at the landing-page → app boundary.
Failure modes to instrument and alert on.
default_cmp: ~ and default_exid: 'exid' mean placeholder or literal garbage can be appended to every URL (e.g. exid=exid), producing meaningless analytics.cup/cuv) → partial or swapped field extraction with no validation.cmp yields duplicate or conflicting keys.Ramp-up. Engineering ramp-up is short (half a day to understand, one to two days to port). Domain ramp-up is the longer pole: a PM/analytics partner needs a day or two to define the parameter contract, success metrics, and reporting expectations. Add a legal/privacy review cycle if cookies are set without consent — that is calendar time, not engineering time, and it is the item most likely to slip a launch date. Because the README is inconsistent and unversioned, plan specifically for authoring onboarding docs in-house as a deliverable rather than a follow-up.
How can I help you explore Laravel packages today?