Skip to content

SnipForm Documentation

Cookieless by design

The SnipForm universe, mapped for developers

One script collects the visits. Forms, conversions, contacts and money hang off the same session. Everything the dashboard shows, you can read back from the API, an SDK, or an AI assistant.

index.html
<!-- one tag, every page -->
<script src="https://cdn.snipform.io/api/analytics/signals.js?site=YOUR_KEY" defer></script>

// console, one second later
Initialized
View loaded: <view id>, Session: <session id>

The map

One session, three lanes

A visit becomes a session. Everything else either writes to that session or reads from it, which is how a form submit, an ad click and a paid Shopify order end up on the same row.

First five minutes

Pick a client and paste

Every snippet below works against a live property as soon as you have a key. Money is always integer cents.

Track an event

Events →
// anywhere after the script tag
signals('newsletter_signup');
signals('purchase', 9900, { order: 'X-1042' });

// or declare it in the markup
<button data-signal="cta_click">Buy</button>

Capture a form

HTML library →
<snip-form key="YOUR_FORM_KEY">
  <form>
    <input name="email"
      sf-validate:required
      sf-validate:email />
    <button>Subscribe</button>
  </form>
</snip-form>

A form in React

React package →
const form = useSnipForm({
  key: 'YOUR_FORM_KEY',
  fields: {
    email: { type: 'email', rules: { required: null } },
  },
});

<SnipForm form={form}>
  <input {...form.register('email')} />
</SnipForm>

Write from your server

PHP SDK →
// the browser knows the visitor,
// your backend confirms the money
Snipform::revenue(9900, 'USD');
Snipform::event('order_shipped');

// from a job, pass the id you stored
Snipform::eventFor($id, 'refunded');

Straight there

I want to...

Build on it

Three ways in, same data

Before you ship it

What we guarantee

Cookieless, not cookie-light
No cookies and nothing in localStorage beyond a single opt-out flag. The session id is derived server-side from a salt that is unique per property and rotates daily.
No CAPTCHA in front of your users
Forms score a human gate, a honeypot and behavioural signals. Spam is stored and labelled rather than argued with, and the bot is never told.
Form sessions are single use
Every submission runs against a server-issued token: ten minutes, one use, pinned to the requesting IP hash, with the field set frozen at init.
The AI bridge cannot write
MCP tools are read-only and pinned to one property. A test walks the bridged tools to keep it that way.
Pin a version or ride the rolling one
Both browser libraries publish an immutable versioned URL next to the rolling one, so you choose between automatic fixes and reproducible builds.
Your data leaves the way it came
Anything the dashboard renders is available on the API under a token you scope yourself, and contacts can be redacted on request.