Building Apps for the ExactTarget Marketing Cloud
-
Upload
salesforce-developers -
Category
Technology
-
view
89 -
download
0
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": "[email protected]",
"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": "[email protected]",
"validators": [
"SyntaxValidator",
"GlobalUnsubValidator",
"ListDetectiveValidator"
]
}
HTTP/1.1 200 OK
{
"email": "[email protected]",
"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