
Make + MailOdds
Build powerful automation scenarios with visual workflows. Connect to 1,000+ apps with advanced data transformation.
Prerequisites
- MailOdds account (free tier works)
- API key from dashboard
- Make account (free plan works)
- Basic understanding of HTTP requests
Works with: Google Sheets Airtable HubSpot Salesforce ActiveCampaign Mailchimp Webflow Notion Slack Discord +2 more
Multi-Step Scenarios
Build complex workflows with conditional logic, loops, and data transformation.
Database Sync
Validate and sync email data between databases, CRMs, and marketing tools.
Scheduled Validation
Run bulk validation jobs on a schedule and automatically process results.
Download Blueprint Templates
Import these blueprints into Make to get started quickly. Go to Scenarios > Import Blueprint > Upload File.
Example Scenario Flow
Trigger
Start with your data source (Google Sheets, Airtable, Webhook, etc.)
HTTP Request
Call MailOdds API to validate the email
Router
Split flow based on validation status (valid/invalid/catch_all)
Actions
Update records, send notifications, or trigger downstream processes
Setup Guide
Get Your MailOdds API Key
Create an API key from your MailOdds dashboard. You'll use this in the HTTP module headers.
Go to API KeysCreate a New Scenario
In Make, create a new scenario and add your trigger module (e.g., "Watch Rows" from Google Sheets).
Add HTTP Module
Add an "HTTP - Make a request" module and configure it with the MailOdds API endpoint.
Add Router for Branching
Use a Router module to split the flow based on validation status and take different actions.
HTTP Module: Validate Email
JAVASCRIPT// Make HTTP Module Configuration
URL: https://api.mailodds.com/v1/validate
Method: POST
Headers:
Authorization: Bearer {{your_api_key}}
Content-Type: application/json
Body (JSON):
{
"email": "{{email_from_previous_module}}"
}
Parse Response: Yes HTTP Module: Create Bulk Job
JAVASCRIPT// Make HTTP Module - Create Bulk Job
URL: https://api.mailodds.com/v1/jobs
Method: POST
Headers:
Authorization: Bearer {{your_api_key}}
Content-Type: application/json
Body (JSON):
{
"emails": {{array_of_emails}},
"callback_url": "{{your_webhook_url}}"
} HTTP Module: Fetch Results
JAVASCRIPT// Make HTTP Module - Fetch Results
URL: https://api.mailodds.com/v1/jobs/{{job_id}}/results
Method: GET
Query String:
format: json
per_page: 100
page: 1
Headers:
Authorization: Bearer {{your_api_key}} Router Filter Examples
Use these conditions in your Router filters to branch based on validation results:
result.action = "accept"result.action = "accept_with_caution"result.action = "reject"Webhook Configuration
Receive real-time event notifications from MailOdds in your Make scenarios. Use a Custom Webhook module as the trigger, then configure the URL in your MailOdds dashboard.
Supported events: message.bounced, message.opened, message.clicked, message.delivered, message.deferred
Webhook Event Fields
| Field | Type | Description |
|---|---|---|
| event | string | Event type (message.bounced, message.opened, message.clicked, etc.) |
| to | string | Recipient email address |
| message_id | string | Unique message identifier |
| is_bot | boolean | True if event from security scanner/link prefetcher (engagement events only) |
| is_mpp | boolean | True if event from Apple Mail Privacy Protection (engagement events only) |
| link_url | string | Clicked URL (message.clicked only) |
| bounce_type | string | hard or soft (message.bounced only) |
| timestamp | string | ISO 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.
Webhook Payload Example
JSON{
"event": "message.clicked",
"to": "user@example.com",
"message_id": "msg_abc123",
"link_url": "https://example.com/offer",
"is_bot": false,
"is_mpp": false,
"timestamp": "2026-01-15T10:30:00Z"
} Webhook Event Routing Scenario
JAVASCRIPT// Make Scenario - Handle MailOdds Webhook Events
// 1. Webhook: Custom webhook (receive MailOdds event)
// URL: Copy from Make and paste into MailOdds dashboard
//
// 2. Router: Branch by {{1.event}}
// Route A: "message.bounced" AND {{1.bounce_type}} = "hard"
// -> HTTP: POST https://api.mailodds.com/v1/suppression
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "entries": [{ "type": "email", "value": "{{1.to}}" }] }
//
// Route B: "message.clicked" AND {{1.is_bot}} != true
// -> HTTP: POST to CRM or analytics endpoint
//
// Route C: "message.opened" AND {{1.is_mpp}} != true
// -> HTTP: Update engagement score in CRM Suppression Management
Automatically suppress hard-bounced emails to protect your sender reputation. Build a bounce-to-suppression pipeline using webhook events and the POST /v1/suppression endpoint. Check suppressions before sending with POST /v1/suppression/check.
Bounce-to-Suppression Pipeline
JAVASCRIPT// Make Scenario - Bounce-to-Suppression Pipeline
// 1. Webhook: Catch MailOdds webhook event
// 2. Filter: {{1.event}} = "message.bounced" AND {{1.bounce_type}} = "hard"
// 3. HTTP Module: POST to https://api.mailodds.com/v1/suppression
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "entries": [{ "type": "email", "value": "{{1.to}}" }] }
//
// Suppression Check (before sending):
// HTTP Module: POST to https://api.mailodds.com/v1/suppression/check
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "email": "{{previous_module.email}}" }
// Response: { "suppressed": true/false, "reason": "..." } Telemetry Dashboard
Monitor validation metrics on a schedule using GET /v1/telemetry/summary with ETag caching. Store the ETag in a Make Data Store to avoid reprocessing unchanged data. Send alerts when deliverability drops below threshold.
Scheduled Telemetry with ETag Caching
JAVASCRIPT// Make Scenario - Scheduled Telemetry Monitoring
// 1. Schedule trigger: Every hour
// 2. Data Store: Get Record (key: "mailodds_etag")
// 3. HTTP Module: GET https://api.mailodds.com/v1/telemetry/summary
// Headers:
// Authorization: Bearer YOUR_API_KEY
// If-None-Match: {{2.etag}}
//
// 4. Router:
// Route A: Status code = 304 -> No Op (data unchanged)
// Route B: Status code = 200
// -> Data Store: Update Record (key: "mailodds_etag", value: {{3.headers.etag}})
// -> Google Sheets: Add Row (timestamp, deliverable_rate, total_validations)
// -> Filter: {{3.rates.deliverable}} < 0.85
// -> Slack: Send alert message 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. Use a Filter module between the two HTTP modules. Typical savings: 72%.
Two-Tier Depth Optimization Scenario
JAVASCRIPT// Make Scenario - Two-Tier Depth Optimization
// 1. Trigger: New row in Google Sheets / Webhook / etc.
//
// 2. HTTP Module: POST https://api.mailodds.com/v1/validate
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "email": "{{1.email}}", "depth": "standard" }
// (Tier 1: syntax + DNS, no SMTP credit cost)
//
// 3. Filter: {{2.action}} != "reject"
// (Only continue if email passes basic validation)
//
// 4. HTTP Module: POST https://api.mailodds.com/v1/validate
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "email": "{{1.email}}", "depth": "enhanced" }
// (Tier 2: full SMTP verification for qualified leads)
//
// 5. Router: Branch by {{4.action}}
// Typical savings: 72% fewer SMTP credits Frequently Asked Questions
Troubleshooting
Need more help?
Can't find what you're looking for? We're here to help you get Make working.
Related Integrations
Ready to Build Your Scenario?
Get your API key and start building powerful email validation workflows.