Self-hosted workflow automation with full API access. 36 production-ready patterns for validation, sending, A/B testing, content compliance, engagement, DMARC, and monitoring.
Run n8n on your own infrastructure with full control over your data.
Fully open-source with an active community and extensible architecture.
Your API keys never leave your server. Full audit trail of all operations.
36 production-ready workflows for validation, sending, A/B testing, content compliance, engagement, DMARC, and monitoring.
Drop a CSV or Excel file into a Google Drive folder and get validated, rejected, and manual-review files automatically sorted into organized folders.
Launch validation jobs from Google Sheets via webhook and get results merged back automatically with full statistics.
Validate a single email via HTTP Request, then route results by action: accept to CRM, reject to discard, accept_with_caution to manual review.
Submit an email list for async validation with polling and idempotency. Handles completed, failed, and cancelled job states with a configurable poll limit.
Validate up to 100 emails in a single synchronous request. No polling, no callbacks. Results return immediately with per-email action routing.
Receives ESP bounce webhooks (SendGrid, Mailgun, SES), normalizes the payload, and adds hard bounces to the MailOdds suppression list automatically.
Pull hourly validation metrics into Google Sheets with ETag caching. Sends a Slack alert when the deliverable rate drops below a configurable threshold.
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.
Create validation policies from presets (strict, permissive, smtp_required) and apply them per-request. Two workflows: one-time setup and the main validation flow.
Receive an email via webhook, validate the recipient, check suppression, and send through the MailOdds deliver endpoint. Rejects are auto-suppressed.
Receives MailOdds delivery webhooks (bounced, failed, deferred), verifies HMAC signatures, deduplicates events, and auto-suppresses hard bounces with optional Slack alerts.
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.
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.
Receives MailOdds engagement webhooks, filters out bot opens and Apple MPP events, and syncs real human engagement data to Klaviyo profiles for accurate segmentation.
Validates new HubSpot contacts on creation, maps validation results to custom HubSpot properties, and downgrades lifecycle stage for rejected emails.
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.
Receives job.completed webhooks, creates a new subscriber list, paginates all valid results, and subscribes each email with double opt-in.
Runs every 4 hours, checks sending stats against configurable thresholds (delivery rate, bounce rate, bot opens, unsubscribe rate), and fires Slack alerts on anomalies.
Receives MailOdds bounce webhooks, verifies and deduplicates, then fans out hard bounce suppressions to Mailchimp, Klaviyo, and ActiveCampaign in parallel.
Receives Shopify fulfillment webhooks, checks suppression, and sends shipping notification emails with tracking schema_data and ai_summary for rich inbox cards.
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.
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.
Receives form submissions via webhook, validates the email, and subscribes valid addresses to a MailOdds list with double opt-in and consent proof metadata.
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.
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.
Fetches disengaged contacts from the engagement API, scores them, auto-suppresses contacts past a configurable inactivity threshold, and sends a summary report to Slack.
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.
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.
Batch-checks contacts for out-of-office status before campaign sends. Holds OOO contacts for later delivery and sends immediately to available recipients.
Monitors complaint assessment hourly. Alerts when complaint rate approaches Gmail (0.1%) or general (0.3%) thresholds and optionally pauses sending.
Analyzes bounce logs via the bounce analysis API, cross-references with validation data, identifies patterns by domain and category, and delivers a forensic report.
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.
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.
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.
Receives alert rule configuration via webhook, checks if a matching rule already exists, creates or updates accordingly, and responds with the final rule list.
Receives Shopify or WooCommerce purchase webhooks, validates the buyer email, tracks the purchase event via the events API, and enriches with engagement score data.
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
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.
Update credential IDs and any REPLACE_WITH_* placeholders in the workflow nodes, then activate.
Use these expressions in Switch or IF nodes to route based on validation results:
{{ $json.action === 'accept' }}{{ $json.action === 'accept_with_caution' }}{{ $json.action === 'reject' }}{{ $json.sub_status === 'disposable' }}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
| 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 |
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.
// 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
}
}]; 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.
// 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' } }]; // 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": "..." } 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.
// 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
}}]; 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%.
// 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 Beyond validation templates, use n8n to automate email sending, manage campaigns, and build deliverability monitoring dashboards.
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.
// 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
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.
// 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
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.
// 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
Can't find what you're looking for? We're here to help you get n8n working.
Get your API key and start building self-hosted email automation workflows with 36 ready-to-use templates.