TCPA Consent Handling #
This guide shows best practices for capturing TCPA consent with Veriform.
Why TCPA Consent Matters #
The Telephone Consumer Protection Act (TCPA) requires express written consent before making autodialed calls or texts. Violations cost $500–$1,500 per call.
Veriform provides irrefutable proof of consent by capturing:
- ✅ The exact consent language shown to the user
- ✅ Video of the user checking the consent box
- ✅ Timestamp, IP, and device information
- ✅ Full session replay for dispute resolution
Consent Checkbox Best Practices #
Clear, Conspicuous Language #
<div class="consent-box">
<label>
<input type="checkbox" id="tcpaConsent" name="tcpaConsent" required>
<span>
By checking this box, I agree to receive calls and texts at the number
provided, including by autodialer. Consent is not a condition of purchase.
Message & data rates may apply. I have read and agree to the
<a href="/privacy" target="_blank">Privacy Policy</a> and
<a href="/terms" target="_blank">Terms of Service</a>.
</span>
</label>
</div>
Key Requirements #
- Unambiguous language — Clearly state calls/texts may be automated
- Not pre-checked — User must actively check the box
- Required field — Form cannot submit without consent
- Links to policies — Privacy Policy and Terms must be accessible
Complete Example with Veriform #
<!DOCTYPE html>
<html>
<head>
<title>Get Your Free Quote</title>
<style>
.consent-box {
background: #f8f9fa;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 1rem;
margin: 1rem 0;
}
.consent-box label {
display: flex;
align-items: flex-start;
gap: 0.75rem;
font-size: 0.85rem;
color: #555;
cursor: pointer;
}
.consent-box input[type="checkbox"] {
margin-top: 3px;
}
</style>
</head>
<body>
<form id="lead-form">
<input type="text" name="firstName" placeholder="First Name" required>
<input type="text" name="lastName" placeholder="Last Name" required>
<input type="email" name="email" placeholder="Email" required>
<input type="tel" name="phone" placeholder="Phone" required>
<!-- TCPA Consent - This interaction is captured by Veriform -->
<div class="consent-box">
<label>
<input type="checkbox" id="tcpaConsent" name="tcpaConsent" required>
<span>
By checking this box, I agree to receive calls and texts at the
number provided, including by autodialer. Consent is not a condition
of purchase. Message & data rates may apply. I have read and agree
to the <a href="/privacy" target="_blank">Privacy Policy</a> and
<a href="/terms" target="_blank">Terms of Service</a>.
</span>
</label>
</div>
<!-- Hidden fields for tracking -->
<input type="hidden" name="utm_source" value="">
<input type="hidden" name="utm_medium" value="">
<input type="hidden" name="utm_campaign" value="">
<!-- Veriform certificate URL -->
<input type="hidden" id="recCertUrl" name="recCertUrl">
<button type="submit">Get My Free Quote</button>
</form>
<!-- Veriform SDK -->
<script
src="https://cert.veriform.co/sdk.min.js"
data-key="YOUR_API_KEY"
defer
></script>
<script>
// Populate UTM parameters from URL
const params = new URLSearchParams(window.location.search);
document.querySelector('[name="utm_source"]').value = params.get('utm_source') || '';
document.querySelector('[name="utm_medium"]').value = params.get('utm_medium') || '';
document.querySelector('[name="utm_campaign"]').value = params.get('utm_campaign') || '';
// Form submission
document.getElementById('lead-form').addEventListener('submit', async (e) => {
e.preventDefault();
// Save recording before redirect
if (window.veriformSave) {
await window.veriformSave();
}
const form = e.target;
const data = {
firstName: form.firstName.value,
lastName: form.lastName.value,
email: form.email.value,
phone: form.phone.value,
tcpaConsent: form.tcpaConsent.checked,
consentTimestamp: new Date().toISOString(),
certificateUrl: form.recCertUrl.value,
utm: {
source: form.utm_source.value,
medium: form.utm_medium.value,
campaign: form.utm_campaign.value
}
};
console.log('Lead with consent:', data);
// Send to backend with certificate URL
// await fetch('/api/leads', {
// method: 'POST',
// headers: { 'Content-Type': 'application/json' },
// body: JSON.stringify(data)
// });
// Redirect to certificate
window.location.href = data.certificateUrl;
});
</script>
</body>
</html>
What Veriform Captures #
When a user interacts with the consent checkbox, Veriform records:
| Event Type | Description |
|---|---|
| Click | User clicking the checkbox |
| Focus/Blur | Checkbox receiving/losing focus |
| DOM State | Checkbox checked/unchecked state |
| Scroll | User scrolling to see consent language |
| Time | Duration user spent on consent section |
Certificate as Evidence #
When a consumer disputes consent, the certificate provides:
-
Session Replay — Video showing the user:
- Scrolling to the consent checkbox
- Reading the consent language
- Clicking to check the box
- Submitting the form
-
Event Log — Timeline showing:
Clickon consent checkbox at timestampInputshowing checkbox checkedClickon submit button
-
Metadata — Proof the user was:
- At specific IP address
- In specific location
- Using specific device/browser
- At specific date/time
Integrating with Lead Buyers #
When sending leads to buyers, include the certificate URL:
{
"lead": {
"firstName": "John",
"lastName": "Smith",
"email": "john@example.com",
"phone": "555-123-4567"
},
"consent": {
"tcpaConsent": true,
"timestamp": "2025-11-27T15:30:00Z",
"certificateUrl": "https://cert.veriform.co/view/abc123xyz..."
}
}
Buyers can verify consent by:
- Opening the certificate URL
- Watching the session replay
- Confirming the user checked the consent box