MailOdds
ActiveCampaign

ActiveCampaign + MailOdds

Validate contact emails to improve ActiveCampaign deliverability. Tag contacts by email quality and keep your automations targeting real addresses.

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

Prerequisites

  • MailOdds account with API key
  • ActiveCampaign account
  • Zapier or Make account

ActiveCampaign Use Cases

New Contact Validation

Validate emails on contact creation. Tag as verified or invalid to control automation enrollment.

Automation Gate

Use validation tags as automation entry conditions. Only verified contacts enter nurture sequences.

Pre-Campaign Cleaning

Bulk validate lists before major campaigns. Remove invalid emails to protect sender reputation.

Form Submission Quality

Validate ActiveCampaign form submissions. Prevent fake emails from consuming automation steps.

Step-by-Step Setup

1

Create Custom Fields in ActiveCampaign

Settings > Custom Fields: add "email_validation_status" (text) and "email_validation_action" (text).

2

Create a Zap: New Contact

Trigger: ActiveCampaign "New Contact". Map email to validation Code step.

3

Validate with MailOdds

Code step calls MailOdds API. Returns status, action, and detailed sub_status.

4

Tag Contact by Result

Add "verified-email" or "invalid-email" tag based on action field.

5

Build Automations on Tags

Create AC automations triggered by validation tags for routing and segmentation.

Zapier: Validate ActiveCampaign Contact

JAVASCRIPT
// Zapier Code Step - Validate ActiveCampaign Contact
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 ActiveCampaign contact
  })
});

const result = await response.json();

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

Make: ActiveCampaign Scenario

JAVASCRIPT
// Make Scenario - ActiveCampaign Contact Validation
// 1. ActiveCampaign: Watch New Contacts (trigger)
// 2. HTTP Module: POST to https://api.mailodds.com/v1/validate
//    Headers: Authorization: Bearer YOUR_API_KEY
//    Body: { "email": "{{1.email}}" }
// 3. ActiveCampaign: Update Contact
//    Custom Field "email_validation" = {{2.data.status}}
//    Custom Field "email_action" = {{2.data.action}}
// 4. Router: Branch by action
//    - "reject" -> ActiveCampaign: Add Tag "invalid-email"
//    - "accept" -> ActiveCampaign: Add Tag "verified-email"

Zapier: Tag Contacts by Email Quality

JAVASCRIPT
// Zapier: Tag ActiveCampaign Contacts by Email Quality
// After validation, tag contacts for automation triggers:
//
// Step 1: Code by Zapier (validation above)
// Step 2: ActiveCampaign - Add/Remove Tag
//    If is_valid = true:  Add tag "verified-email"
//    If is_valid = false: Add tag "invalid-email"
//
// Step 3: ActiveCampaign - Update Contact
//    Custom Field "email_quality" = {{code.status}}
//
// Use tags to trigger automations:
// - "invalid-email" -> remove from campaigns
// - "verified-email" -> enroll in nurture sequence

Webhook Event Handling

Receive real-time MailOdds events and update ActiveCampaign contacts automatically. Route bounces to tags, and use filtered open/click data to drive automations.

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 ActiveCampaign

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' }]
    })
  });

  // Tag contact in ActiveCampaign
  // Next Zapier step: ActiveCampaign - Add Tag "bounced"
}

if (event === 'message.opened' && !inputData.is_bot && !inputData.is_mpp) {
  // Real human open - update ActiveCampaign custom field
  // Next step: ActiveCampaign - Update Contact
  //   Custom Field "last_validated_open" = new Date().toISOString()
}

if (event === 'message.clicked' && !inputData.is_bot) {
  // Real click - update engagement score
  // Next step: ActiveCampaign - Add Tag "engaged-validated"
}

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

Suppression Sync

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

Zapier: Sync Suppression List with ActiveCampaign

JAVASCRIPT
// Zapier: Sync MailOdds Suppression with ActiveCampaign
// Step 1: Check if email is suppressed before campaign send
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 - tag in ActiveCampaign
  // Next step: ActiveCampaign - Add Tag "suppressed"
  // Next step: ActiveCampaign - Remove from Automation
  return { suppressed: true, email: inputData.email, reason: check.reason };
}

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

Engagement Enrichment

Push validation health metrics into ActiveCampaign custom fields. Track deliverable rates and validation counts for internal reporting.

Zapier: Push Telemetry Data to ActiveCampaign

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

// Update ActiveCampaign contact with account-level validation health
// Next step: ActiveCampaign - Update Contact Custom Fields
//   "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 ActiveCampaign list before a campaign. Submit emails in batch, poll for results, and tag contacts based on outcomes.

Zapier: Bulk Validate ActiveCampaign List

JAVASCRIPT
// Zapier: Bulk Validate ActiveCampaign List Before Campaign
// Step 1: Export AC list contacts (via ActiveCampaign 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 AC list
    depth: 'enhanced'
  })
});
const batch = await response.json();

// batch.job_id - poll GET /v1/validate/batch/{job_id} for results
// Then tag contacts based on validation outcomes
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 ActiveCampaign working.

Clean Your ActiveCampaign Lists

Get 1,000 free validations and improve your marketing automation deliverability.