Kampagnen verwalten
Empfängerlistenformat und Personalisierung
Um das Empfängerlistenformat zu definieren, wenden Sie sich an die Kundenbetreuung Die Spalten enthalten die Informationen, die an Optimizely Campaign übertragen werden.
Die Empfängerliste muss alle gewünschten Personalisierungsinformationen enthalten. Möchten Sie beispielsweise Informationen aus dem CRM für Empfehlungen verwenden, müssen Sie diese auch in der Empfängerliste hinterlegen. Möchten Sie eine personalisierte Gruß- beziehungsweise Schlussformel verwenden (der Sales-Owner eines Kontakts erscheint als Ansprechpartner in der Grußformel), müssen die entsprechenden Felder des Sales-Owners mit übertragen werden.
Ebenso können Sie die Response-Daten mit Empfängerlistenfeldern anreichern. Dies erleichtert die Zuordnung von Ereignissen im CRM-System, wie eine Öffnung oder ein Klick. Sehen Sie in der Empfängerliste beispielsweise zwei Felder für die eindeutigen Bezeichner Ihrer Entitäten vor, können diese in den Response-Daten zurück übertragen werden.
Beispiel: Ein Kontakt hat eine eindeutige ID <contact-id> und darüber hinaus hat jede Kampagne einen eindeutigen Bezeichner <campaign-id>. Diese beiden Felder werden der Empfängerliste hinzugefügt und die Entitäten an Optimizely Campaign übertragen. Klickt der Empfänger auf einen Link in der versendeten E-Mail, erhalten Sie das Ereignis mit der zugehörigen <contact-id> und <campaign-id> zurück. So können Sie Ereignisse einfach einem Kontakt oder einer Kampagnenreaktion zuordnen.
Die angezeigten Felder sind vom CRM-System abhängig. Übliche Felder zur Identifikation: <contact-id>, <lead-id>, <campaign-id>, <campaign-member-id>, <member-id> oder <list-id> sein.
Protokolle und Rückmeldungen
Um Daten zu übertragen, können Sie die Protokolle SFTP und SOAP verwenden. SOAP überträgt die Daten per XML Steht für „Extensible Markup Language“: Ein offener internationaler Standard für die Strukturierung und Übertragung von Daten zwischen Systemen.. Übertragen Sie CSV Steht für „Comma-Separated Values“. Eine Textdatei mit Tabellendaten, die durch Kommazeichen voneinander getrennt sind.-Dateien über SFTP, profitieren Sie von einer besseren Performance - vor allem bei großen Kampagnen mit mehreren hunderttausend Kampagnenmitgliedern.
Nach dem Versand einer Kampagne kann Optimizely Campaign Rückmeldungen erzeugen. Das kann eine einfache E-Mail-Benachrichtigung sein. Optimizely Campaign kann auch SOAP-Services aufrufen und somit systemisch den Verarbeitungs- und Versandstatus anzeigen.
Prozessablauf
Nach Übertragung der CSV-Datei oder von Daten über den SOAP-Service sind keine weiteren Aktionen seitens des CRM oder des Aufrufenden erforderlich. In Optimizely Campaign findet automatisch folgender Prozess statt:
- Nach erfolgreicher Übertragung der Empfängerdaten werden diese automatisch in eine Empfängerliste geladen. Die hierfür genutzten Empfängerlisten unterliegen der Kontrolle des Closed-Loop-Services und verfügen über das Präfix Z_CampaignUserList. Listen mit diesem Präfix werden automatisch angelegt und verwaltet. Diese speziellen Listen dürfen nicht anderweitig verwendet werden, weder über Schnittstellen noch im Frontend von Optimizely Campaign. Diese Listen dürfen weder verwendet, befüllt noch über sonst eine Methode der Optimizely Campaign API Steht für „Application Programming Interface“, auch Programmierschnittstelle. Die API gibt an, wie Softwarekomponenten miteinander interagieren sollen, z. B. wenn auf Datenbanken oder Computerhardware zugegriffen wird. Sie vereinfacht außerdem die Programmierung von grafischen Benutzeroberflächen. APIs haben oft die Form von Bibliotheken mit Angaben zu Routinen, Datenstrukturen, Objektklassen und Variablen. angesprochen werden.
- Nach dem vollständigen Import der Empfängerdaten wird das angegebene Mailing automatisch kopiert. Starten Sie aus dem CRM-System heraus über den Closed-Loop-Service eine Kampagne, finden Sie also auch ein versendetes Mailing in der Mailing-Übersicht.
- Nach Versand des Mailings werden Ereignisse aufgezeichnet, aufbereitet und zur Verfügung gestellt. Hierzu zählen beispielsweise Öffnungen, Klicks, Bounces und Abbestellungen. Bounces und Unsubscribes sind unmittelbar mit einer E-Mail-Adresse verknüpft und sollten an den zugehörigen Entitäten im CRM gespeichert werden. Beispielsweise ergibt es keinen Sinn, weiterhin Nachrichten an eine E-Mail-Adresse zu versenden, die ausgebounced ist. Erfolgt eine Abbestellung (Unsubscribe), muss diese an dem zugehörigen Kontakt beziehungsweise Lead und ggf. an einem Werbeeinverständnis gespeichert werden.
Empfängerlisten entsprechen Datenbank-Tabellen. Diese werden in der Regel nach Ihren Anforderungen individuell erstellt nach den von der Kundenbetreuung festgelegten Formatvorgaben. Das vereinbarte Format ist statisch und kann ohne Rücksprache mit der Kundenbetreuung nicht verändert werden.
broadmail_ID-Parameter
Die broadmail_ID bezeichnet stets ein Mailing. An dem Mailing wird auch der Werbekanal (E-Mail, SMS
Beispiel: Der nachfolgende Code-Block zeigt eine einfache Beispiel-Implementierung, wie eine Kampagne mit zwei Empfängern über die SOAP-Services von Optimizely Campaign gestartet werden kann. Die umgebende Klasse stellt die notwendigen Member-Variablen zur Verfügung, beispielsweise stellt das Objekt closedLoopWebservice die in der SOAP-API dokumentierten Methoden zur Verfügung.
/**
* Use case: Initialise and start campaign
* The following class is an implementation on how to start a campaign
* via Closed Loop Webservice.
*/
private class ImportRecipientsAndStartCampaign extends UseCase {
@Override
void runExceptional() throws Exception {
// create a waveId, fix the template mailing
_waveId = _closedLoopWebservice.prepareNewWave(
_session.getSessionId(), TEMPLATE_CAMPAIGN_ID);
// The recipient field names can be different for every client
// and are defined once during the configuration process in
// optivo broadmail. Within the example code we used
// recipientFieldNames are for demo purposes with most common
// used fields.
String[] recipientFieldNames =
{ "salutation"
, "firstname"
, "lastname"
, "title"
, "birthday"
, "mobile"
, "email"
, "street"
, "zipcode"
, "city"
, "state"
, "country"
, "extentityid"
, "extcampaignid"};
String[][] recipientFieldValues =
{
{ "Mr."
, "John"
, "Doe"
, "Phd"
, "17.2.1956"
, "0049307680780"
, "[email protected]"
, "Wallstrasse 16"
, "10179"
, "Berlin"
, "Berlin"
, "Germany"
, "SAP-321XWZ654987"
, "SAP-987ABG654223"
}
, { "Mrs."
, "Jane"
, "Doe"
, "Phd"
, "17.2.1952"
, "0049307680780"
, "004930768078199"
, "[email protected]"
, "Wallstrasse 16"
, "10179"
, "Berlin"
, "Berlin"
, "Germany"
, "SAP-321XWZ654988"
, "SAP-987ABG654223" } };
_closedLoopWebservice.importRecipients(
_session.getSessionId()
, _waveId
, recipientFieldNames
, recipientFieldValues);
// initialise the point in time the campaign will start to
// generate response data
_since = _closedLoopWebservice.getCurrentTime(
_session.getSessionId());
_closedLoopWebservice.importFinishedAndScheduleMailing(
_session.getSessionId(), _waveId);
}
}
Nach der Übertragung einer Kampagne können Sie den Versandstatus abfragen. Die folgende Klasse zeigt, welche Methode Sie hierzu aufrufen müssen.
/**
* Use case: Receive campaign status.
* Use this code to ask campaign status from Optimizely Campaign. This
* makes sense after calling the use case "Initialise and start campaign"
*/
private class DetermineCampaignStatus extends UseCase {
@Override
void runExceptional() throws Exception {
if (_waveId <= 0) {
throw new IllegalStateException("waveId not positive.");
}
// Since the campaign is copied before it is started, we
// have to translate the wave id to the campaign id that
// was actually sent ...
long campaignId;
do {
campaignId = _closedLoopWebservice.getMailingIdByWaveId(
_session.getSessionId(), _waveId);
if (campaignId <= 0) {
sleepOneMinute();
}
} while (campaignId <= 0);
// customise this to your needs. After a campaign switched to
// status SENT, the status will be immutable
while (true) {
String campaignStatus = _mailingWebservice.getStatus(
_session.getSessionId(), campaignId);
if ("DONE".equals(campaignStatus)) {
break;
}
if ("PAUSED".equals(campaignStatus) || "CANCELED".equals(
campaignStatus))
{
throw new RuntimeException(
"Campaign is " + campaignStatus);
}
String campaignName = _mailingWebservice.getName(
_session.getSessionId(), campaignId);
// Log status for messages of campaign too.
long[] messageIds =
_splitMailingWebservice.getSplitChildIds(
_session.getSessionId(), campaignId);
for (long messageId : messageIds) {
String messageStatus = _mailingWebservice.getStatus(
_session.getSessionId(), campaignId);
String messageName = _mailingWebservice.getName(
_session.getSessionId(), messageId);
}
sleepOneMinute();
}
}
private void sleepOneMinute() throws InterruptedException {
Thread.sleep(TimeUnit.MINUTES.toMillis(1));
}
}
Sie können Ihrem Campaign-Manager auch die verfügbaren Vorlagen anzeigen. Das nachfolgende Beispiel zeigt eine Abfrage für die Smart Campaigns Triggered Messages: Eine Sitzung ist eine Abfolge von Aktivitäten desselben Besuchers einer Webseite in einer begrenzten Zeit. Eine Sitzung endet, wenn für eine bestimmte Zeitspanne keine Aktivität erfolgt. Wenn Besucher eine Webseite erneut besuchen, nachdem die vorhergehende Sitzung abgelaufen ist, wird eine neue Sitzung gestartet..
/**
* Use case: Read available campaigns for closed loop scenario
* This is a usability method. You can show available Smart Campaigns
* to your campaign manager. Scenario for smart campaigns only.
*/
private class GetCampaignData extends UseCase {
@Override
void runExceptional() throws Exception {
String campaignType = "regular";
String campaignStatus = "ACTIVATION_REQUIRED";
long[] campaignIds = _mailingWebservice.getIdsInStatus(
_session.getSessionId(), campaignType, campaignStatus);
for (long campaignId : campaignIds) {
String campaignName = _mailingWebservice.getName(
_session.getSessionId(), campaignId);
String description = _mailingWebservice.getDescription(
_session.getSessionId(), campaignId);
long[] messageIds =
_splitMailingWebservice.getSplitChildIds(
_session.getSessionId(), campaignId);
for (long messageId : messageIds) {
String messageName = _mailingWebservice.getName(
_session.getSessionId(), messageId);
String messageDescription =
_mailingWebservice.getDescription(
_session.getSessionId(), messageId);
}
}
}
}
Response-Daten
Im Vollzug einer Kampagne muss die Verarbeitung der Response-Daten implementiert werden. Zu diesen Prozessen zählen die Verarbeitung von Bounces, Abbestellungen und Antworten. Sie entscheiden, ob für das Management der Abbestellungen die Funktionen von Optimizely Campaign genutzt werden, oder eigene Prozesse im CRM implementiert werden. Aufgrund der Regularien zum Thema Werbeeinverständnis und Wettbewerbsrecht ist die Verarbeitung der Abbestellungen und Antworten verpflichtend.
Abbestellung über Optimizely Campaign
Sie müssen in jeder E-Mail einen Link zur Abbestellung einfügen. Zeigt der Abbestell-Link auf die Plattform von Optimizely Campaign, dann wird der Empfänger in die Abbestellerliste in Optimizely Campaign eingetragen und erhält keine weiteren E-Mails. Die Abbestellerliste in Optimizely Campaign hat Vorrang vor weiterem Versand. Der Kunde erhält also auch keine E-Mails, falls er in einer Selektion im CRM enthalten ist und diese an Optimizely Campaign übertragen wird. Die Abbestellung kann nur durch einen erneuten Double-Opt-In Verfahren, bei dem der Empfänger vor dem Erhalt von Werbe-Mailings seine Einwilligung zum Empfang von E-Mails gibt. Der Empfänger erhält daraufhin eine E-Mail mit Double-Opt-In-Link, den er als Bestätigung klicken muss.-Prozess aufgehoben werden.
Hat ein Empfänger über die Prozesse von Optimizely Campaign abbestellt, wird die Abbestellung über die Closed-Loop-Schnittstelle an das CRM zurückgeliefert. Das CRM-System muss die so erhaltenen Abbestellungen verarbeiten und bei den zugehörigen Entitäten hinterlegen. In den übertragenen Selektionen dürfen keine Empfänger enthalten sein, die wirksam ihr Werbeeinverständnis widerrufen haben.
Erfolgt eine Abbestellung über einen anderen Weg, beispielsweise über ein Kundencenter in einem Shop-System, müssen diese Abbestellungen nicht zwingend an Optimizely Campaign übermittelt werden, sofern die Abbestellungen wirksam im referenziell führenden System hinterlegt sind. Es muss in jedem Falle sichergestellt sein, dass wirksame Abbestellungen nicht in Selektionen und Kampagnen enthalten sind, die an Optimizely Campaign übertragen werden.
Abbestellung über Drittsysteme
Verwenden Sie eigene Abbestell-Links, erhält Optimizely Campaign keine Informationen über die Abbestellungen. Eine Weiterleitung ist nicht möglich. In diesem Fall liegt die systemische Verantwortung für die korrekte Handhabung von Werbeeinverständnissen vollständig im CRM.
Antwort-E-Mails
Der Kunde kann auf E-Mails antworten und weitere Wünsche wie eine Abbestellung äußern. Entweder werden diese Rückläufer in der Benutzeroberfläche von Optimizely Campaign bearbeitet oder in Optimizely Campaign wird eine Weiterleitung auf ein Postfach Ihrer Wahl eingerichtet.
Datenformate
Sie können jedes Feld in der Empfängerliste über die Closed-Loop-Schnittstelle oder die HTTP-API befüllen. Das Datenformat in den übertragenen Dateien kann, abhängig von der Konfiguration der Closed-Loop-Schnittstelle, auf Felder in der Empfängerliste gemappt werden. Somit entspricht das Format der Empfängerliste nicht zwingend demjenigen, das die Closed-Loop-Schnittstelle erwartet. Die exakten Datenformate müssen Sie mit der Kundenbetreuung abstimmen.
Die HTTP-API hingegen kann Felder in der Empfängerliste direkt befüllen. Hier müssen die Namen der HTTP-Parameter direkt mit den in der Empfängerliste genannten Namen übereinstimmen. Siehe HTTP-API.
Event-E-Mails
Event-E-Mails sind typischerweise E-Mails, die von einem bestimmten Ereignis ausgelöst werden. Dieses Ereignis kann beispielsweise eine Registrierung, eine Bestellung oder ein Abbruch einer Bestellung sein. Diese Form von E-Mails kann ideal über die HTTP-API verschickt werden. Sie können hier eine dezidierte Empfängerliste hinterlegen, die für den Versand dieser Spezial-Mailings geeignet ist. Anschließend können Sie beliebige Mailings mit dieser Empfängerliste verknüpfen und ereignisbasierte E-Mails einzeln versenden. Diese Art der Integration eignet sich auch für mehrstufige Kampagnen in Marketing Automation, die auf der Basis von Ereignissen und Zeitpunkten ausgelöst werden.
Beispiel-Implementierung
Folgender Code-Block zeigt eine Beispiel-Implementierung, wie die Response-Daten abgerufen werden können.
/**
* Use case: Get response data
* This use case shows how to receive and process reponse data.
* Response data are fetched within a certain interval, usually
* 1-4 h, and processed according to your system needs.
*/
private class GetResponseData extends UseCase {
@Override
void runExceptional() throws Exception {
long until = _closedLoopWebservice.getCurrentTime(
_session.getSessionId());
int numberOfRows = 1000;
int startRow = 0;
String[][] recipients;
do {
recipients = _closedLoopWebservice.getRecipients(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(recipients);
startRow += numberOfRows;
} while (recipients.length >= numberOfRows);
startRow = 0;
String[][] clicks;
do {
clicks = _closedLoopWebservice.getClicks(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(clicks);
startRow += numberOfRows;
} while (clicks.length >= numberOfRows);
startRow = 0;
String[][] opens;
do {
opens = _closedLoopWebservice.getOpens(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(opens);
startRow += numberOfRows;
} while (opens.length >= numberOfRows);
startRow = 0;
String[][] links;
do {
links = _closedLoopWebservice.getLinks(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(links);
startRow += numberOfRows;
} while (links.length >= numberOfRows);
startRow = 0;
String[][] responses;
do {
responses = _closedLoopWebservice.getResponses(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(responses);
startRow += numberOfRows;
} while (responses.length >= numberOfRows);
startRow = 0;
String[][] unsubscribes;
do {
unsubscribes = _closedLoopWebservice.getUnsubscribes(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(unsubscribes);
startRow += numberOfRows;
} while (unsubscribes.length >= numberOfRows);
startRow = 0;
String[][] mailingUnsubscribes;
do {
mailingUnsubscribes =
_closedLoopWebservice.getMailingUnsubscribes(
_session.getSessionId(),
_since, until, startRow, numberOfRows);
processData(mailingUnsubscribes);
startRow += numberOfRows;
} while (mailingUnsubscribes.length >= numberOfRows);
_since = until;
}
// customize this method according to your needs. This
// includes creating campign reactions or upsert subscription-
// or bounce status to your entities.
private void processData(String[][] values) {
if (values.length == 0) {
// process no values here
} else {
for (String[] click : values) {
// process your business logic/campaign reactions here
}
}
}
}
Der nachfolgende Code zeigt, wie Sie den Bounce-Status eines Empfängers wieder zurücksetzen können.
/**
* Use case: Reset bounce status
* This is an example of how to reset the bounce status
* of a recipient.
*/
private class ResetBounceStatus extends UseCase {
@Override
void runExceptional() throws Exception {
resetBounceCounter(EMAIL_ADDRESS);
}
private void resetBounceCounter(String emailAdress)
throws WebserviceException {
_responseWebservice.resetBounceCounter(
_session.getSessionId(), emailAdress);
}
}