ZeroBounce ETL Profile Guide

Prev Next

This document provides detailed ETL Profile configuration for integrating ZeroBounce results into ACE. It is a companion to How to Configure ZeroBounce for Email Validation.

Each ETL profile applies custom logic using JavaScript to load results back into accounts. The same ZeroBounce results file is cycled through three passes — one for each ETL profile: Invalids, Did You Mean, and Complete.

ZeroBounce Import File

ZeroBounce returns a single results file with the following columns [0-12]:

  • Email Address

  • ZB Status

  • ZB Substatus

  • ZB Account

  • ZB Domain

  • ZB First Name

  • ZB Last Name

  • ZB Gender

  • ZB Free Email

  • ZB MX Found

  • ZB MX Record

  • ZB SMTP Provider

  • ZB Did You Mean

Additional custom columns are created and populated using JavaScript [13-19]:

  • Email Address: Active

  • Email Address: Status

  • Enrichment Meta Data: Enrichment Vendor

  • Customer Account Number (DebtID)

  • Demographic EmailID

  • Enrichment Meta Data: Misc 5 (profile identifier)

  • Enrichment Meta Data: Enrichment Date

ETL Profile 1 – ZeroBounce Enrichment Invalids

Purpose: Marks invalid email addresses as INACTIVE in ACE while recording vendor and enrichment metadata.

Import File Column / ETL Profile Column

Mapped to this ACE Field

Notes

Email Address / line[0]

Email Address: Email Address

ZB Status / line [1]

Unmapped

ZB Sub status / [2]

Enrichment Meta Data: Status

If there is a new email address provided with the invalid email address, the same Enrichment Meta Data: Status will be applied to each record

ZB Account - line[3]

ZB Domain - line[4]

ZB First Name - line[5]

ZB Last Name - line[6]

ZB Gender - line[7]

ZB Free Email - line[8]

ZB MX Found - line[9]

ZB MX Record - line[10]

ZB SMTP Provider - line[11]

ZB Did You Mean - line[12]

Unmapped

line [13]

Email Address: Active

will skip ZB records based on JavaScript in the custom column and set Active value for the Email Address

var active = 'false';
if (line[1] === 'valid') {
    skip = true;
    active = 'true';
}

active;

line [14]

Email Address: Status

sets email status to INVALID

var returnVal = 'ACTIVE';

if (!skip) {
    returnVal = 'INVALID';
}

returnVal;

line [15]

Enrichment Meta Data: Enrichment

sets enrichment vendor to ZEROBOUNCE

'ZEROBOUNCE'

line [16]

Email Address: Customer Account Number

identifies customer account number/agency id/debt id

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);
var primaryEmail = null;

for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (emailRecord.getDemographicType().toString() === 'PRIMARY') {
        primaryEmail = emailRecord;
        break;
    }
}

var debtID = "";
if (primaryEmail !== null) {
    debtID = primaryEmail.getDebtID().toString();
}

debtID


line [17]

Email Address: Demographic EmailID

identifies demographic emailID

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);

var primaryEmail = null;

for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (emailRecord.getDemographicType().toString() === 'PRIMARY') {
        primaryEmail = emailRecord;
        break;
    }
}

var demograhicEmailID = "";
if (primaryEmail !== null) {
    demograhicEmailID = primaryEmail.getDemographicEmailID().toString();
}

demograhicEmailID

line [18]

Enrichment Meta Data: Misc 5

stores note in enrichment misc 5 field identifying which ETL profile was used (inactive, did you mean or complete)

'ZB_ENRICHED_INVALIDS'

line [19]

Enrichment Meta Data: Enrichment Date

stores the date the enrichment data was loaded

//new Date().toISOString().split('T')[0]; // UTC-based
new Date().toLocaleDateString('en-CA'); // Local-based

Image Displays “ZeroBounce Enrichment Invalids” ETL Profile Mapped Data and Custom Columns

ETL Profile 2 – ZeroBounce Enrichment Did You Mean

Purpose: Import corrected addresses when ZeroBounce suggests them; mark as processed and stamp metadata.

Import File Column / ETL Profile Column

Mapped to this ACE Field

Notes

Email Address / line[0]

Unmapped

ZB Status / line [1]

Unmapped

ZB Sub status / [2]

Enrichment Meta Data: Status

If there is a new email address provided with the invalid email address, the same Enrichment Meta Data: Status will be applied to each record

ZB Account - line[3]

ZB Domain - line[4]

ZB First Name - line[5]

ZB Last Name - line[6]

ZB Gender - line[7]

ZB Free Email - line[8]

ZB MX Found - line[9]

ZB MX Record - line[10]

ZB SMTP Provider - line[11]

Unmapped

line [12]

Email Address: Email Address

line [13]

Email Address: Active

will skip ZB records based on JavaScript in the custom column and set Active value for the Email Address

var active = 'false';
if (line[1] === 'valid') {
    skip = true;
    active = 'true';
}

active;

line [14]

Email Address: Status

sets email status to INVALID

var returnVal = 'ACTIVE';

if (!skip) {
    returnVal = 'INVALID';
}

returnVal;

line [15]

Enrichment Meta Data: Enrichment

sets enrichment vendor to ZEROBOUNCE

'ZEROBOUNCE'

line [16]

Email Address: Customer Account Number

identifies customer account number/agency id/debt id

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);

var chosen = null; // fallback to any record
for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (!chosen) chosen = emailRecord; // keep first as provisional
    if (emailRecord.getDemographicType && emailRecord.getDemographicType().toString() === 'PRIMARY') {
        chosen = emailRecord; // prefer PRIMARY when available
        break;
    }
}

var debtID = "";
if (chosen && chosen.getDebtID) {
    debtID = String(chosen.getDebtID());
}

debtID;

line [17]

Unmapped

Identifier* CALCER

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);

var primaryEmail = null;

for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (emailRecord.getDemographicType().toString() === 'PRIMARY') {
        primaryEmail = emailRecord;
        break;
    }
}

var demograhicEmailID = "";
if (primaryEmail !== null) {
    demograhicEmailID = primaryEmail.getDemographicEmailID().toString();
}

demograhicEmailID

line [18]

Enrichment Meta Data: Misc 5

stores note in enrichment misc 5 field identifying which ETL profile was used (inactive, did you mean or complete)

'ZB_ENRICHED_DID_YOU_MEAN'

line [19]

Enrichment Meta Data: Enrichment Date

stores the date the enrichment data was loaded

//new Date().toISOString().split('T')[0]; // UTC-based
new Date().toLocaleDateString('en-CA'); // Local-based

Image Displays “ZeroBounce Enrichment Did You Mean” ETL Profile Mapped Data and Custom Columns

ETL Profile 3 — ZeroBounce Enrichment Complete

Purpose: Record that each address has been processed; apply active/skip and metadata.

Import File Column / ETL Profile Column

Mapped to this ACE Field

Notes

Email Address / line[0]

Mapped to Email Address: Email Address

ZB Status / line [1]

Unmapped

ZB Sub status / [2]

Enrichment Meta Data: Status

If there is a new email address provided with the invalid email address, the same Enrichment Meta Data: Status will be applied to each record

ZB Account - line[3]

ZB Domain - line[4]

ZB First Name - line[5]

ZB Last Name - line[6]

ZB Gender - line[7]

ZB Free Email - line[8]

ZB MX Found - line[9]

ZB MX Record - line[10]

ZB SMTP Provider - line[11]

ZB Did You Mean - line[12]

Unmapped

line [13]

Email Address: Active

will skip ZB records based on JavaScript in the custom column and set Active value for the Email Address

var active = 'false';
var skip = true;

// active check
if (line[1] === 'valid') {
    active = 'true';
}

// skip condition
if (active === 'false') {
    skip = true;
} else {
    skip = false;
}
active;

line [14]

Unmapped

var returnVal = 'ACTIVE';

if (!skip) {
    returnVal = 'INVALID';
}
returnVal;

line [15]

Enrichment Meta Data: Enrichment

sets enrichment vendor to ZEROBOUNCE

'ZEROBOUNCE'

line [16]

Email Address: Customer Account Number

identifies customer account number/agency id/debt id

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);

var primaryEmail = null;

for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (emailRecord.getDemographicType().toString() === 'PRIMARY') {
        primaryEmail = emailRecord;
        break;
    }
}

var debtID = "";
if (primaryEmail !== null) {
    debtID = primaryEmail.getDebtID().toString();
}

debtID

line [17]

Email Address: Demographic EmailID

identifies demographic emailID

var demographicEmails = new DemographicEmails().loadByEmail(line[0]);

var primaryEmail = null;

for (var i = 0; i < demographicEmails.size(); i++) {
    var emailRecord = demographicEmails.get(i);
    if (emailRecord.getDemographicType().toString() === 'PRIMARY') {
        primaryEmail = emailRecord;
        break;
    }
}

var demograhicEmailID = "";
if (primaryEmail !== null) {
    demograhicEmailID = primaryEmail.getDemographicEmailID().toString();
}

demograhicEmailID

line [18]

Enrichment Meta Data: Misc 5

stores note in enrichment misc 5 field identifying which ETL profile was used (inactive, did you mean or complete)

'ZB_ENRICHED_COMPLETE'

line [19]

Enrichment Meta Data: Enrichment Date

stores the date the enrichment data was loaded

//new Date().toISOString().split('T')[0]; // UTC-based
new Date().toLocaleDateString('en-CA'); // Local-based

Image Displays “ZeroBounce Enrichment Complete” ETL Profile Mapped Data and Custom Columns