Integration
One script, one attribute, then test before buying traffic.
One asynchronous script before </body>, one attribute on the consent checkbox, two optional attributes on the displayed texts. The tracker observes the form as it exists: no library, no rebuild, no change to your submission logic.
1
Open the provider account and verify the company
Register at providers.certilead.fr/register. The account is opened in the name of the company that operates the forms, wherever it is registered: the provider does not have to be a French company. The company check ("Vérification KYC") asks for the country of registration, a company registration extract (the Kbis for a French company, less than three months old; the local trade register extract or licence elsewhere), the identity document of the legal representative, and the registration number. For a French company, the SIREN or SIRET is checked automatically against the INSEE registry. For a company registered in another country, the local number is entered as it is and the file is reviewed manually by our team, which shows as "Revue manuelle en cours" until it is approved. Tracker creation is unlocked once the check is complete. Additional users ("Sous-comptes") can be invited with owner, admin or viewer roles, and two-factor authentication is available.
What is French by design is the other end of the chain: the professionals who will call the consumers, named in the consent and checked by the buyers, are companies registered in France, identified by their SIREN.
2
Verify your domain
In "Domaines", declare the exact host of the form (example.com or landing.example.com). CertiLead gives you a TXT record to add to the DNS zone of the root domain: name @ for the apex, or the subdomain label (landing) for a subdomain, value certilead-verify=<token>. Verification is automatic once the record has propagated. The tracker only works on verified hosts.
3
Create the tracker and configure the consent
In "Trackers", create a tracker for the form. You obtain a generator identifier, used in the script address, and you configure the R. 223-1 information that will be sealed in every proof:
| Setting (French label) | What to enter | Why |
| Professionnels autorisés | The companies allowed to call, each identified by its SIREN (the French company registration number), chosen from your buyers list ("Mes acheteurs"), 1 to 20 names. | Identity of the callers (R. 223-1). Recipients are companies registered in France, so the SIREN is required; the buyer's check confirms that it is on the list. |
| Tiers collecteur | Filled in automatically with your company name. | Identity of the collector. |
| Biens ou services | The goods or services the call is about, for instance "comparaison de complémentaires santé". | The purpose the consumer agrees to. |
| Durée de validité | In days, 365 at most. | The bounded duration. Past it, the proof reads as expired. |
| Texte de retrait | How the consumer can withdraw. | R. 223-1, withdrawal. |
| Texte d'accès à la preuve | How the consumer can obtain the proof. | R. 223-1, access to the proof. |
These texts stay in French. They are displayed to French consumers on your form and reproduced in the proof; the regulation is aimed at them, not at your integrators. The dashboard proposes model texts. The last two may be left empty in the configuration when your page already displays them and marks them with data-certilead-mention (step 4): the text actually displayed is then sealed instead.
The same screen lets you choose what happens when the form is not compliant ("Formulaire non conforme au décret"): see the three modes further down. VOPRF applies automatically in all three modes; it is not an option to enable.
4
Add the script and the attributes
Keep referrerpolicy="no-referrer" in the full snippet: it also protects the initial script request. For an older installation, copy the updated snippet, refresh the relevant caches and reload open pages. If you use CSP, allow the provider's tracker domain and CertiLead's API domain in script-src (including the API's /vendor/voprf.min.js module), and the API in connect-src.
<!-- CertiLead Tracker v3 -->
<script src="https://providers.certilead.fr/tracker/v3/YOUR_GENERATOR_ID" async referrerpolicy="no-referrer"></script>
<form action="/lead" method="post">
<input type="email" name="email" autocomplete="email">
<input type="tel" name="phone" autocomplete="tel">
<label>
<input type="checkbox" name="phone_consent" data-certilead-consent="telephone">
J'accepte d'être contacté(e) par téléphone par Assureur A et Assureur B
au sujet de ma complémentaire santé, pendant 180 jours.
</label>
<p data-certilead-mention="retrait">Vous pouvez retirer ce consentement à tout moment …</p>
<p data-certilead-mention="preuve">Vous pouvez obtenir gratuitement la preuve de votre consentement …</p>
<button type="submit">Être rappelé</button>
</form>
data-certilead-consent="telephone" designates the phone-consent checkbox explicitly. Without it, the tracker falls back on a strict heuristic and the proof states that the box was guessed rather than designated. When the box is designated and left unticked, no proof is created at all: no call to CertiLead, no token.
data-certilead-mention="retrait" and "preuve" mark the withdrawal and proof-access texts as displayed. The tracker captures the text and whether it was really visible: a text present in the page but hidden proves nothing.
- The email and phone fields are detected automatically (type, name, autocomplete, placeholder, label). The session is recorded with inputs masked.
- Variants of the script: add
?test=true to the script address for the test mode (the whole flow runs, nothing is stored), ?debug=true or data-debug="true" for the diagnostic panel. Remove both before going live. On a live page, generate a time-limited debug link from the dashboard instead: adding ?cl_debug=<token> to the page address shows the panel to you only.
What the tracker injects
On submission, the tracker holds the form for the time needed to obtain the proof (under a second in practice, three seconds at most), injects two hidden fields and replays the submission with the button that was used, so that your own handlers and libraries run with the token present:
cert_token: the proof token, CL-YY-XXXXXXXXXXXX. Pass it to the buyer with the lead.
cert_receipt: the signed receipt, base64-encoded. Keep it in your CRM with the lead.
The tracker never blocks your form. If CertiLead does not answer within three seconds, or refuses the proof, the submission goes on without the two fields. A lead without cert_token is the signal to watch in your CRM: the contact is there, but it has no proof and must not be sold as consent-proven.
Three modes when the form is not compliant
A form can work perfectly and still produce incomplete proofs: a missing text, no configuration, a recipient without SIREN. You choose, per tracker, what happens in that case.
| Mode (French label) | Behaviour | When to use it |
| Ne rien faire | The proof is created as it is. No alert. | By default, while the integration is not stable yet. |
| Signaler | The proof is created and you are warned: banner in the dashboard, email to the account contact, webhook tracker.non_conform if you subscribe to it. At most one alert per form and per 24 hours. | Recommended in production: the proof keeps existing and you know something is wrong. |
| Refuser | CertiLead answers HTTP 422 with the list of points to fix. No proof is created and the lead reaches your CRM without a token. The form submission itself goes through normally. | When a lead without proof is of no use to you. Arm it only once the integration is validated, preferably after a period in "Signaler". |
Technologies
- Classic HTML form. Nothing to change in your markup: the tracker intercepts the submission, obtains the proof, then replays the original submission.
- jQuery, AJAX, JavaScript-driven submissions. The interception runs before handlers listening at document level, so a library that serialises the form right after cannot leave without the token.
- React, Vue, dynamic funnels. Forms mounted after page load are detected as they appear. A funnel step displayed later is followed like the others;
CertiLead.scan() forces a rescan if needed.
- WordPress. The script works as is, but WPForms, Gravity Forms and Contact Form 7 only save the fields declared in their editor, so the injected token is lost when the entry is stored. The CertiLead WordPress extension keeps the token and the receipt with each entry, designates the checkbox (which the editors cannot do) and shows an integration status screen. Supported: WPForms (free and paid) and Gravity Forms. Updates arrive through WordPress like any other extension. Its admin screens are in French.
No form, or custom validation: the JavaScript API
Many funnels never submit a form: the fields live in a div, a button triggers a request, and your code decides whether the input is acceptable. The tracker steps aside and hands control to you.
// Fields in a container, a button triggers your own request: follow the container.
CertiLead.observe(document.querySelector('#quote-block'), { trigger: '#send' });
// Custom validation: declare the manual mode, then create the proof yourself.
// <form data-certilead-mode="manual"> … </form>
const proof = await CertiLead.certify(form, { timeoutMs: 3000 });
if (proof.status === 'skipped') {
// contact_not_found | consent_not_found | consent_not_given
}
// proof.token and proof.receipt_b64 go with your lead
CertiLead.reset(form); // before a new attempt
certify() never submits the form. timeoutMs is capped at three seconds: your funnel can never hang on the creation of the proof.
- In manual mode, at least one usable email address or phone number and a ticked consent box are required; otherwise the method answers
contact_not_found, consent_not_found or consent_not_given without any network call.
- Do not combine the automatic listener and the manual call on the same form.
reset() clears the stored result before a new attempt.
Test before buying traffic
- Playground. In the dashboard ("Intégration", then "Playground"), sample forms with a compliant checkbox let you see the whole flow, consent block included, without touching your site.
- Test mode (
?test=true). Your real page, the complete flow, no proof stored.
- Diagnostic panel (
?debug=true or the debug link). Initialisation status, detected forms, live metrics, bot detection, network requests, every error explained with its fix, and a compliance assistant that compares the displayed texts with the tracker's configuration. The report can be copied as JSON for your team or for support.
- Go live. Production script, mode "Signaler", and a watch on leads without
cert_token in your CRM.
Webhooks and follow-up
In "Webhooks", subscribe an HTTPS endpoint to proof.created (a proof was written), proof.claimed (a buyer checked it), proof.withdrawn (the consumer, or you on their behalf, withdrew the consent) and proof.revoked (fraud established), plus tracker.non_conform in "Signaler" mode. Failed deliveries are retried with an increasing delay. "Attestations" lists every proof with its status, "Batches" the anchoring batches they belong to.