Building Apps for the ExactTarget Marketing Cloud

Post on 17-Jul-2015

89 views 0 download

Tags:

Transcript of Building Apps for the ExactTarget Marketing Cloud

Building Apps for the ExactTarget

Marketing Cloud

Ian Murdock, ExactTarget, VP Platform

@imurdock

Safe harborSafe harbor statement under the Private Securities Litigation Reform Act of 1995:

This presentation may contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such uncertainties

materialize or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ materially from the results

expressed or implied by the forward-looking statements we make. All statements other than statements of historical fact could be

deemed forward-looking, including any projections of product or service availability, subscriber growth, earnings, revenues, or other

financial items and any statements regarding strategies or plans of management for future operations, statements of belief, any

statements concerning new, planned, or upgraded services or technology developments and customer contracts or use of our services.

The risks and uncertainties referred to above include – but are not limited to – risks associated with developing and delivering new

functionality for our service, new products and services, our new business model, our past operating losses, possible fluctuations in our

operating results and rate of growth, interruptions or delays in our Web hosting, breach of our security measures, the outcome of any

litigation, risks associated with completed and any possible mergers and acquisitions, the immature market in which we operate, our

relatively limited operating history, our ability to expand, retain, and motivate our employees and manage our growth, new releases of our

service and successful customer deployment, our limited history reselling non-salesforce.com products, and utilization and selling to

larger enterprise customers. Further information on potential factors that could affect the financial results of salesforce.com, inc. is

included in our annual report on Form 10-K for the most recent fiscal year and in our quarterly report on Form 10-Q for the most recent

fiscal quarter. These documents and others containing important disclosures are available on the SEC Filings section of the Investor

Information section of our Web site.

Any unreleased services or features referenced in this or other presentations, press releases or public statements are not currently

available and may not be delivered on time or at all. Customers who purchase our services should make the purchase decisions

based upon features that are currently available. Salesforce.com, inc. assumes no obligation and does not intend to update these

forward-looking statements.

Code@ExactTarget

http://code.exacttarget.com

Dreamforce Developer Edition

http://code.exacttarget.com/hackathon-dreamforce

The ExactTarget Marketing Cloud

The ExactTarget Marketing Cloud

Data drives relevancy

Relevancy drives engagement

Decade in the platform business

Decade in the platform business

Integration Automation

Decade in the platform business

Decade in the platform business

Integration Automation Applications

Marketing Cloud Apps

Marketing Cloud Apps

Demo

Marketing Cloud Apps

• Marketing Cloud apps are

Web apps that use

ExactTarget Fuel and

integrate with the Marketing

Cloud via an iframe

with single sign-on (SSO)

Marketing Cloud Apps

• Marketing Cloud apps are

Web apps that use

ExactTarget Fuel and

integrate with the Marketing

Cloud via an iframe

with single sign-on (SSO)

App Center

App Center

App Center

App Center

App Center

App Center

App Center

App Center

ExactTarget Marketing Cloud

Single sign-on (SSO){

"exp": 1366605874,

"iss": "https://imh.exacttarget.com",

"request":

{

"claimsVersion": 1,

"user":

{

"id": 10083350,

"oauthToken": "w35ch4cxkrb2kqd33ujq2dde",

"internalOauthToken": "0bUh1dFrbTcU1MXj7VvrAbc3w1365Hecw6qSgL0caJzOjHepT9XHSEllucoDBAdNW",

"refreshToken": "2e33rrhev847jg97zt2zx333",

"expiresIn": 3600,

"email": "jmeketa@exacttarget.com",

"culture": "en-US",

"timezone”:

ExactTarget Fuel

APIs

APIs

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Header>

<oAuth xmlns="http://exacttarget.com">

<oAuthToken>

ekg8tv73ypw58fsexhg57dvu

</oAuthToken>

</oAuth>

</soap:Header>

<soap:Body>

<RetrieveRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI" xmlns:ns2=

<RetrieveRequest>

<ObjectType>List</ObjectType>

<Properties>ListName</Properties>

<Properties>Description</Properties>

<Properties>Category</Properties>

<Properties>ListClassification</Properties>

APIs

POST https://www.exacttargetapis.com/address/v1/validateEmail?

access_token=ekg8tv73ypw58fsexhg57dvu

{

"email": "iamaspamtrap@spam.com",

"validators": [

"SyntaxValidator",

"GlobalUnsubValidator",

"ListDetectiveValidator"

]

}

HTTP/1.1 200 OK

{

"email": "iamaspamtrap@spam.com",

"valid": false,

"failedValidation": "ListDetectiveValidator"

}

ExactTarget Fuel objects mapped to Force.com

objects

ExactTarget Fuel Force.com

Lists CRM Campaigns or Reports

Data Extensions Custom Objects

Contacts (Subscribers) CRM Contacts

List Subscription CRM CampaignMembers

Data Extension Fields /

Subscriber Attributes

Object Fields

Data Extension Keys Relationships

Marketing Events CRM Contact Activities

SDKs

public class PrintAllLists {

public static void main(String[] args)

throws ETSdkException

{

ETClient client = new ETClient(CREDENTIALS);

List<ETList> lists = client.getLists();

for (ETList list : lists) {

System.out.println(list.getName());

}

}

}

SDKs vs. APIs

public class PrintAllLists {

public static void main(String args[]) {

PartnerAPI service = new PartnerAPI();

soap = service.getSoap();

Client client = ClientProxy.getClient(soap);

Endpoint endpoint = client.getEndpoint();

Map<String, Object> outProperties = new HashMap<String, Object>();

outProperties.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);

outProperties.put(WSHandlerConstants.USER, username);

PasswordCallbackHandler callback = new PasswordCallbackHandler();

callback.setPassword(password);

outProperties.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

outProperties.put(WSHandlerConstants.PW_CALLBACK_REF, callback);

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProperties);

endpoint.getOutInterceptors().add(wssOut);

endpoint.getOutInterceptors().add(new SAAJOutInterceptor());

endpoint.getInInterceptors().add(new LoggingInInterceptor());

endpoint.getOutInterceptors().add(new LoggingOutInterceptor());

RetrieveRequest retrieveRequest = new RetrieveRequest();

retrieveRequest.setObjectType("List");

retrieveRequest.getProperties().add("ListName");

RetrieveRequestMsg retrieveRequestMsg = new RetrieveRequestMsg();

retrieveRequestMsg.setRetrieveRequest(retrieveRequest);

RetrieveResponseMsg retrieveResponseMsg = soap.retrieve(retrieveRequestMsg);

for (APIObject apiObject : retrieveResponseMsg.getResults()) {

List l = (List) apiObject;

System.out.println(l.getListName());

}

}

}

Fuel UX

Fuel UX: Controls

Fuel UX: Controls

Fuel UX: Components

Fuel UX

<!DOCTYPE html>

<html class="fuelux">

<head>

<link href="http://fuelcdn.com/fuelux/2.4.0/css/fuelux.css" rel="stylesheet" ty

<link href="http:///fuelcdn.com/fuelux/2.4.0/css/fuelux-responsive.css" rel="st

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" t

<script src="http://fuelcdn.com/fuelux/2.4.0/loader.min.js" type="text/javascri

</head>

<body style="padding: 20px;">

<div id="MySearch" class="input-append search">

<input type="text" class="input-medium" placeholder="Search">

<button class="btn">

<i class="icon-search"></i>

</button>

</div>

</body>

</html>

Fuel UX: Declarative

<!DOCTYPE html>

<html class="fuelux">

<head>

<link href="http://fuelcdn.com/fuelux/2.4.0/css/fuelux.css" rel="stylesheet" ty

<link href="http:///fuelcdn.com/fuelux/2.4.0/css/fuelux-responsive.css" rel="st

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" t

<script src="http://fuelcdn.com/fuelux/2.4.0/loader.min.js" type="text/javascri

</head>

<body style="padding: 20px;">

<div id="MySearch" class="input-append search">

<input type="text" class="input-medium" placeholder="Search">

<button class="btn">

<i class="icon-search"></i>

</button>

</div>

</body>

</html>

Fuel UX: Programmatic

<!DOCTYPE html>

<html class="fuelux">

<head>

[...]

<script>

$(function () {

$('#MySearch').on('searched', function (e, searchText) {

processSearch(searchText);

}).on('cleared', function () {

clearSearchResults();

});

});

</script>

</head>

<body style="padding: 20px;">

<div id="MySearch" class="input-append search">

<input type="text" class="input-medium" placeholder="Search">

<button class="btn">

<i class="icon-search"></i>

HubExchange

Learn more…

Ian Murdock

VP Platform,

@imurdock