This article is for anyone who loathes the idea of having to provide email support to customers. In particular, because one or more expected email messages has failed to turn up in the customer’s email inbox and they need the missing message(s) resent.
Let’s suppose, for instance, that you have built a membership program. To guide your members through the program you send them one pre-written message every week. The messages are loaded into a campaign in your auto responder service and out they go automatically. It is an entirely hands off process.
Only… for whatever reason some messages never make it to the customer.
What is the solution?
First Approach: Hire An Assistant
You could wait until the frustrated customer contacts you with a request to have the message resent. But this is problematic for a couple of reasons.
First, it requires someone (maybe you, maybe an assistant) to go into your auto responder, look up the customer record, locate the relevant message in the correct campaign, and then trigger a resend.
This is time-consuming manual labor for someone. Maybe it takes only 10 minutes to do. But still, you might have a lot of members, and random interruptions throughout the day are annoying, non-productive, and are a drain on your resources.
Second, you will need to be sure the customer has provided you with the same email address as exists in their contact record. Otherwise you will not be able to locate their record and trigger the resend. Also, you might have embedded some amount of personalization in the message, so triggering the resend using their contact record ensures the delivery and fidelity of the expected content.
You could have a personal assistant perform these resend tasks for you. On the other hand if you automate away all of the extraneous tasks which can be automated then you would not need to hire someone at all, and I like that idea a lot.
This is because I am lazy (do not like to do the manual labor myself) and cheap (not into hiring people).
So when it recently occurred to me that I was going to have to deal with the missing message problem I did what I always do. I checked whether or not someone else had already solved the problem for me.
Second Approach: Follow The Advice Of Your Auto Responder Service
At the moment my auto responder service is ActiveCampaign.
So I contacted them and asked if there was a clever way to automate away this problem. I had already given a little thought to how I might do it if they told me there was no good solution. But again, I am lazy, so if someone else has already figured it out…
Alas no. I was given the following advice.
To understand it you need to first be aware that in ActiveCampaign a preconfigured email campaign is called an automation. This is just a sequence of messages which go out after specified time delays, the sending of which might also be conditioned on one or more data elements associated with the contact (or subscriber).
I was told the recommended approach for having a message resent is to create one new automation for every message in the original automation (email sequence). Load that one message into the new automation and then when someone requests the message go look up their contact record and add that automation to contact’s profile to trigger the resend.
Because I had two dozen messages in my original automation I was looking at the creation of two dozen new automations. Needless to say, I thought this was a horrible idea. On top of that, someone still had to put in the time by logging into the auto responder service, looking up the contact, and locating the relevant automation to be triggered.
No. Not to my liking at all.
Here is what I think is a much better way to solve this problem.
Final Approach: Automate Everything
Here is what I want in my solution.
First, nobody on my side of the problem should have to intervene if the customer can retrieve the message themself. That way they never seek support and I go about my day without interruption.
Second, if I can build a single automation that caters to every possible request type rather than one automation per request type, then that appeals much more to me. I will not end up with a cluttered and confusing Automation pane in my ActiveCampaign account.
In the end, the solution I designed works the following way.
At the bottom of every message in my original automation I note the possibility of missing messages and provide a link to a page where the subscriber can retrieve one or more messages themself.
Every email message carries a numeric message identifier in the subject line. That way someone can look at the subject lines and easily spot a missing message. “Darn it, message 18 just arrived but I did not get message 17. What the hell!”
Then they remember the note at the bottom of all the messages and click through to the “message resend” page. On that page they are presented with a form that contains a menu which offers every message in the automation. In my case, 1/24 through to 24/24.
It looks something like this:
They select the identifier of the message they need resent, hit the resend button on the form, and the message is automatically resent to their inbox.
Brilliant, Stephen. Now tell me how it works.
Step One: Locate The Auto Responder API
Every auto responder service I have dealt with has an application programming interface (API). This is a code base you can use to write programs on your own server which communicate with the auto responder to get things done without going through a form submission.
As an example, a new subscriber will generally add themself to your list using an opt-in form. But you could also use the API to add a new contact directly behind the scenes.
In our case, which involves a resend message request, the subscriber (or contact) record already exists in our auto responder account. What we want to do is send along some information that triggers the appropriate message to be resent.
So when the customer hits the resend button we will use the API to send along a request to add a “tag” to the customer’s contact record. The tag is going to be our way to say “resend message 17”.
A tag is just a string. In this case it might have the value resend-mabillion-17, which is our way of indicating that message 17 needs to be resent from the Make Another Billion (MAB) automation I have set up to cater to my Wall Street bond managers. These guys are paying me $1,000 every week to receive my Jewels of Knowledge. This is why they never let a missing message slide past them.
No, not really. I have no understanding whatsoever of how the financial world works nor any clients who pretend they do.
At any rate, if I supply the customer’s email address and the tag resend-mabillion-17 to my API code I can inform ActiveCampaign to resend message 17 in the Make Another Billion Message Resend automation.
I will not bother to provide you with any details about how the API works other than to say there is a contact_tag_add method which can be used to do the job. You will almost surely be out sourcing the construction of your API coding to a developer familiar with how ActiveCampaign does these things, so let them worry about the particulars.
The other part of the set up requires hooking up the resend automation at the auto responder.
Step Two: How To Configure Your Resend Automation
ActiveCampaign has a rather flexible interface for the construction of automations.
Using a combination of menus to select from, and draggable graphical icons, you can insert messages, time delays, and (most agreeably) conditional decision points. Those decision points allow one to insert IF/ELSE statements which can be used to decide whether to perform a step or skip it.
For the sake of simplicity we are going to assume my MAB sequence contains just two messages. This is enough to allow us to see how to hook up the automation. Constructing automations with longer message sequences are no harder to pull off, they just require more message insertions at the obvious places.
Automations can be started (triggered) in different ways, but here we are going to be sending out one of just two messages. So we only need two tags to act as our triggers:
In ActiveCampign we can add as many triggers as we like to initiate the flow of actions which make up the automation. In this case the automation is only going to spit out one message, and that message will be determined by the value of the triggering tag.
We begin by clicking on the Add a start trigger icon. Up pops a menu of trigger options and we select Tag is added. This puts up a box into which we can type the first of our tags. We select Runs Once, then hit the Add Start button.
A box then pops up to allow a new element to be added to the automation based on the triggering of that first tag. But we can dismiss this new element box for now. Instead, we want to click on the Add a new trigger icon and again go through the process with the second tag that will trigger the automation.
When we are finished our triggering elements look like this:
Now when either of those tags is added to the contact record for a subscriber the automation will run. Presently the automation does nothing so we change that by clicking on the + icon. Up pops a menu of actions to chose from.
The first thing we want to do is inspect the triggering tag and decide whether or not it matches the first tag value resend-mab-01. If it does we will send Message #1. So we select from the menu: Conditions and Workflow, then we select the If/Else option.
Up pops a dialog box which allows us to specify the if/else conditional. In its non-filled-out state it looks like this:
For the Select a condition option we first select Contact Details to have a list of fields come up and from that we select Tag. Then we enter our first tag value so that the form looks like this:
Note that evaluation operation in the middle of the form, Exists. That is going to be important later. If the tag with the specified value exists then carry out the action on node labeled Yes, else carry out the action on the node labeled No.
Once we click the Add button our automation contains the first conditional point:
On the node labeled No we can add a new conditional to test whether the value of the tag matches our second triggering option resend-mab-02. And we can keep doing that, following the right-hand nodes labeled No for as many messages (and tags) as we have in our sequence.
On the node labeled Yes, when we click on the + icon we select Sending Options and then Send an email. This pops up the interface to create a message. Since we are resending existing messages this part is essentially going to correspond to a cut and paste option. We are going to be making copies of all the messages in our original automation and placing them in this resend automation.
After each point in the flow where the tag match has been made and the corresponding message sent out we remove the tag. That way the same tag can be added again and the automation retriggered if the subscriber wants to resend the same message for whatever reason. To remove a tag we click on the + symbol under an added email message and select Contacts, then Remove a tag. We specify the tag to be removed, and save.
Now that we have covered all the options we just have to end the automation. The lowest graphical element on the page will correspond to the action to remove the last of the tags in our list of automation-triggering tags. Under that when we click on the + icon we can select Conditions and Workflow, then End this automation.
To all other remaining + icons can be attached a “pipe” that redirects to another action, in this case the element to end the automation. When we click on these + icons we can select Conditions and Workflow then Go to. Then we click on the go to action and drag it to the element to end the automation.
When we are finished the entire automation looks like this:
And that’s it.
Well, almost. In fact there is one problem with the way I have set this up. It came to light after I tested the automation. Can you spot what it is?
Likely not, as it has nothing to do with the logic of the operational flow of the automation. I will tell you what the issue is in a moment.
Before doing that, there is another question which might arise when you are setting up an automation like this which contains a number of those go to actions.
When you have dozens of messages in the automation it will become apparent that it is not so easy to try to connect those go to pipes from one place to another when they start high on the page and you need to connect them to an element at the bottom of the page.
The way to get around this problem is to start by adding the first of those go to elements at the bottom of the page.
Then move to the next place higher up where a go to element needs to be added and connect that one to the one below it. That way, by the time you are finished, you have a series of these things connected in a chain of many short hops. That is how you get from the top of the page (or any other part of the page) to the bottom of the page where this automation finishes up.
Now back to that flaw in the design I alluded to earlier…
An Essential Bug Fix
It turns out that ActiveCampaign does not immediately and fully process the automation triggers it receives. So if we send two requests separated by a short period of time of the order of a few minutes or less it is possible for the most recent request to be processed before the earlier one.
Additionally, if you look closely at the conditional statement which evaluates tags you will see the statement executes based on whether a given tag EXISTS in the automation and not whether the comparison value matches the value of the tag which triggered the execution.
It is therefore possible to trigger an initial request with the resend-mab-01 tag but have the later request with the resend-mab-02 tag go to completion first.
In that case there are two tags in the automation at the same time and when the second request is being carried out (for resend-mab-02) the point is reached when the if/else statement for the first tag is executed…
Is there a tag with the value resend-mab-01 in the automation?
Why yes there is. So Message #1 goes out even though the initiating tag is resend-mab-02 and Message #2 was the one intended to be resent to the subscriber.
Then, because the left side of the conditional is executed (the Yes arm which sends out Message #1) the conditional for the initiating tag resend-mab-02 is never executed and the tag is not removed from the automation. So the tag resend-mab-02 remains in the subscriber’s contact record.
If there was another conditional statement lower down in the automation for a tag with the value resend-mab-03 which was meant to trigger a resend of Message #3, and if that tag was uses as the trigger for the automation, the conditional statement involving resend-mab-03 would never be executed because the tag resend-mab-02 would be intercepted first by the conditional statement one level up – and Message #2 would go out instead.
You can see how this would become confusing with the subscriber never managing to retrieve the intended message.
Someone could request Message #9 but because the tag resend-mab-03 is now stuck in the system out would go Message #3 instead. Worse yet, if you were to send multiple requests in a short period it would be possible for more than one tag to get stuck in the automation. The response of the automation to new requests would become even more confusing.
So what is the solution to this?
It is to move all the “remove tag” elements to the bottom of the automation so that each time the automation executes ALL tags in the system are removed. That way no tag can ever remain at the completion of an automation request.
Here is what that looks like:
If too many requests are sent in a short period of time some requests will end up being erased if their executions overlap in time. But that is not a big problem. If the subscriber later resends a single request it will go through because there will be no left over tags to cause problems in the if/else evaluations.
You can see now why someone might recommend the construction of two dozen separate resend automations to cater to two dozen separate messages. When there are independent automations you do not need to use if/else statements for tag evaluations, so you would not run into the gumming up the works problem I have outlined above.
Still, I prefer the single resend automation. The caveat is that it might not work too well if a single subscriber tries to retrieve multiple messages in a short period of time. In practice this is not likely to happen as missing messages ought not be that frequent an occurrence and usually the customer will attempt to retrieve just the one message.
Summary: It Pays To Automate When You Can
If you have an email sequence which contains messages that your subscribers are expecting to turn up in their inbox I probably do not need to convince you any further that this resend automation approach is a fairly nifty way to ensure that happens.
When all is said and done it is a relatively simple solution.