MailOdds

n8n

n8n + MailOdds

Self-hosted workflow automation with full API access. 36 production-ready patterns for validation, sending, A/B testing, content compliance, engagement, DMARC, and monitoring.

Setup time: 10-30 min
Difficulty: Intermediate
1,000 free validations included

Prerequisites

  • MailOdds account (free tier works)
  • API key from dashboard
  • n8n instance (cloud or self-hosted, v1.30+)
  • Familiarity with n8n expressions
  • Browse all 36 workflow templates

Self-Hosted

Run n8n on your own infrastructure with full control over your data.

Open Source

Fully open-source with an active community and extensible architecture.

Secure

Your API keys never leave your server. Full audit trail of all operations.

Integration Patterns

36 production-ready workflows for validation, sending, A/B testing, content compliance, engagement, DMARC, and monitoring.

View detailed setup guides

Google Drive Auto-Validation

Ops Intermediate

Drop a CSV or Excel file into a Google Drive folder and get validated, rejected, and manual-review files automatically sorted into organized folders.

POST /v1/jobs/uploadpresigned S3GET /v1/jobs/{id}/results

Google Sheets Bulk Validation

Marketing Advanced

Launch validation jobs from Google Sheets via webhook and get results merged back automatically with full statistics.

POST /v1/jobswebhook callbackGET /v1/jobs/{id}/results

Real-Time Lead Validation

Sales Dev Beginner

Validate a single email via HTTP Request, then route results by action: accept to CRM, reject to discard, accept_with_caution to manual review.

POST /v1/validateaction routing

Async Bulk Job

Developer Intermediate

Submit an email list for async validation with polling and idempotency. Handles completed, failed, and cancelled job states with a configurable poll limit.

POST /v1/jobsidempotency_keyGET /v1/jobs/{id}

Sync Batch Validation

Ops Beginner

Validate up to 100 emails in a single synchronous request. No polling, no callbacks. Results return immediately with per-email action routing.

POST /v1/validate/batchenhanced depth

Bounce-to-Suppression Pipeline

Deliverability Intermediate

Receives ESP bounce webhooks (SendGrid, Mailgun, SES), normalizes the payload, and adds hard bounces to the MailOdds suppression list automatically.

POST /v1/suppressionwebhook ingestion

Telemetry Dashboard

RevOps Intermediate

Pull hourly validation metrics into Google Sheets with ETag caching. Sends a Slack alert when the deliverable rate drops below a configurable threshold.

GET /v1/telemetry/summaryETag caching

Manual Review Loop

Sales Dev Intermediate

Validates incoming leads via webhook, auto-accepts clean emails to your CRM, rejects invalid ones, and routes uncertain results to a Google Sheet for human review.

POST /v1/validatehuman-in-the-loop

Policy-Aware Validation

Compliance Advanced

Create validation policies from presets (strict, permissive, smtp_required) and apply them per-request. Two workflows: one-time setup and the main validation flow.

GET /v1/policies/presetsPOST /v1/policies/from-presetpolicy_id

Pre-Validated Email Delivery

Developer Beginner

Receive an email via webhook, validate the recipient, check suppression, and send through the MailOdds deliver endpoint. Rejects are auto-suppressed.

POST /v1/validatePOST /v1/deliverPOST /v1/suppression

Bounce and Failure Alert Pipeline

Deliverability Intermediate

Receives MailOdds delivery webhooks (bounced, failed, deferred), verifies HMAC signatures, deduplicates events, and auto-suppresses hard bounces with optional Slack alerts.

message.bounced webhookPOST /v1/suppressionHMAC verification

Weekly Sending Health Digest

RevOps Intermediate

Pulls 7-day sending stats and domain identity scores every Monday, formats a Slack Block Kit digest, and logs metrics to Google Sheets for trending.

GET /v1/sending-statsGET /v1/sending-domains/{id}/identity-score

Shopify Order Confirmation Pipeline

Ecommerce Advanced

Receives Shopify orders/create webhooks, checks suppression, and sends order confirmation emails with campaign_type, schema_data for Gmail rich cards, and ai_summary for AI assistants.

POST /v1/delivercampaign_type: order_confirmationschema_dataai_summary

Real Engagement to Klaviyo Sync

Marketing Intermediate

Receives MailOdds engagement webhooks, filters out bot opens and Apple MPP events, and syncs real human engagement data to Klaviyo profiles for accurate segmentation.

message.opened webhookmessage.clicked webhookis_bot filteringis_mpp filtering

HubSpot New Contact Gatekeeper

Sales Dev Intermediate

Validates new HubSpot contacts on creation, maps validation results to custom HubSpot properties, and downgrades lifecycle stage for rejected emails.

POST /v1/validateaction routingdisposable detection

DNS Health Monitor with Alerts

Ops Intermediate

Runs daily at 6am, fetches identity scores for all sending domains, verifies DNS records, and alerts when any domain drops below a configurable grade threshold.

GET /v1/sending-domainsGET /v1/sending-domains/{id}/identity-scoregrade threshold

Job Results to Subscriber List

Marketing Advanced

Receives job.completed webhooks, creates a new subscriber list, paginates all valid results, and subscribes each email with double opt-in.

job.completed webhookGET /v1/jobs/{id}/resultsPOST /v1/listsPOST /v1/subscribe/{list_id}

Deliverability Anomaly Alert

Deliverability Intermediate

Runs every 4 hours, checks sending stats against configurable thresholds (delivery rate, bounce rate, bot opens, unsubscribe rate), and fires Slack alerts on anomalies.

GET /v1/sending-statsGET /v1/telemetry/summaryETag cachingbaseline comparison

MailOdds Bounce to ESP Cross-Sync

Deliverability Intermediate

Receives MailOdds bounce webhooks, verifies and deduplicates, then fans out hard bounce suppressions to Mailchimp, Klaviyo, and ActiveCampaign in parallel.

message.bounced webhookbounce_typePOST /v1/suppression

Shopify/WooCommerce Shipping Email

Ecommerce Advanced

Receives Shopify fulfillment webhooks, checks suppression, and sends shipping notification emails with tracking schema_data and ai_summary for rich inbox cards.

POST /v1/delivercampaign_type: shipping_notificationschema_dataJSON-LD

Mailchimp List Cleaning Pipeline

Marketing Advanced

Runs weekly, fetches Mailchimp list members, validates in batches of 100 via POST /v1/validate/batch, archives invalid members in Mailchimp, and suppresses in MailOdds.

POST /v1/validate/batchPOST /v1/suppressionMailchimp archive

Post-Purchase Review Request Sender

Ecommerce Advanced

Runs daily, finds 7-day-old Shopify orders, checks suppression, and sends review request emails with campaign_type: review_request and JSON-LD ReviewAction schema.

POST /v1/delivercampaign_type: review_requestPOST /v1/suppression/check

Form-to-Validated-Subscriber Pipeline

Marketing Beginner

Receives form submissions via webhook, validates the email, and subscribes valid addresses to a MailOdds list with double opt-in and consent proof metadata.

POST /v1/validatePOST /v1/subscribe/{list_id}double opt-inconsent proof

Campaign A/B Auto-Optimizer

Marketing Advanced

Creates campaign variants with different subject lines or content, waits for statistical significance, fetches A/B results, and auto-sends the winning variant to the remaining audience.

POST /v1/campaigns/{id}/variantsGET /v1/campaigns/{id}/ab-resultsPOST /v1/campaigns/{id}/send

Content Compliance Gate

Compliance Intermediate

Runs email content through the LLM-powered content classifier and spam score checker before sending. Blocks emails that fail compliance and routes to human review.

POST /v1/content-checkPOST /v1/spam-checksGET /v1/spam-checks/{id}

Engagement Sunset Pipeline

Marketing Intermediate

Fetches disengaged contacts from the engagement API, scores them, auto-suppresses contacts past a configurable inactivity threshold, and sends a summary report to Slack.

GET /v1/engagement/disengagedPOST /v1/engagement/suppress-disengagedGET /v1/engagement/score/{email}

DMARC Policy Ladder

Ops Advanced

Monitors all DMARC domains weekly, checks compliance trends, fetches policy upgrade recommendations, and alerts when a domain is ready to move up the policy ladder.

GET /v1/dmarc-domainsGET /v1/dmarc-domains/{id}/trendGET /v1/dmarc-domains/{id}/recommendationGET /v1/dmarc-domains/{id}/sources

Blacklist Watchdog

Deliverability Beginner

Runs blacklist checks every 6 hours for all monitored IPs and domains. Fires immediate Slack alerts on new listings and logs check history to Google Sheets.

GET /v1/blacklist-monitorsGET /v1/blacklist-monitors/{id}/checkGET /v1/blacklist-monitors/{id}/history

Out-of-Office Smart Hold

Marketing Intermediate

Batch-checks contacts for out-of-office status before campaign sends. Holds OOO contacts for later delivery and sends immediately to available recipients.

POST /v1/out-of-office/batch-checkGET /v1/out-of-office/{email}POST /v1/deliver

Complaint Rate Guardian

Deliverability Intermediate

Monitors complaint assessment hourly. Alerts when complaint rate approaches Gmail (0.1%) or general (0.3%) thresholds and optionally pauses sending.

GET /v1/complaint-assessmentGET /v1/sender-healthGET /v1/bounce-stats/summary

Bounce Forensics Pipeline

RevOps Advanced

Analyzes bounce logs via the bounce analysis API, cross-references with validation data, identifies patterns by domain and category, and delivers a forensic report.

POST /v1/bounce-analysesGET /v1/bounce-analyses/{id}GET /v1/bounce-analyses/{id}/recordsGET /v1/bounce-analyses/{id}/cross-reference

Contact List Hygiene Pipeline

Marketing Advanced

Schedules weekly contact list cleaning: paginates all contact lists, batch-validates emails in chunks of 100, archives invalid entries, reimports clean data, and sends a summary report.

GET /v1/contact-listsGET /v1/contact-lists/{id}POST /v1/validate/batchPOST /v1/contact-lists/{id}/import

Campaign Lifecycle Automation

Marketing Advanced

End-to-end campaign automation: creates campaigns from Google Sheets data, checks delivery confidence before scheduling, waits for results, then fetches funnel and attribution data back to the sheet.

POST /v1/campaignsGET /v1/campaigns/{id}/delivery-confidencePOST /v1/campaigns/{id}/scheduleGET /v1/campaigns/{id}/funnelGET /v1/campaigns/{id}/attribution

Domain Onboarding Orchestrator

Ops Advanced

Triggered when a new domain is added, runs server tests, polls for results, fetches identity scores, and generates a DNS setup checklist with pass/fail details sent to Slack.

POST /v1/server-testsGET /v1/server-tests/{id}GET /v1/sending-domains/{id}/identity-scoreGET /v1/sending-domains/{id}/verify

Alert Rules Configurator

Ops Intermediate

Receives alert rule configuration via webhook, checks if a matching rule already exists, creates or updates accordingly, and responds with the final rule list.

POST /v1/alert-rulesGET /v1/alert-rulesPUT /v1/alert-rules/{id}DELETE /v1/alert-rules/{id}

Event Tracking Pipeline

Ecommerce Intermediate

Receives Shopify or WooCommerce purchase webhooks, validates the buyer email, tracks the purchase event via the events API, and enriches with engagement score data.

POST /v1/events/trackPOST /v1/validateGET /v1/engagement/score/{email}
View detailed setup guides

Quick Setup

1

Create MailOdds Credentials in n8n

In n8n, go to Credentials and create a new "Header Auth" credential with your MailOdds API key.

Get your API Key
// n8n HTTP Header Auth Credentials

Name: MailOdds API
Header Auth:
  Name: Authorization
  Value: Bearer YOUR_API_KEY
2

Import a Workflow Template

Download any workflow JSON from the patterns above, then import it in n8n via Workflows, Import from File. Each template includes setup instructions in a sticky note.

3

Replace Placeholders and Activate

Update credential IDs and any REPLACE_WITH_* placeholders in the workflow nodes, then activate.

Action Routing Reference

Use these expressions in Switch or IF nodes to route based on validation results:

Accept (safe to send)
{{ $json.action === 'accept' }}
Accept with Caution (catch-all, risky)
{{ $json.action === 'accept_with_caution' }}
Reject (invalid, do not send)
{{ $json.action === 'reject' }}
Disposable Email (sub-status check)
{{ $json.sub_status === 'disposable' }}

Webhook Configuration

Receive real-time event notifications from MailOdds using a Webhook Trigger node. Copy the production URL from n8n and configure it in your MailOdds dashboard under Webhooks.

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 (Function Node)

JAVASCRIPT
// n8n Function Node - Handle MailOdds Webhook Events
// Webhook Trigger node receives events at your n8n webhook URL
const event = $json.event;
const email = $json.to;
const messageId = $json.message_id;

// Filter bot and MPP events for accurate metrics
if ($json.is_bot === true || $json.is_mpp === true) {
  return []; // Skip non-human events
}

return [{
  json: {
    event: event,
    email: email,
    message_id: messageId,
    link_url: $json.link_url || null,
    bounce_type: $json.bounce_type || null,
    timestamp: $json.timestamp
  }
}];

Suppression Management

Build a bounce-to-suppression pipeline using webhook events and the POST /v1/suppression endpoint. Verify suppression status before sending with POST /v1/suppression/check.

Bounce-to-Suppression Pipeline (Function Node)

JAVASCRIPT
// n8n Function Node - Bounce-to-Suppression Pipeline
// After Webhook trigger + Switch on event type:
const email = $json.to;
const bounceType = $json.bounce_type;

// Only suppress hard bounces
if (bounceType !== 'hard') {
  return []; // Skip soft bounces
}

// HTTP Request node config:
// URL: https://api.mailodds.com/v1/suppression
// Method: POST
// Headers: Authorization: Bearer YOUR_API_KEY
// Body: { "entries": [{ "type": "email", "value": email }] }

return [{ json: { email, action: 'suppress' } }];

Check Suppression Status (HTTP Request Node)

JSON
// n8n HTTP Request Node - Check Suppression Status
// URL: https://api.mailodds.com/v1/suppression/check
// Method: POST
// Headers: Authorization: Bearer YOUR_API_KEY
// Body:
{
  "email": "={{ $json.email }}"
}
// Response: { "suppressed": true/false, "reason": "..." }

Telemetry Dashboard

Monitor validation metrics on a schedule using GET /v1/telemetry/summary with ETag caching via n8n static workflow data. When data has not changed, the API returns 304, and the Function node returns an empty array to skip downstream processing.

Telemetry with ETag Caching (Function Node)

JAVASCRIPT
// n8n Function Node - Telemetry with ETag Caching
const staticData = $getWorkflowStaticData('global');
const lastETag = staticData.lastETag || '';

// HTTP Request node config:
// URL: https://api.mailodds.com/v1/telemetry/summary
// Method: GET
// Headers:
//   Authorization: Bearer YOUR_API_KEY
//   If-None-Match: {{ lastETag }}

// After HTTP Request:
const statusCode = $input.first().statusCode;
if (statusCode === 304) {
  return []; // No changes, skip downstream
}

const data = $json;
staticData.lastETag = $input.first().headers?.etag || '';

return [{ json: {
  timestamp: new Date().toISOString(),
  deliverable_rate: data.rates?.deliverable,
  total_validations: data.totals?.validations,
  credits_used: data.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. Use an IF node between the two HTTP Request nodes. Typical savings: 72%.

Two-Tier Depth Optimization Pattern

JAVASCRIPT
// n8n Function Node - Two-Tier Depth Optimization
// Tier 1: Standard validation (syntax + DNS, no SMTP credit cost)
// HTTP Request node:
//   URL: https://api.mailodds.com/v1/validate
//   Method: POST
//   Headers: Authorization: Bearer YOUR_API_KEY
//   Body: { "email": "={{ $json.email }}", "depth": "standard" }

// IF Node: Check Tier 1 result
// Condition: {{ $json.action }} != "reject"
// True branch -> Tier 2
// False branch -> Discard (saved an SMTP credit)

// Tier 2: Enhanced validation for qualified leads only
// HTTP Request node:
//   URL: https://api.mailodds.com/v1/validate
//   Method: POST
//   Headers: Authorization: Bearer YOUR_API_KEY
//   Body: { "email": "={{ $json.email }}", "depth": "enhanced" }

// Switch Node: Route by action (accept, reject, accept_with_caution)
// Typical savings: 72% fewer SMTP credits
Full Platform: Send, Campaign, Monitor

Beyond validation templates, use n8n to automate email sending, manage campaigns, and build deliverability monitoring dashboards.

Email Sending

Send transactional emails directly from n8n workflows. Trigger from Cron schedules, webhooks, or app events. Track opens and clicks with built-in engagement analytics delivered back via webhooks.

HTTP Request Node: Send Email via MailOdds

JAVASCRIPT
// n8n HTTP Request Node - Send Email via MailOdds
// Method: POST
// URL: https://api.mailodds.com/v1/deliver
// Authentication: Header Auth (Authorization: Bearer YOUR_API_KEY)
// Body (JSON):
{
  "from": "notifications@yourdomain.com",
  "to": "{{ $json.email }}",
  "subject": "{{ $json.subject }}",
  "html": "{{ $json.html_body }}",
  "tags": ["n8n-triggered"],
  "track_opens": true,
  "track_clicks": true
}

Related: Email Sending API

Campaign Management

Automate campaign creation and sending with n8n. Build weekly newsletter workflows that create a campaign, attach your subscriber list, send, and post a summary to Slack.

Workflow: Campaign Create + Send

JAVASCRIPT
// n8n Workflow - Campaign Create + Send
// Node 1: Cron Trigger (weekly)
// Node 2: HTTP Request - POST /v1/campaigns
//   Body: { name, subject, from_email, subscriber_list_id, html_body }
// Node 3: HTTP Request - POST /v1/campaigns/{{ $json.id }}/send
// Node 4: Slack - Post campaign summary to channel

Related: Email Campaigns

Deliverability Monitoring

Build an hourly monitoring dashboard that checks sender health, DMARC compliance trends, and blacklist status. Route alerts to Slack when metrics degrade and append snapshots to Google Sheets for historical tracking.

Workflow: Deliverability Monitoring Dashboard

JAVASCRIPT
// n8n Workflow - Deliverability Monitoring Dashboard
// Node 1: Cron Trigger (every hour)
// Node 2: HTTP Request - GET /v1/sender-health
// Node 3: IF Node - reputation_score < 70
//   True: Slack Alert with bounce_rate, complaint_rate
//   False: Continue
// Node 4: HTTP Request - GET /v1/dmarc/domains/yourdomain.com/trend
// Node 5: HTTP Request - GET /v1/blacklist-monitors
// Node 6: IF Node - any blacklist detected
//   True: Slack Alert with blacklist details
// Node 7: Google Sheets - Append hourly health snapshot

Related: Email Deliverability Platform

Frequently Asked Questions

Troubleshooting

Need more help?

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

Ready to Automate?

Get your API key and start building self-hosted email automation workflows with 36 ready-to-use templates.