MailOdds

Klaviyo + MailOdds

Validate subscriber emails to reduce Klaviyo bounces and protect sender reputation. Auto-suppress invalid addresses and clean lists before campaigns.

Setup time: 5-10 min
Difficulty: Beginner
1,000 free validations included

Prerequisites

  • MailOdds account with API key
  • Klaviyo account with private API key
  • Zapier or Make account

Klaviyo Use Cases

Subscriber Validation

Validate emails when new profiles are added. Auto-suppress invalid addresses before they receive campaigns.

Pre-Campaign List Clean

Bulk validate a list before a major send. Remove bounces and protect your sender reputation.

Segment by Email Quality

Create Klaviyo segments based on validation status. Send to verified-only lists for critical campaigns.

Bounce Rate Reduction

Keep Klaviyo bounce rates under 0.5% by removing invalid emails proactively instead of after they bounce.

Step-by-Step Setup

1

Get Your API Keys

MailOdds API key from dashboard. Klaviyo private API key from Settings > API Keys.

2

Create Zap: New Klaviyo Subscriber

Trigger on "New Subscriber" in Klaviyo. Map the email field to the validation Code step.

3

Add Validation Code Step

Paste the MailOdds validation code. Returns status, action, and detailed sub_status.

4

Add Filter: Only Invalid Emails

Filter step: continue only if is_valid = false. This routes invalid emails to suppression.

5

Suppress Invalid Profiles

Use Klaviyo "Suppress Profile" action. Invalid emails will not receive future campaigns.

Zapier: Validate Klaviyo Subscriber

JAVASCRIPT
// Zapier Code Step - Validate Klaviyo Profile Email
const response = await fetch('https://api.mailodds.com/v1/validate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: inputData.email // Mapped from Klaviyo profile email
  })
});

const result = await response.json();

return {
  email: result.email,
  status: result.status,
  action: result.action,
  is_valid: result.action === 'accept',
  is_risky: result.action === 'accept_with_caution'
};

Make: Klaviyo List Validation

JAVASCRIPT
// Make Scenario - Klaviyo List Validation
// 1. Klaviyo: Watch New Profiles (or use scheduled trigger)
// 2. HTTP Module: POST to https://api.mailodds.com/v1/validate
//    Headers: Authorization: Bearer YOUR_API_KEY
//    Body: { "email": "{{1.email}}" }
// 3. Router: Branch by action
//    - "reject" -> Klaviyo: Suppress Profile
//    - "accept_with_caution" -> Klaviyo: Add to "Risky" segment
//    - "accept" -> Continue (no action needed)
// 4. Klaviyo: Update Profile Properties
//    "$email_validation" = {{2.data.status}}

Zapier: Auto-Suppress Invalid Emails

JAVASCRIPT
// Zapier: Suppress Invalid Emails in Klaviyo
// After validation, suppress emails that fail verification:
//
// Step 1: Code by Zapier (validation above)
// Step 2: Filter - Only continue if is_valid = false
// Step 3: Klaviyo - Suppress Profile
//    Email: {{trigger.email}}
//
// This prevents invalid emails from receiving future campaigns,
// protecting your sender reputation and reducing bounce rates.

Webhook Event Handling

Receive real-time MailOdds events and update Klaviyo profiles automatically. Handle bounces, opens, and clicks to keep engagement data accurate.

Understanding is_bot and is_mpp in Webhook Events

is_bot = true when the event came from a security scanner, link prefetcher, or corporate email gateway (not a human). Common with Barracuda, Proofpoint, and Mimecast.

is_mpp = true when the event came from Apple Mail Privacy Protection, which pre-fetches all images and inflates open counts. Affects roughly 50% of iOS/macOS mail users.

Both fields are Booleans on engagement events (opened, clicked). Always guard with == true since they may be absent on non-engagement events.

Zapier: Handle MailOdds Webhook Events for Klaviyo

JAVASCRIPT
// Zapier Code Step - Handle MailOdds Webhook Event
const event = inputData.event;
const email = inputData.to;

if (event === 'message.bounced') {
  // Add to MailOdds suppression list
  const suppRes = await fetch('https://api.mailodds.com/v1/suppression', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      entries: [{ type: 'email', value: email, reason: 'hard_bounce' }]
    })
  });

  // Suppress profile in Klaviyo
  // Next Zapier step: Klaviyo - Suppress Profile (email)
}

if (event === 'message.opened' && !inputData.is_bot && !inputData.is_mpp) {
  // Real human open - update Klaviyo profile engagement
  // Next step: Klaviyo - Update Profile Property
  //   "$last_validated_open" = new Date().toISOString()
}

return { event, email, is_bot: inputData.is_bot, is_mpp: inputData.is_mpp };

Suppression Sync

Keep your MailOdds suppression list in sync with Klaviyo. Add bounced emails to your blocklist and check suppression status before sending campaigns.

Zapier: Sync Suppression List with Klaviyo

JAVASCRIPT
// Zapier: Sync MailOdds Suppression List with Klaviyo
// Step 1: Check if email is suppressed before sending
const checkRes = await fetch('https://api.mailodds.com/v1/suppression/check', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ email: inputData.email })
});
const check = await checkRes.json();

if (check.suppressed) {
  // Email is on blocklist - suppress in Klaviyo too
  // Next step: Klaviyo - Suppress Profile
  return { suppressed: true, email: inputData.email, reason: check.reason };
}

return { suppressed: false, email: inputData.email };

Engagement Enrichment

Push validation health metrics into Klaviyo profile properties. Track deliverable rates and validation counts as custom profile data for reporting.

Zapier: Push Telemetry Data to Klaviyo Profiles

JAVASCRIPT
// Zapier: Push Validation Health to Klaviyo Profile
const response = await fetch('https://api.mailodds.com/v1/telemetry/summary', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const telemetry = await response.json();

// Update a Klaviyo profile with account-level validation health
// Next step: Klaviyo - Update Profile Properties
//   "$validation_total" = telemetry.totals.validations
//   "$deliverable_rate" = telemetry.rates.deliverable
//   "$bounce_rate" = telemetry.rates.undeliverable
return {
  total_validations: telemetry.totals.validations,
  deliverable_rate: telemetry.rates.deliverable,
  undeliverable_rate: telemetry.rates.undeliverable
};

Bulk List Validation

Validate your entire Klaviyo list before a campaign. Submit emails in batch, poll for results, and suppress or tag profiles based on outcomes.

Zapier: Bulk Validate Klaviyo List

JAVASCRIPT
// Zapier: Bulk Validate Klaviyo List Before Campaign
// Step 1: Export Klaviyo list emails (via Klaviyo API or CSV)
// Step 2: POST batch to MailOdds
const response = await fetch('https://api.mailodds.com/v1/validate/batch', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    emails: inputData.emails, // Array of emails from Klaviyo list
    depth: 'enhanced'
  })
});
const batch = await response.json();

// batch.job_id - use to poll for results
// GET /v1/validate/batch/{job_id} for status and results
return { job_id: batch.job_id, count: inputData.emails.length };

Frequently Asked Questions

Troubleshooting

Need more help?

Can't find what you're looking for? We're here to help you get Klaviyo working.

Improve Your Klaviyo Deliverability

Get 1,000 free validations. Clean your subscriber list and reduce bounces.