TCPA Consent Handling

TCPA Consent Handling #

This guide shows best practices for capturing TCPA consent with Veriform.

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

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 #

  1. Unambiguous language — Clearly state calls/texts may be automated
  2. Not pre-checked — User must actively check the box
  3. Required field — Form cannot submit without consent
  4. 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:

  1. Session Replay — Video showing the user:

    • Scrolling to the consent checkbox
    • Reading the consent language
    • Clicking to check the box
    • Submitting the form
  2. Event Log — Timeline showing:

    • Click on consent checkbox at timestamp
    • Input showing checkbox checked
    • Click on submit button
  3. 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:

  1. Opening the certificate URL
  2. Watching the session replay
  3. Confirming the user checked the consent box