Creating a Triggered Email Campaign Workflow

This page contains conceptual and procedural information on creating a triggered send email campaign using the Marketing Cloud SOAP API.

Why Create a Triggered Send Email Campaign

A triggered send email campaign takes a previously created email message and sends that message out in response to an outside request, such as a subscriber opting in to receive the message.

How To Create a Triggered Send Email Campaign

Use the flow chart and sample code as an example of how to create and order the processes necessary for the triggered email send campaign.

Triggered Send Email Campaign Workflow Process

triggeredsendemailcampaign.jpg

Sample Code

This section contains sample code you can use to conduct your triggered sends.

Sample .NET Code

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using etAPI;
public partial class ETTriggeredSend : System.Web.UI.Page
{
    //Global Variables
    private SoapClient client = new SoapClient();
    protected void Page_Load(object sender, EventArgs e)
    {
        //Authenticate
        client.ClientCredentials.UserName.UserName = System.Configuration.ConfigurationSettings.AppSettings["wsUserName"];
        client.ClientCredentials.UserName.Password = System.Configuration.ConfigurationSettings.AppSettings["wsPassword"];
        if (!IsPostBack)
        {
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        try
        {
            //Create a GUID for ESD to ensure a unique name and customer key
            string strGUID = System.Guid.NewGuid().ToString();
            //Create TriggeredSendDefinition object [Messages > Email > Triggered]
            TriggeredSendDefinition tsd = new TriggeredSendDefinition();
            tsd.Name = "TSD_Name_" + strGUID;//required
            tsd.CustomerKey = strGUID;//recommended or the application assigns a number
            tsd.Description = "TSD_Description_" + strGUID;//recommended or the Description defaults to the Name
            //Set to delivery both Text and HTML versions.
            tsd.IsMultipart = true;//recommended as a best practice
            tsd.IsMultipartSpecified = true;//required
            //Set to track the links found in the email
            tsd.IsWrapped = true;//recommended to take advantage of Marketing Cloud's tracking
            tsd.IsWrappedSpecified = true;//required
            //Create Email object to refer to pre-create Email
            Email em = new Email();
            em.ID = 620046;//required //Available in Marketing Cloud UI [Content > My Emails > Properties]
            em.IDSpecified = true;//required
            //Apply Email object to the TriggeredSendDefinition object
            tsd.Email = em;//required
            //Create SendClassification
            tsd.SendClassification = new SendClassification();
            tsd.SendClassification.CustomerKey = "4201";//required //Available in Marketing Cloud UI [Setup > Send Management > Send Classifications > Edit Item > External Key]
            //tsd.TriggeredSendType = TriggeredSendTypeEnum.Continuous;
            //tsd.TriggeredSendTypeSpecified = true;
            //tsd.TriggeredSendStatus = TriggeredSendStatusEnum.New;
            //tsd.TriggeredSendStatusSpecified = true;
            //tsd.BatchInterval = 1;
            //tsd.BatchIntervalSpecified = true;
            //tsd.AutoAddSubscribers = true;
            //tsd.AutoAddSubscribersSpecified = true;
            //tsd.AutoUpdateSubscribers = true;
            //tsd.AutoUpdateSubscribersSpecified = true;
            //tsd.List = list;
            string cRequestID = String.Empty;
            string cStatus = String.Empty;
            try
            {
                //Call the Create method on the TriggeredSendDefinition object
                CreateResult[] cResults = client.Create(new CreateOptions(), new APIObject[] { tsd }, out cRequestID, out cStatus);
                //Display Results
                lblMessage.Text += "Overall Create Status: " + cStatus;
                lblMessage.Text += "<br/>";
                lblMessage.Text += "Number of Results: " + cResults.Length;
                lblMessage.Text += "<br/>";
                //Loop through each object returned and display the StatusMessage
                foreach (CreateResult cr in cResults)
                {
                    lblMessage.Text += "Status Message: " + cr.StatusMessage;
                    lblMessage.Text += "<br/>";
                }
            }
            catch (Exception exCreate)
            {
                //Set Message
                lblMessage.Text += "<br/><br/>CREATE TSD ERROR:<br/>" + exCreate.Message;
            }
            //Preceed if the above Create call was successful
            if (cStatus == "OK")
            {
                // *** MAKE TRIGGERED SEND DEFINITION ACTIVE  
                tsd = new TriggeredSendDefinition();
                tsd.CustomerKey = strGUID;//required
                tsd.TriggeredSendStatus = TriggeredSendStatusEnum.Active;//necessary to set the TriggeredSendDefinition to "Running"
                tsd.TriggeredSendStatusSpecified = true;//required
                string uRequestID = String.Empty;
                string uStatus = String.Empty;
                try
                {
                    //Call the Create method on the EmailSendDefinition object
                    UpdateResult[] uResults = client.Update(new UpdateOptions(), new APIObject[] { tsd }, out uRequestID, out uStatus);
                    //Display Results
                    lblMessage.Text += "Overall Update Status: " + uStatus;
                    lblMessage.Text += "<br/>";
                    lblMessage.Text += "Number of Results: " + uResults.Length;
                    lblMessage.Text += "<br/>";
                    //Loop through each object returned and display the StatusMessage
                    foreach (UpdateResult ur in uResults)
                    {
                        lblMessage.Text += "Status Message: " + ur.StatusMessage;
                        lblMessage.Text += "<br/>";
                    }
                }
                catch (Exception exCreate)
                {
                    //Set Message
                    lblMessage.Text += "<br/><br/>UPDATE TSD ERROR:<br/>" + exCreate.Message;
                }
                //Preceed if the above Update call was successful
                if (uStatus == "OK")
                {
                    // *** SEND THE TRIGGER EMAIL
                    //Create a new Subscriber to send the Trigger to
                    Subscriber newSub = new Subscriber();
                    newSub.EmailAddress = "acruz@exaple.com";
                    newSub.SubscriberKey = "acruz@exaple.com";
                    //Create Subscriber Attributes
                    newSub.Attributes = new etAPI.Attribute[2];//Attributes are available in Marketing Cloud UI [Subscribers > Profile Management]
                    //1
                    newSub.Attributes[0] = new etAPI.Attribute();
                    newSub.Attributes[0].Name = "FromName";//Account Specific
                    newSub.Attributes[0].Value = "From John Doe";//Subscriber Specific
                    //2
                    newSub.Attributes[1] = new etAPI.Attribute();
                    newSub.Attributes[1].Name = "HTML__Content";//Account Specific
                    newSub.Attributes[1].Value = "This is a test <a href=\"httpgetwrap|http://google.com\" alias=\"Google Link\">link</a>"; //httpgetwrap| must be before the http for Marketing Cloud to track this URL //Subscriber Specific
                    //Create a new Subscriber to send the Trigger to
                    Subscriber newSub2 = new Subscriber();
                    newSub2.EmailAddress = "jdoe@example.com";
                    newSub2.SubscriberKey = "jdoe@example.com";
                    //Create Subscriber Attributes
                    newSub2.Attributes = new etAPI.Attribute[2];//Attributes are available in Marketing Cloud UI [Subscribers > Profile Management]
                    //1
                    newSub2.Attributes[0] = new etAPI.Attribute();
                    newSub2.Attributes[0].Name = "FromName";//Account Specific
                    newSub2.Attributes[0].Value = "From Angela Cruz";//Subscriber Specific
                    //2
                    newSub2.Attributes[1] = new etAPI.Attribute();
                    newSub2.Attributes[1].Name = "HTML__Content";//Account Specific
                    newSub2.Attributes[1].Value = "This is a test <a href=\"httpgetwrap|http://example.com\" alias=\"ET Link\">link</a>"; //httpgetwrap| must be before the http for Marketing Cloud to track this URL //Subscriber Specific
                    //Create a TriggeredSend object to referrence the earlier created TriggeredSendDefinition
                    TriggeredSend ts = new TriggeredSend();
                    ts.TriggeredSendDefinition = new TriggeredSendDefinition();
                    ts.TriggeredSendDefinition.CustomerKey = strGUID;//This is the External Key from the UI
                    ts.Subscribers = new Subscriber[] { newSub, newSub2 };//Add the Subscriber objects to the TriggeredSend object
                    string tsRequestID = "";
                    string tsStatus = "";
                    try
                    {
                        //Call the Create method on the TriggeredSend object
                        CreateResult[] tsResults = client.Create(new CreateOptions(), new APIObject[] { ts }, out tsRequestID, out tsStatus);
                        //Display Results
                        lblMessage.Text += "Overall Update Status: " + tsStatus;
                        lblMessage.Text += "<br/>";
                        lblMessage.Text += "Number of Results: " + tsResults.Length;
                        lblMessage.Text += "<br/>";
                        //Loop through each object returned and display the StatusMessage
                        foreach (CreateResult tscr in tsResults)
                        {
                            lblMessage.Text += "Status Message: " + tscr.StatusMessage;
                            lblMessage.Text += "<br/>";
                        }
                    }
                    catch (Exception exCreate)
                    {
                        //Set Message
                        lblMessage.Text += "<br/><br/>CREATE TS ERROR:<br/>" + exCreate.Message;
                    }
                }

        }
        catch (Exception exc)
        {
            //Set Message
            lblMessage.Text += "<br/><br/>###ERROR<br/>" + exc.Message;
        }
    }
}

Sample PHP Code

$attr1 = buildAttribute("FirstName", $fname);
$attr2 = buildAttribute("LastName", $lname);
$attributes = array($attr1, $attr2);
{
$attr = new Marketing Cloud_Attribute();
        $attr->Name = $name;
        $attr->Value = $value;
        return $attr;
}
// Create the subscriber object and define its attributes.
$sub = new Marketing Cloud_Subscriber();    
$sub->EmailAddress = $email;
$sub->SubscriberKey = $email;
$sub->Attributes = $attributes;
// Create the Triggered Send Definition and set it CustomerKey value to the external key of the TriggeredSendDefinition.
$tsd = new Marketing Cloud_TriggeredSendDefinition();
$tsd->CustomerKey = $CustomerKey;
// Create the TriggeredSend and set its TriggeredSendDefinition and Subscribers properties.
$ts = new Marketing Cloud_TriggeredSend();
$ts->TriggeredSendDefinition = $tsd;
$ts->Subscribers = array();
$ts->Subscribers = $sub;    
// Create the SoapVar object out of the TriggeredSend object.
$object = new SoapVar($ts, SOAP_ENC_OBJECT, 'TriggeredSend', $etnamespace);
// Create the Request object and add the SoapVar object to it. (Options can be NULL.)
$request = new Marketing Cloud_CreateRequest();
$request->Options = NULL;
$request->Objects = array($object);
// Execute the request.
$results = $client->Create($request);

SOAP Envelopes to Interact with Emails and Triggered Send Definitions

This section includes sample code you can use to create a triggered email send using the SOAP API.

SOAP Request to Retrieve Email from Marketing Cloud System
<soapenv:Body>
    <RetrieveRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <RetrieveRequest>
            <ObjectType>Email</ObjectType>
            <Properties>ID</Properties>
            <Properties>CreatedDate</Properties>
            <Properties>Name</Properties>
            <Properties>Folder</Properties>
            <Properties>CategoryID</Properties>
            <Properties>HTMLBody</Properties>
            <Properties>TextBody</Properties>
            <Properties>Subject</Properties>
            <Properties>IsActive</Properties>
            <Properties>IsHTMLPaste</Properties>
            <Properties>Status</Properties>
            <Properties>EmailType</Properties>
            <Properties>CharacterSet</Properties>
            <Properties>HasDynamicSubjectLine</Properties>
            <Properties>ContentCheckStatus</Properties>
            <Properties>Client.PartnerClientKey</Properties>
            <Filter xsi:type="ns1:SimpleFilterPart" xmlns:ns1="http://exacttarget.com/wsdl/partnerAPI">
                <Property>Name</Property>
                <SimpleOperator>equals</SimpleOperator>
                <Value>Client1_Email_1</Value>
            </Filter>
        </RetrieveRequest>
    </RetrieveRequestMsg>
</soapenv:Body>
SOAP Response to Retrieve Email
<soap:Body>
    <RetrieveResponseMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <OverallStatus>OK</OverallStatus>
        <RequestID>af86580f-0c4e-4a0c-91ee-c21928bc198b</RequestID>
        <Results xsi:type="Email">
            <Client>
                <ID>123</ID>
            </Client>
            <CreatedDate>2009-08-07T10:57:24.943</CreatedDate>
            <ID>123</ID>
            <ObjectID xsi:nil="true"/>
            <Name>Client1_Email_1</Name>
            <Folder>Client1</Folder>
            <CategoryID>123</CategoryID>
            <HTMLBody>Welcome to Client1 emails.</HTMLBody>
            <TextBody/>
            <Subject>Client1_Email_1_Sub</Subject>
            <IsActive>true</IsActive>
            <IsHTMLPaste>true</IsHTMLPaste>
            <Status>New</Status>
            <EmailType>Normal</EmailType>
            <CharacterSet>us-ascii</CharacterSet>
            <HasDynamicSubjectLine>false</HasDynamicSubjectLine>
            <ContentCheckStatus>Not Checked</ContentCheckStatus>
        </Results>
    </RetrieveResponseMsg>
</soap:Body>
SOAP Request to Retrieve SendClassification
<soapenv:Body>
    <RetrieveRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <RetrieveRequest>
            <ObjectType>SendClassification</ObjectType>
            <Properties>ObjectID</Properties> -- Use ObjectID to Create TE Definition
            <Properties>Client.ID</Properties>
            <Properties>Name</Properties>
            <Properties>CustomerKey</Properties>
            <Filter xsi:type="ns1:SimpleFilterPart"xmlns:ns1="http://exacttarget.com/wsdl/partnerAPI">
                <Property>Name</Property>
                <SimpleOperator>equals</SimpleOperator> -- Use filter if you know Name
                <Value>Default Commercial</Value>
            </Filter>
        </RetrieveRequest>
    </RetrieveRequestMsg>
</soapenv:Body>
SOAP Response to Retrieve SendClassification
<soap:Body>
    <RetrieveResponseMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <OverallStatus>OK</OverallStatus>
        <RequestID>c462d15d-70eb-47f0-8805-7ad8fb400f26</RequestID>
        <Results xsi:type="SendClassification">
            <Client>
                <ID>75741</ID>
            </Client>
            <ObjectID>4819efef-4527-dd11-8126-001a4be9433a</ObjectID>
            <CustomerKey>123</CustomerKey>
            <Name>Default Commercial</Name>
        </Results>
        <Results xsi:type="SendClassification">
            <Client>
                <ID>123</ID>
            </Client>
            <ObjectID>4919efef-4527-dd11-8126-001a4be9433a</ObjectID>
            <CustomerKey>123</CustomerKey>
            <Name>Default Transactional</Name>
        </Results>
        <Results xsi:type="SendClassification">
            <Client>
                <ID>123</ID>
            </Client>
            <ObjectID>86acfc8f-ad7b-de11-9ca2-00215adeb818</ObjectID>
            <CustomerKey>FromAndReply_Key</CustomerKey>
            <Name>FromAndReply</Name>
        </Results>
        <Results xsi:type="SendClassification">
            <Client>
                <ID>123</ID>
            </Client>
            <ObjectID>fe9a4e34-63d4-de11-8e63-00215adeb896</ObjectID>
            <CustomerKey>FromName _From_List_Key</CustomerKey>
            <Name>FromName _From_List</Name>
        </Results>
    </RetrieveResponseMsg>
</soap:Body>
SOAP Request to Create Triggered Send Defintion
<soap:Body>
    <CreateRequest xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Options/>
        <Objects xsi:type="TriggeredSendDefinition">
            <CustomerKey>TriggeredSendDefinition_75741_1</CustomerKey>
            <Name>TriggeredSendDefinition_75741_1</Name> - Name of TriggeredSend Definition
            <SendClassification>
                <ObjectID>4819efef-4527-dd11-8126-001a4be9433a</ObjectID>
                <SenderProfile>
                    <ObjectID xsi:nil="true"/>
                    <CustomerKey>123</CustomerKey>
                </SenderProfile>
            </SendClassification>
            <Email>
                <ID>123</ID>
                <ObjectID xsi:nil="true"/>
            </Email>
            <IsMultipart>true</IsMultipart>
            <AutoAddSubscribers>false</AutoAddSubscribers>
        </Objects>
    </CreateRequest>
</soap:Body>
SOAP Response to Create Triggered Send Defintion
<soap:Body>
    <CreateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Results>
            <StatusCode>OK</StatusCode>
            <StatusMessage>TriggeredSendDefinition created</StatusMessage>
            <OrdinalID>0</OrdinalID>
            <NewID>0</NewID>
            <NewObjectID>a7f8c057-cbdd-de11-8e63-00215adeb896</NewObjectID>
            <Object xsi:type="TriggeredSendDefinition">
                <ObjectID>a7f8c057-cbdd-de11-8e63-00215adeb896</ObjectID>
                <CustomerKey>TriggeredSendDefinition_75741_1</CustomerKey>
                <Name>TriggeredSendDefinition_75741_1</Name>
                <SendClassification>
                    <ObjectID>4819efef-4527-dd11-8126-001a4be9433a</ObjectID>
                    <SenderProfile>
                        <ObjectID xsi:nil="true"/>
                        <CustomerKey>1973</CustomerKey>
                    </SenderProfile>
                </SendClassification>
                <Email>
                    <ID>123</ID>
                    <ObjectID xsi:nil="true"/>
                </Email>
                <AutoAddSubscribers>false</AutoAddSubscribers>
                <EmailSubject>Tracking Check with iso-8859-1</EmailSubject>
                <IsMultipart>true</IsMultipart>
            </Object>
        </Results>
        <RequestID>3950934f-17a5-4c4a-b45a-6cb72a7410e8</RequestID>
        <OverallStatus>OK</OverallStatus>
    </CreateResponse>
</soap:Body>
SOAP Request to Start Triggered Send Definition (Update Call)
<soap:Body>
    <UpdateRequest xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Options/>
        <Objects xsi:type="TriggeredSendDefinition">
            <ObjectID xsi:nil="true"/>
            <CustomerKey>TriggeredSendDefinition_75741_2</CustomerKey>
            <TriggeredSendStatus>Active</TriggeredSendStatus> - Set status to Active
        </Objects>
    </UpdateRequest>
</soap:Body>
SOAP Response to Start Triggered Send Definition
<soap:Body>
    <UpdateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Results>
            <StatusCode>OK</StatusCode>
            <StatusMessage>TriggeredSendDefinition updated</StatusMessage>
            <OrdinalID>0</OrdinalID>
            <Object xsi:type="TriggeredSendDefinition">
                <ObjectID xsi:nil="true"/>
                <CustomerKey>TriggeredSendDefinition_75741_2</CustomerKey>
                <TriggeredSendStatus>Active</TriggeredSendStatus>
            </Object>
        </Results>
        <RequestID>3ca8d0e2-8909-452c-ab14-75c3c54edb03</RequestID>
        <OverallStatus>OK</OverallStatus> //If status is not OK, something is wrong
    </UpdateResponse>
</soap:Body>
SOAP Request to Send Triggered Email to Subscriber
<soapenv:Body>
    <CreateRequest xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Options/>
        <Objects xsi:type="ns1:TriggeredSend"xmlns:ns1="http://exacttarget.com/wsdl/partnerAPI">
        <TriggeredSendDefinition>
            <CustomerKey>TriggeredSendDefinition_75741_2</CustomerKey>
        </TriggeredSendDefinition>
            <Subscribers>
                <Attributes>
                    <Name>Sample_PHP</Name> - Replaceable Attributes in Email
                    <Value><![CDATA[<html><body><div align='center'><table border='1'cellspacing='0' cellpadding=0 width='95%' style='width:95.0%'><tr><td>Welcome, You are sending Email using TriggeredSend definition</td></tr></table></div><br>Testing API</body></html>]]></Value>
                </Attributes>
                <Attributes>
                    <Name>first_name</Name> - Replaceable Attributes in Email
                    <Value>John</Value>
                </Attributes>
                <SubscriberKey>johndoe_email_key</SubscriberKey>
                <EmailAddress>johndoe@example.com</EmailAddress>
            </Subscribers>
        </Objects>
    </CreateRequest>
</soapenv:Body>
SOAP Response to Send Triggered Email to Subscriber
<soap:Body>
    <CreateResponse xmlns="http://exacttarget.com/wsdl/partnerAPI">
        <Results xsi:type="TriggeredSendCreateResult">
            <StatusCode>OK</StatusCode>
            <StatusMessage>Created TriggeredSend</StatusMessage>
            <OrdinalID>0</OrdinalID>
            <NewID>0</NewID>
        </Results>
        <RequestID>2ea4bfb7-37dd-48d2-848d-cdb11e898097</RequestID>
        <OverallStatus>OK</OverallStatus>
    </CreateResponse>
</soap:Body>

Retrieve Send Classification and Create Triggered Send Definition - Sample PHP Code

<?php
require('exacttarget_soap_client.php');
$wsdl = 'https://YOUR_SUBDOMAIN.soap.marketingcloudapis.com/etframework.wsdl';
try{
        /* Create the Soap Client */
        $client = new Marketing CloudSoapClient($wsdl, array('trace'=>1));
        /* Set username and password here */
        $client->username = '<username>';
        $client->password = '<password>';
        $sfp = new Marketing Cloud_SimpleFilterPart();
        $sfp->Property = "SendClassificationType";
        $sfp->SimpleOperator = Marketing Cloud_SimpleOperators::equals;
        $sfp->Value = array("Default Commercial");
        $rr = new Marketing Cloud_RetrieveRequest();
        $rr->ObjectType = "SendClassification";
        $rr->Filter = new SoapVar($sfp, SOAP_ENC_OBJECT, 'SimpleFilterPart', "http://exacttarget.com/wsdl/partnerAPI");
        $rr->Properties = array("ObjectID", "SendClassificationType");
        $request = new Marketing Cloud_RetrieveRequestMsg();
        $request->RetrieveRequest = $rr;
        $results = $client->Retrieve($request);
echo("<pre>");
        var_dump($results);
echo("</pre>");
        $sc = $results->Results;
        $tsd = new Marketing Cloud_TriggeredSendDefinition();
        $tsd->CustomerKey = "Created via SOAP";
       $tsd->FromAddress = "email@domain.com";
        $tsd->FromName = "From Name";
        $tsd->TriggeredSendType = "Batched";
        $tsd->TriggeredSendTypeSpecified = true;
        $tsd->TriggeredSendStatus = "New";
        $tsd->TriggeredSendStatusSpecified = true;
        $tsd->Email = new Marketing Cloud_Email();
        $tsd->Email->ID = 3081575;
        $tsd->Email->IDSpecified = true;
        $tsd->Name = $tsd->CustomerKey;
        $tsd->SendClassification = $sc;
        $object = new SoapVar($tsd, SOAP_ENC_OBJECT, 'TriggeredSendDefinition', "http://exacttarget.com/wsdl/partnerAPI");
        $request = new Marketing Cloud_CreateRequest();
        $request->Options = NULL;
        $request->Objects = array($object);
        $results = $client->Create($request);
echo("<pre>");
        var_dump($results);
echo("</pre>");
} catch (SoapFault $e) {
    echo("<pre>");
    var_dump($e);
    echo("</pre>");
}
?>