You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

form-attribution

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

form-attribution

Automatically capture and persist marketing attribution data in your web forms.

Source
npmnpm
Version
2.0.0
Version published
Weekly downloads
5
400%
Maintainers
1
Weekly downloads
 
Created
Source

Form Attribution

A lightweight, zero-dependency script that automatically captures UTM parameters, ad click IDs, and referrer data and passes them into your forms as hidden fields.

License npm version

Try the Script Builder | View Documentation

Features

  • Zero dependencies - Self-contained script using only browser APIs
  • Automatic capture - Captures UTM parameters, referrer, landing page, and timestamps
  • Persistent storage - Stores attribution data across page visits with smart fallbacks
  • Form injection - Injects hidden fields into all forms automatically
  • Dynamic form support - Detects and injects into dynamically added forms via MutationObserver
  • First-touch attribution - Preserves initial attribution data across subsequent visits
  • Privacy-respecting - Honors Global Privacy Control (GPC) and Do Not Track (DNT) signals
  • XSS-safe - Sanitizes all values before injection

Installation

CDN

<script src="https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"></script>

Quick Start

Add the script to your HTML before the closing </body> tag:

<script src="https://cdn.jsdelivr.net/npm/form-attribution@latest/dist/script.min.js"></script>

That's it! The script will automatically:

  • Capture UTM parameters from the URL
  • Store them in sessionStorage
  • Inject hidden fields into all forms on the page

Parameters Captured

URL Parameters (default)

ParameterDescription
utm_sourceTraffic source (e.g., google, newsletter)
utm_mediumMarketing medium (e.g., cpc, email)
utm_campaignCampaign name
utm_termPaid search keywords
utm_contentContent variant for A/B testing
utm_idCampaign ID
refReferrer tracking parameter

Metadata (automatically captured)

ParameterDescription
landing_pageFirst page URL visited
current_pageCurrent page URL (when form is submitted)
referrer_urlDocument referrer
first_touch_timestampISO 8601 timestamp of first visit

Click ID Parameters (when data-click-ids="true")

ParameterPlatform
gclidGoogle Ads
fbclidMeta Ads
msclkidMicrosoft Advertising
ttclidTikTok Ads
li_fat_idLinkedIn Ads
twclidTwitter/X Ads

Configuration

Configure the script using data-* attributes on the script tag:

<script src="/dist/script.min.js"
  data-storage="sessionStorage"
  data-field-prefix="attr_"
  data-extra-params="gclid,fbclid"
  data-exclude-forms=".no-track"
  data-debug="true">
</script>

Options

AttributeDefaultDescription
data-storagesessionStorageStorage method: sessionStorage, localStorage, or cookie
data-field-prefix""Prefix for hidden field names (e.g., attr_ creates attr_utm_source)
data-extra-params""Comma-separated list of additional URL parameters to capture
data-exclude-forms""CSS selector for forms to exclude from injection
data-storage-keyform_attribution_dataCustom key name for stored data
data-debugfalseEnable console logging
data-privacytrueSet to "false" to disable GPC/DNT privacy signal detection
data-click-idsfalseSet to "true" to automatically capture ad platform click IDs

When using data-storage="cookie":

AttributeDefaultDescription
data-cookie-domain""Cookie domain (e.g., .example.com)
data-cookie-path/Cookie path
data-cookie-expires30Expiration in days
data-cookie-samesitelaxSameSite policy: lax, strict, or none

Usage Examples

Use localStorage for Longer Persistence

<script src="/dist/script.min.js"
  data-storage="localStorage">
</script>

Use Cookies for Cross-Subdomain Tracking

<script src="/dist/script.min.js"
  data-storage="cookie"
  data-cookie-domain=".example.com"
  data-cookie-expires="90">
</script>

Exclude Specific Forms

<script src="/dist/script.min.js"
  data-exclude-forms=".login-form, [data-no-attribution]">
</script>

Add Field Prefix for CRM Compatibility

<script src="/dist/script.min.js"
  data-field-prefix="lead_">
</script>

Script Builder

Use the interactive Script Builder tool to generate a configured script tag with a visual interface.

Storage Fallback Chain

The script uses intelligent fallback when storage is unavailable:

RequestedFallback Chain
localStoragelocalStorage → sessionStorage → cookie → memory
sessionStoragesessionStorage → cookie → memory
cookiecookie → memory

Privacy

The script respects user privacy preferences:

  • Global Privacy Control (GPC) - Disables tracking when navigator.globalPrivacyControl is true
  • Do Not Track (DNT) - Disables tracking when DNT is enabled

When privacy signals are detected, no data is captured or stored. You can override this behavior by setting data-privacy="false" on the script tag.

Injected Fields

Hidden fields are injected with the following attributes:

<input type="hidden"
  name="utm_source"
  value="google"
  data-form-attribution="true"
  data-form-attribution-managed="true">
  • Existing hidden fields with matching names are updated (no duplicates created)
  • User-visible form fields are never modified
  • All values are HTML-entity encoded for XSS protection

Development

Prerequisites

  • Node.js
  • pnpm

Setup

pnpm install

Commands

pnpm test                         # Run Playwright tests (Chromium, Firefox, WebKit)
pnpm exec playwright test --ui    # Run tests with interactive UI
pnpm check                        # Lint with Biome
pnpm fix                          # Auto-fix lint issues

Browser Support

The script uses standard browser APIs with graceful fallbacks:

  • URL API for query parameter parsing
  • MutationObserver for dynamic form detection
  • Web Storage API (sessionStorage/localStorage)
  • CookieStore API with legacy document.cookie fallback

License

Apache-2.0

Built by Ben Sabic | GitHub

Keywords

forms

FAQs

Package last updated on 23 Dec 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts