MailOdds

Zapier

Zapier + MailOdds

Connect MailOdds to 5,000+ apps. Validate emails automatically from forms, spreadsheets, CRMs, and more.

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

Prerequisites

  • MailOdds account (free tier works)
  • API key from dashboard
  • Zapier account (Starter+ for Code steps)
  • Basic JavaScript knowledge

Works with: Google Sheets HubSpot Salesforce Typeform Airtable Mailchimp Slack Gmail Pipedrive Notion +2 more

Validate Form Submissions

Automatically validate emails from Typeform, Google Forms, or any form builder before adding to your CRM.

Clean Spreadsheet Data

Validate emails from Google Sheets or Airtable and update rows with validation status.

Enrich CRM Contacts

Validate new contacts in HubSpot, Salesforce, or Pipedrive and tag them based on email quality.

Download Code Snippets

Download all code snippets as a JavaScript file for easy reference. Includes single validation, bulk jobs, status checking, and webhook handling.

Download All Snippets

Quick Setup Guide

1

Get Your MailOdds API Key

Sign up for MailOdds and create an API key from your dashboard.

Go to API Keys
2

Create a New Zap

In Zapier, create a new Zap and choose your trigger (e.g., "New Form Submission" from Typeform).

3

Add a Code by Zapier Step

Add "Code by Zapier" as your action and select "Run JavaScript". Paste the validation code below.

4

Use Results in Next Steps

Use the validation result (status, action, is_valid) to filter, route, or update records in subsequent steps.

Validate Single Email

JAVASCRIPT
Try Demo |
// Zapier Code Step - Validate Single 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
  })
});

const result = await response.json();

return {
  email: result.email,
  status: result.status,
  action: result.action,
  is_valid: result.action === 'accept',
  reason: result.sub_status || null
};
Input Data: Set up an input field called email and map it to your trigger's email field.

Create Bulk Validation Job

JAVASCRIPT
// Zapier Code Step - Create Bulk Validation Job
const emails = inputData.emails.split(',').map(e => e.trim());

const response = await fetch('https://api.mailodds.com/v1/jobs', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    emails: emails,
    callback_url: 'YOUR_WEBHOOK_URL' // Optional
  })
});

const result = await response.json();

return {
  job_id: result.job.id,
  status: result.job.status,
  email_count: result.job.email_count
};

Webhook Payload (Job Completed)

JSON
{
  "event": "job.completed",
  "job_id": "job_abc123",
  "status": "completed",
  "summary": {
    "valid": 850,
    "invalid": 120,
    "catch_all": 25,
    "unknown": 5
  },
  "results_url": "https://api.mailodds.com/v1/jobs/job_abc123/results"
}
Tip: Use "Webhooks by Zapier" as a trigger to receive job completion events and continue your workflow.

Response Fields

FieldTypeDescription
statusstringvalid, invalid, catch_all, unknown, do_not_mail
actionstringaccept, accept_with_caution, reject, retry_later
sub_statusstringDetailed reason (e.g., mailbox_not_found, disposable)
is_validbooleantrue if action is "accept" (convenience field)

Webhook Configuration

Receive real-time event notifications from MailOdds in your Zaps. Use "Webhooks by Zapier" as a Catch Hook trigger, then configure the webhook URL in your MailOdds dashboard.

Supported events: message.bounced, message.opened, message.clicked, message.delivered, message.deferred

Webhook Event Fields

FieldTypeDescription
eventstringEvent type (message.bounced, message.opened, message.clicked, etc.)
tostringRecipient email address
message_idstringUnique message identifier
is_botbooleanTrue if event from security scanner/link prefetcher (engagement events only)
is_mppbooleanTrue if event from Apple Mail Privacy Protection (engagement events only)
link_urlstringClicked URL (message.clicked only)
bounce_typestringhard or soft (message.bounced only)
timestampstringISO 8601 event timestamp

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.

Handle Webhook Events

JAVASCRIPT
// Zapier Code Step - Handle MailOdds Webhook Event
// Trigger: Webhooks by Zapier (Catch Hook)
const event = inputData.event;
const email = inputData.to;
const messageId = inputData.message_id;

// Filter bot and MPP events for accurate metrics
if (inputData.is_bot === true || inputData.is_mpp === true) {
  return { skip: true, reason: 'bot_or_mpp' };
}

return {
  event: event,
  email: email,
  message_id: messageId,
  link_url: inputData.link_url || null,
  bounce_type: inputData.bounce_type || null,
  timestamp: inputData.timestamp
};

Suppression Management

Automatically suppress hard-bounced emails to protect your sender reputation. Use POST /v1/suppression to add entries and POST /v1/suppression/check to verify before sending.

Add to Suppression List

JAVASCRIPT
// Zapier Code Step - Add to Suppression List
const response = 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: inputData.email }
    ]
  })
});

const result = await response.json();
return { suppressed: result.added || 0 };

Check Suppression Status

JAVASCRIPT
// Zapier Code Step - Check Suppression Status
const response = 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 result = await response.json();
return {
  email: inputData.email,
  is_suppressed: result.suppressed,
  reason: result.reason || null
};

Telemetry Dashboard

Monitor validation metrics on a schedule using GET /v1/telemetry/summary with ETag caching. When data has not changed, the API returns a 304 status with no body, reducing unnecessary processing.

Telemetry with ETag Caching

JAVASCRIPT
// Zapier Code Step - Fetch Telemetry with ETag Caching
// Store ETag in a Zapier Storage step for subsequent runs
const headers = {
  'Authorization': 'Bearer YOUR_API_KEY'
};

// Add ETag from previous run if available
if (inputData.lastETag) {
  headers['If-None-Match'] = inputData.lastETag;
}

const response = await fetch('https://api.mailodds.com/v1/telemetry/summary', {
  method: 'GET',
  headers: headers
});

if (response.status === 304) {
  return { changed: false };
}

const result = await response.json();
return {
  changed: true,
  etag: response.headers.get('etag'),
  deliverable_rate: result.rates?.deliverable,
  total_validations: result.totals?.validations,
  credits_used: result.totals?.creditsUsed
};

Two-Tier Depth Optimization

Save SMTP credits by validating in two tiers. Tier 1 uses depth='standard' (syntax + DNS checks, no SMTP credit cost) to filter obviously invalid emails. Tier 2 uses depth='enhanced' (full SMTP verification) only for leads that pass Tier 1 and meet your qualification criteria. Typical savings: 72%.

Two-Tier Depth Optimization

JAVASCRIPT
// Zapier Code Step - Two-Tier Depth Optimization
// Tier 1: Standard validation (syntax + DNS, no SMTP credit cost)
const tier1Response = 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,
    depth: 'standard'
  })
});

const tier1 = await tier1Response.json();

// If Tier 1 rejects, stop here (no SMTP credit spent)
if (tier1.action === 'reject') {
  return { email: inputData.email, action: 'reject', depth_used: 'standard' };
}

// Tier 2: Enhanced validation only for qualified leads
const tier2Response = 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,
    depth: 'enhanced'
  })
});

const tier2 = await tier2Response.json();
return {
  email: tier2.email,
  status: tier2.status,
  action: tier2.action,
  depth_used: 'enhanced'
};

Full Platform: Send, Campaign, Monitor

MailOdds goes beyond validation. Use Zapier to automate email sending, manage campaigns, and set up deliverability alerts from 5,000+ connected apps.

Email Sending Action

Trigger transactional emails from any Zapier event. Send order confirmations, welcome emails, or notifications with full open and click tracking built in.

Send Transactional Email

JAVASCRIPT
// Zapier Code Step - Send Transactional Email via MailOdds
const response = await fetch('https://api.mailodds.com/v1/deliver', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    from: 'notifications@yourdomain.com',
    to: inputData.email,
    subject: inputData.subject,
    html: inputData.html_body,
    tags: ['zapier-triggered'],
    track_opens: true,
    track_clicks: true
  })
});

const result = await response.json();
return {
  message_id: result.message_id,
  status: result.status
};

Related: Email Sending API

Campaign Management

Create and send email campaigns directly from Zapier. Combine with a Schedule trigger for recurring newsletters, or trigger campaigns based on events from your CRM or e-commerce platform.

Create and Send Campaign

JAVASCRIPT
// Zapier Code Step - Create and Send Campaign
// Step 1: Create the campaign
const campaign = await fetch('https://api.mailodds.com/v1/campaigns', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: inputData.campaign_name,
    subject: inputData.subject,
    from_email: 'hello@yourdomain.com',
    subscriber_list_id: inputData.list_id,
    html_body: inputData.html_body,
    track_opens: true,
    track_clicks: true
  })
});

const data = await campaign.json();

// Step 2: Send the campaign
await fetch('https://api.mailodds.com/v1/campaigns/' + data.id + '/send', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});

return { campaign_id: data.id, status: 'sending' };

Related: Email Campaigns

Deliverability Alerting

Monitor your sender reputation on a schedule and get alerts when it drops. Route notifications to Slack, email, or PagerDuty so your team can act before deliverability degrades.

Check Sender Health and Alert

JAVASCRIPT
// Zapier Code Step - Check Sender Health and Alert
const response = await fetch('https://api.mailodds.com/v1/sender-health', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});

const health = await response.json();

return {
  reputation_score: health.reputation_score,
  bounce_rate: health.bounce_rate,
  complaint_rate: health.complaint_rate,
  needs_attention: health.reputation_score < 70,
  alert_message: health.reputation_score < 70
    ? 'Sender reputation dropped to ' + health.reputation_score + '/100'
    : 'Sender health OK (' + health.reputation_score + '/100)'
};
// Use a Filter step after this: only continue if needs_attention is true
// Then send alert to Slack, email, or PagerDuty

Related: Email Deliverability Platform

Store Sync Trigger

Sync your connected Shopify or WooCommerce store from Zapier. Trigger product imports on a schedule or in response to events, then query your catalog for campaign personalization.

Trigger Store Sync and Check Products

JAVASCRIPT
// Zapier Code Step - Trigger Store Sync and Check Products
// Trigger a sync for your connected e-commerce store
await fetch('https://api.mailodds.com/v1/stores/' + inputData.store_id + '/sync', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});

// After sync completes, query products
const products = await fetch('https://api.mailodds.com/v1/store-products?' + new URLSearchParams({
  store_id: inputData.store_id,
  limit: '10'
}), {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});

const catalog = await products.json();
return {
  product_count: catalog.products.length,
  synced: true
};

Related: E-commerce Email Integration

Frequently Asked Questions

Troubleshooting

Need more help?

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

Ready to Get Started?

Create your free account and start validating emails in minutes.