Skip navigation
1 2 Previous Next

Do It

20 Posts authored by: Teiu Codrin
Teiu Codrin

Delete accounts in bulk

Posted by Teiu Codrin May 6, 2019



This post will cover a specific situation encountered when attempting to delete Eloqua accounts in bulk.


Default facts:

- If account linkage is set up, the unique identifier for accounts is the one set in the account linkage;

- if account linkage is NOT set up, the default identifier is CompanyName;


What scenario we will cover:

- Account linkage not set up (thus the default unique is Company Name), but our real unique and the one by which we want to delete is another account field, let's say a CompanyID.



- cannot delete based on a different identifier neither via the upload menu nor API, as the system takes CompanyName as default identifier.



1. Create an account group

Go to Audience/Tools/Account Groups and create new group to delete. In its top menu there is an Add Companies button. Select to add using Company Filter.


2. Create the filter

After going for the filter option at step 1 a window will pop up. Select Create New, name it, then add company fields(like CompanyID) by dragging them from one side to the other.

This is where you filter out and create your list of accounts to delete. Be very specific, the number will be confirmed at the bottom. The value for Total Number of Companies should reflect the number of accounts to be deleted.

Save and Close.

Make sure to select again the filter you just created and click continue.


3. Delete records

Review the list obtained. If it is ok then proceed to the top right menu of the account group and select Data Manipulation. Pick Delete Group Companies from Database.


I hope this helps,

In order to create a page tags structure in Eloqua you would have to have your website fully tracked with Eloqua scripts.

Comprehensive instructions on how to do that can be found at Assets/Website setup/Tracking/Visitor Tracking/Visitor Tracking Package. Clicking the Generate button on lower right will provide and archive with the scripts and detailed instructions.


Now given that your website is tracked and you can dint it in the Eloqua Site Map, we can proceed with the tags

We have the following website structure which we want to include in our Eloqua web tagging page system.

in order to make our approach automated we will start by creating the main tags: home, services, Industries, Insights, Contact.

The base URL in the input box should be and the levels down should be set to 1.


Now we are going to create an Auto Tagging rule for second tier: Services, Industries, Insights, Contact

There will be 4 rules.

The base URL will  be different for each, for example for Industries. The tags will be created automatically for all pages under it.



Now you have your Eloqua tags all set up for a website with the above structure. The plus is that you set up Auto Tag rules, so changes within the same structure will auto tag new pages. This is alot better than selecting Create page Tag and creating one tag a time, which is a system you will have to manually support at every site map change, either by hand or excel upload (which is also by hand ).


To add a plus to reporting on tags, you can create page tags groups. I would recomment one group for each base url within the site, like Service, Industries, insights. Just manually add the page tags withn the page tag group.



The working scenario is that a contact in being forwarded and email and he clicks a link in an email and arrives to a page. It can be:

- that the page he arrives to is an unsubscribe page where he clicks a button to unsubscribe;

- the page is a prepopulated registration page;

In our case, that would be a problem because the page would pre-populate with the data of the original receiver of the email. Thus the person being forwarded the email by that office colleague could submit a form with someone else's data or unsubscribe the forwarder.


In order to prevent that we have to make some updates to the destination page. Basically we'll check if the visitor of the page has the same email address as the person who received the email. The Eloqua tracking script needs to be present on the page.


Create a Visitor Lookup in the Web Data Lookup section. Make sure the Data Lookup Type is Visitor and the data field is Cookui GUID. This will get the email adddress of the Visitor. Script is there in the Get Data Lookup Scripts section and looks like below.

<SCRIPT TYPE='text/javascript' LANGUAGE='JavaScript'><!--//

<div id="contactinfo">


function CreateRow(label, value) {

    var p = document.createElement('p');

    var b = document.createElement('b');






function SetElqContent(){

    if (this.GetElqContentPersonalizationValue){

      CreateRow('Email Address: ', GetElqContentPersonalizationValue(''));

      CreateRow('Email Address: ', GetElqContentPersonalizationValue('V_Email_Address'));

  } else {

      CreateRow('Personalization functions not found','');





From here you can check this visitor email address againt the one coming from the email link, that is if you populate with field merges.


var eloquaEmailAddress = "<span class="eloquaemail" >EmailAddress</span>";

function verifyIdentity(cookieEmailAddress) {

    if(eloquaEmailAddress == cookieEmailAddress || cookieEmailAddress == undefined || cookieEmailAddress == "") {      

        // KEEP Identity based on Eloqua ID

    } else {

        // SET Identity based on Cookie GUID

        for (var i=0;i<document.getElementsByName('emailAddress').length;i++){

            document.getElementsByName("emailAddress").value = cookieEmailAddress;





If you populate using Contact Lookups, there appears to be a new option to get this solved. Basically this Contact lookup on a page will return lookup data if there's a match with the Visitor (we didn't give a try to this one yet).

I've stumbled upon recently over an issue I also encountered in the past and did not documented. The scenario is the following:

  • you upload a number of contacts;
  • after upload you see that more fields than what you uploaded have values (let's say you uploaded email, fname, lname, company, phone, BUT you start seeing values for Salutation, Job Role, Budget, etc);
  • obviously, the extra values were not in the excel you uploaded.


Where are they from and why they are there?

The way to tacke this is to go to Settings/Manage Fields and Views and take a look at one of such field. Let's pick Salutation for this example. You know you haven't uploaded or picked a value, but you see a value in it after the contact upload/creation. And NO, you know there's no program assigning these based on gender.

Surprinsingly the field does not have a default value. So where is the value coming from?

Observation: the field is based on a select list. Let's open it.


Although not plain, the problem is in the above screenshot. The problem is that the first option of the picklist is an actual value.

The picklists used for fields should not start with a value.

Instead, they should start like this.

As you see above, now the first entry has no value, just a name.

Now, the newly created contacts will not be assigned a value.

Teiu Codrin

Custom object services

Posted by Teiu Codrin Aug 30, 2016

Custom data objects (CDO) can be helpfull containers of data.


One of its most simple use would be to use contact related information for which you don't want to create contact fields.

Another one would be to store all responses in your Eloqua instance (could be accomplished using a master hidden form too).

More advanced usage would be integration with external platforms.


CDO setup examples

We need to distinguish between 2 different custom objects setup:

- with primary key (usually email address): once an entry is submitted, any additional submits from the same contact will update the initial entry (can depend on form processing steps setup);

- without primary key: each new submit will create a new entry in the CDO.


Contact mapping

You can check the mapping of your CDO to contact records by going into the Reporting menu on the upper right side after opening the CDO. Just pick "Custom Object Records Mapped to Contacts Breakdown".

The window which will pop up will let you know how many unmapped entries you have. Let's say that out of 6.5 mil custom object entries (we asume we have a custom object with no PK) you have 1 mil unmapped entries. This means that the data in those unmapped entries cannot be found with filters(or segment filters) because filters check if contacts have linked records in custom objects but in this case those responses are unmapped.

One of the reasons for having unmapped entries in an CDO is that the "map to contact" box was not selected at upload.




The services can be accessed once the CDO is opened, from the upper right menu, click Custom Object --> Custom Object Record Services.

Basically you will be able to set some processing steps, similar to the program builder steps (or let's say forms processing steps for those less familiar with programs).

There are 2 options for when to run the steps: for new data, or for modified data. What this means is pretty self explanatory, but also described in the screenshot below.

When addding a processing step upder any of the categories above the available options are below.

Most commonly used option would be to add to a Program Builder or adding to a specific list. You can also run an Integration Rule if you do this from a CDO level. Most of the steps can be conditional.

1. Eloqua has a Contact Field Completness report. It is available only for a limited number of contact fields and looks like below. Though very usefull to data cleansing or tracking, it has high limitations becuase of the low number of contact fields it can be ran for.

When ran, it will provide a percentage of how many contacts in your DB have a value in that field.


2. Another useful report is the Contact Field Value report. You can select from a list of predefined fields (which to my knowledge cannot be changed).

When ran, it will provide a full list of values of that field, the count for the value, and percentage from total for that value.


3. For fields that cannot be reached with the above reports we can check their values and counts from within Eloqua. Go to Settings/Fields and Views/Fields/ and search and open your field of choice. Once open, in the field window, on the lower left side there is a button called Field Population Details.

If there are more than 1000 different values, then it will not display. If it will display, it will give you the field values and the number of contacts corresponding to the values.


4. To obtain values for CDO fields (in the case of very large CDO's) open the CDO and in the upper right menu, under the Reporting button, the last two options called Field Values and Field Percentages will give you what they say the do.

Teiu Codrin

Cloud Action: Form Submit

Posted by Teiu Codrin Jun 14, 2016

There is an app that represents an alternative to the "Send to Cloud Connector" step in Canvases.

The use of it is quite similar to the Cloud Connector one, for doing a form submit. The main visual difference is that the configuration takes part in a pop up window within Eloqua.


This app can be used to generate an artificial form submit within a canvas, for the contacts that pass through the step. See below the configuration window. Fields can be mapped, but also Static values can be set up. The documentation is here.


The app, once installed, can be found in the canvas under the Actions menu. You can also set up a wait step and a list for contacts that have problems when being ran throught the app.

Teiu Codrin

Canvas journey cleanup

Posted by Teiu Codrin Jun 14, 2016

As you noticed, sometimes is hard to troubleshoot contact journeys in canvases that deal with large number activations, because many contacts excluded from email sends from various reasons (master exclude, opted out, bounceback, etc) are remaning stuck in the email boxes along the canvas.


A possible way to keep this neat is to enable the email setting "Automatically route contacts excluded from email send". You can add an unlinked Wait step and a Move To Shared List step on a side of your canvas. Once enabled, the email option will allow you to select a step to tap into and you can select the wait step. This way, excluded contacts will be addded to that list and taken out of the canvas.


This can be used in a few ways, from simple to more fancy:

- one master list for the whole Eloqua instance. This way you will obtain 1 shared list to contain all excluded contacts from email sends along the whole platform;

- one shared list per campaign. This way you can track the effect of this on a campaign by campaign basis;

- by groups, like you make email Groups for Software, Hardware, etc. Each category can have a series of campaigns under it, and you make 1 exclusion shared list per category;

     - these can be later added into a segment for an instant overview;


Another use for the above process would be to use the resulting list(s) for platform related projects, like contact deletions of unreachable contacts in order to keep your database clean and of manageable size.

In a schenario where you have a dynamic footer with hundreds of rules and you have the copyright sign followed by year, you want to automatically populate that year.

So, in order for you not to manually open the footer and manually change the year, what you can do is populate that value from a field merge. Create a field merge using a datacard with email address as key.

The take the code for that field merge (simply drag the field merge in a new HTML email and you have the code) and add it to the HTML of your footer.

As you see in the image above, the value is being taked from the default value. The dacard you built will always remain empty, with no records in, so when the field merges evaluate it will always have to display the default value.


Next year, you just go and update the default value of the field merge.



We are going to take a look over 3 basic operations available within Segments: intersect, merge and trim.

Our test segment consists of 2 filters: one brings in the contacts who have a country value of "Unites States", and the other has the value AMS in the region field.


In order to perform any of the above operation left click both filters having the SHIFT key pressed then right click. The options are available in the menu. What they do is:

- the intersect will provide a list which is a sum of the common contacts in the 2 selections;

- the merge will provide a sum of all contacts in both lists, meaning it will unite then and remove the duplicates. As you see in the screenshot below, the resulting merge list is not a sum of the number of contacts, but a sum of the unique email addresses in both filters reunited;


- the trim will subtract one list from another. You will be prompted to select the list from which to trim from;


Any resulting lists can be right clicked and exported to an email address (excel or csv) or shared as a shared list within the system.

The working scenario is that we want to update the values we have in the Country contact field. Besides that the standard list is over 200 entries, we have hundreds of non-standard values across a few million contacts.

The first step would be to go to Settings/Picklists and create a picklist with the standard country values. You can add entry by entry, though you should be making a 2 columns excel file and upload. In the upper right corner there is the upload the values.

Second step is to obtain a full listing of the non-standard values and map them to correct values. The format should be an excel, left column being non standard values, and the right column being their mapping to a correct value. In order to get the list of non-standard values you can go to Setting/Field and Views, select your contact field, and click View field population details in the lower left corner

Another way to obtain the values is a Contact Field Values report from Insight.

Now, there is a bit of manual work here in creating the mapping file. You should assign a correct value for all non-standard values thus obtaining an excel mapping file.


Navigate to Contacts/Data Tools. In the upper left corner pick Data Tools/New Lookup Table. Create the table and in the upper right corner you have a Manage Entries button and upload the mapping table. It should look like below.


You can also add manual entries to this table.


Now create a new update rule made to run based on the Update Table you just made. See below.

Now in order to do the actual cleansing, create a program builder to run the update rule against the desired audience.

In the first step add the contacts with either a filter or feeder. The second step is running the update rule set. The last step is an exit.That's all you need, though the above setup checks for values not covered by the Update Tables and adds them to a wait (later on I am manually adding new values in the LookUp Table and circle the contacts back to the top).


Note: for the field you want to cleanse, you could make an eloqua picklist with the standard values. Then create a compare contact fields filter, asking for the contacts having Country field values NOT in that picklist nor blanks. And that's your audience to cleanse.



In order to send the same email at different hours on different timezones we can follow the next steps:

- create picklists with countries corresponding to each timeframe you want to address (let's say EMEA, AMS, APJ)

-  create shared filters for each timeframe you made country assignments for (criteria is Country in list and you select your picklist);


We assume that country field is populated for the canvas routing to happen correctly. Also, if it is not, let one timeframe to be last in the routing and play the role of a default timeframe.

For the canvas you can follow the below setup:

The same email is selected in all email boxes. Each has the scheduling set corresponding to the timeframe. The last email corresponds to the last timeframe and we also leave it as a default for the ones that don't fit any category (country not in list, misspelled, or missing).

You can set up your timeframes anyway you want, to contain what countries you want. In short, you can scale.


We are going to populate the region contact field based on the values we have in the country field. This would be good after we have standardized values in both, but we notice having a considerable group of contacts who have a value in the country field but none in the region field (this will be your audience to bring in the program builder).


We are going to use a program builder. See the below design.

We have 3 decision rules checking country value from a filter, and after them an update rule setting the region for each category. (This could be done in one run too, with some conditional update rules and an country to region update table. )


The filter inside the decision rule is like:

As you see, it checks the country field against a picklist of values.

This means that for each region, you would have to set up eloqua picklists with the corresponding country values. Make them in excel and upload.


The update rules ran in the program are like:

The scenario is that we want to cleanse and standardize the values of a contact field.

In order for this cleanse to be effective, it would be good if in the future the field cannot be filled in by contacts as text input, but selectable from a dropdown, on order to not bring back non standard values. Our production scenario is that we had contact fields as text input and switched to values to be selected from dropdowns. In this case, we wanted to cleanse all values present in the database.


Navigate to Contacts/Data tools. In the upped left Data Tools menu button select new update rule. Add name and then add individual update rules. See below.

In the above case, we want to standardize Estimated Budget field values to the above limits. As you can see below, we set up a series of threshold values and implemented.

We can also use more flexible rules, like using "*" to cleanse values that are starting or ending in a known string. See below.


In this case we are changing the value in the Job Seniority field, for example, to Consultant for all those who have values that are like  "Consultant,.......". The * keeps place for whatever else would be the continuation of that value.


Now in order to do the actual cleansing, create a program builder to run the update rule against the desired audience.

In the first step add the contacts with either a filter or feeder. The second step is running the update rule set. The last step is an exit.


Note: for the field you want to cleanse, you could make an eloqua picklist with the standard values, let's say the new 6 standard values for the estimated budget field. Then create a compare contact fields filter, asking for the contacts having Estimated Budget field values NOT in that picklist nor blanks. And that's your audience to cleanse.

The scenario is that in your links you custom add query strings past "?". We add a different query string per links, which gets submitted to a hidden form and then a datacard.

In order to create a report in Insight so you have visibility over this, you can use the below attributes and metrics

The attributes are campaign and clickthrough query string value and the metrics are total clockthroughs and unique clickthroughs.

running the report will provide something like below:

Make sure to have emails and pages added to the campaign canvas for reporting purposes.

Filter Blog

By date: By tag: