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.

latest
Source
npmnpm
Version
2.5.1
Version published
Weekly downloads
4
100%
Maintainers
1
Weekly downloads
 
Created
Source

Form Attribution

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

License npm version

Try the Script Builder | View Documentation

Features

  • Zero dependencies - Runs entirely on native browser APIs with no external libraries
  • Automatic capture - Records UTM parameters, referrer URL, landing page, timestamp and more without manual setup
  • Persistent storage - Maintains attribution data across sessions using intelligent storage fallbacks
  • Form injection - Automatically adds hidden fields to every form on the page
  • Dynamic form support - Monitors the DOM via MutationObserver to handle forms added after page load
  • First-touch attribution - Retains original attribution data even when users return later
  • Privacy-respecting - Complies with Global Privacy Control (GPC) and Do Not Track (DNT) preferences
  • XSS-safe - Sanitizes all injected values to prevent cross-site scripting attacks
  • Debug panel - Visual overlay for inspecting attribution data, forms, and activity in real-time
  • JavaScript API - Programmatic access via window.FormAttribution for custom integrations

Quick Start

Add the script to your website 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 common URL parameters and metadata (e.g. landing page)
  • Store the data in the user's browser temporarily
  • 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 (where form was 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 by adding optional data attributes to the script tag:

<script src="/dist/script.min.js"
  data-storage="localStorage"
  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 and debug panel
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 fallbacks when a storage type isn't available:

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

Privacy

By default, 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.

JavaScript API

Form Attribution exposes a global FormAttribution object for programmatic access:

// Get all attribution data
const data = FormAttribution.getData();

// Get a specific parameter
const source = FormAttribution.getParam('utm_source');

// Get tracked forms with their status
const forms = FormAttribution.getForms();

// Clear all stored data
FormAttribution.clear();

// Re-inject data into forms
FormAttribution.refresh();

// Register event callbacks (supports multiple listeners)
FormAttribution.on('onReady', ({ data, config }) => {
  console.log('Attribution ready:', data);
});

// Remove a callback
FormAttribution.off('onCapture', myHandler);

Available Methods

MethodReturnsDescription
getData()Object|nullGet all captured attribution data
getParam(name)string|nullGet a specific parameter value
getForms()ArrayGet list of forms with their status
clear()voidClear all stored attribution data
refresh()voidRe-inject data into all forms
on(event, cb)ObjectRegister event callback (chainable)
off(event, cb)ObjectUnregister a callback (chainable)

Events

EventPayloadDescription
onReady{ data, config }Fired when initialization is complete
onCapture{ data }Fired when new data is captured
onUpdate{ data }Fired when data is updated

Debug Panel

Enable the debug panel by adding data-debug="true" to the script tag:

<script src="/dist/script.min.js" data-debug="true"></script>

The debug panel provides:

  • Data Tab - View all captured UTM parameters and metadata
  • Forms Tab - See all forms and their injection status (click to highlight)
  • Log Tab - Real-time activity log with timestamps
  • Actions - Copy data to clipboard, clear storage, refresh forms

The panel is draggable, collapsible, and its state persists across page reloads. Uses Shadow DOM for style isolation.

Note: Remove data-debug before deploying to production.

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

Built on standard browser APIs with graceful fallbacks for broad compatibility:

  • URL API — Parses query parameters
  • MutationObserver — Detects dynamically added forms
  • Web Storage API — Persists data via sessionStorage and localStorage
  • CookieStore API — Falls back to document.cookie for older

Documentation

Complete documentation is available at https://form-attribution.flashbrew.digital/docs.

License

Apache-2.0

Built by Ben Sabic at Flash Brew Digital | GitHub

Keywords

forms

FAQs

Package last updated on 29 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