Pimcore Newsletter Tracking

Lukas [php, Tricks und Tools, Pimcore]

Pimcore hat ein einfaches integriertes Newslettertool. Dank diesem können Mailings wie die Webseite und somit wie bereits gewohnt zusammengestellt und gestaltet werden.

Eine ausführliche Dokumentation gibt es im Pimcore-Wiki unter Newslettertool. Der Newsletter benötigt natürlich ein eigenes Layout, da man in E-Mail Client weitaus weniger moderne HTML und CSS Eigenschaften verwenden kann.

Newsletter Tracking Image

Das Layout ist auch der Ort, an dem der erste Teil für ein Open-Tracking integriert werden muss. Dies geschieht mit einem Tracking-Bild, welches im Newsletter aufgerufen wird.

$nid = $this-­>document->getId();
$src = Pimcore_Tool::getHostUrl().'/?controller=newsletter&action=track&nid='.$nid.'&email=%Text(email);';
echo '<img width="0" height="0" src="'.$src.'" />';

Dieser Code ruft die track action auf dem newsletter Controller auf. Als Parameter kommt die ID des Dokumentes, welches in dem Fall ein Document_Email ist, sowie die E-Mailadresse.

Tracking Datenbank

Um die Öffnungen der E-Mails zu speichern, erstellen wir ein Objekt, welches die nötigen Informationen beinhaltet. Das benötigt nur wenige Informationen, nämlich ein Zeitstempfel, das Dokument sowie das CRM Objekt des Empfängers. Das Objekt zum Import kann hier heruntergeladen werden:

class_newslettertracking_export.json

Tracking Action

Die Tracking Action erstellt anhand der mitgegebenen Parametern ein Objekt in der Tracking Datenbank und gibt am Ende ein leeres Gif zurück, damit kein Fehler wegen eines fehlerhaften Bildes sichtbar ist.

public function trackAction() {
    $this->disableLayout();

    //Suche Empfänger anhand E-Mail
    try {
        $newsletterusers = Object_Empfaenger::getByEmail($this->getParam("email"));
    } catch (Exception $e) {
    }
       
    if ($newsletterusers instanceof Object_Empfaenger_List && $newsletterusers->count() > 0) {

        $newsletteruser = $newsletterusers->current();

        if ($newsletteruser instanceof Object_Empfaenger);

        //Lade Dokument
        $newsletterdocument = Document_Email::getById($this->getParam("nid"));

        $date = time();

        //ID fürs Objekt generierten
        $key = $newsletteruser->getId()."-".$newsletterdocument->getId()."-".$date;

        $folder = Object_Folder::getByPath("/newslettertracking/");

        //Erstelle Objekt
        $track = new Object_Newslettertracking();
        $track->setDatetime(new Zend_Date($date));
        $track->setNewsletterdocument($newsletterdocument);
        $track->setNewsletteruser($newsletteruser);
        $track->setKey($key);
        $track->setParent($folder);
        $track->setPath($folder->getFullPath()."/".$key);
        $track->setPublished(true);

        try {
            $track->save();

        } catch (Exception $e) {
            Logger::error("cannot save newsletter tracking");
        }
    } else {
        Logger::error("user by email not found: ".$this->getParam("email"));
    }

    //Leeres GIF Bild zurgeben
    header('Content-Type: image/gif');
    echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
    die();
}

Auswertung

Mit den gesammelten Daten kann nun eine Auswertung erstellt werden. Dies kann ganz einfach mit den Custom Reports von Pimcore erstellt werden.

Die erste Auswertung listet alle Trackings sortiert nach Datum auf:

SELECT DATE_FORMAT(FROM_UNIXTIME(tracking.datetime), '%d.%m.%Y %H:%i') AS datum,
       empfaenger.email,
       doc.key AS newsletter
FROM object_3 tracking
JOIN object_2 AS empfaenger ON empfaenger.oo_id = tracking.newsletteruser__id
JOIN documents AS doc ON doc.id = tracking.newsletterdocument__id
ORDER BY tracking.datetime DESC

Der zweite Report zeigt eine Summe der Trackings pro Tag und E-Mail:

SELECT DATE_FORMAT(FROM_UNIXTIME(tracking.datetime), '%d.%m.%Y') AS datum,
       doc.key AS newsletter,
       COUNT(id) AS anzahl
FROM object_3 tracking
JOIN documents AS doc ON doc.id = tracking.newsletterdocument__id
WHERE doc.key != "confirmation"
GROUP BY doc.key,
         DATE_FORMAT(FROM_UNIXTIME(tracking.datetime), '%d.%m.%Y')
ORDER BY tracking.datetime DESC, doc.key DESC<

Der dritte Report zeigt die totale Anzahl Trackings pro E-Mail und zählt dabei jeden Empfänger nur einmal auf, auch wenn er mehrere Trackings erstellt wurden. Dazu wird noch die Öffnungsrate in Prozent berechnet und angezeigt.

SELECT newsletter, COUNT(anzahl) as open,
       (SELECT COUNT(documentId) FROM email_log WHERE documentId = tbl.id) AS empfaenger,
       FORMAT ((100/(SELECT COUNT(documentId) FROM email_log WHERE documentId = tbl.id) )*COUNT(anzahl), 2) AS prozent

FROM (
  SELECT doc.id, doc.key AS newsletter, COUNT(id) AS anzahl
  FROM  object_3 tracking
  JOIN documents AS doc ON doc.id = tracking.newsletterdocument__id

  WHERE doc.key != "confirmation"
  GROUP BY doc.id, doc.key, tracking.newsletteruser__id
  ORDER BY doc.key DESC
) as tbl
GROUP BY newsletter

Ergebnis im Backend

Und so sieht diese Auswertung dann am Ende aus:

Mit dieser Auswertung in Kombination mit den Google Analytics Trackings wie oft welcher Link angeklickt wurde, hat man nun wichtige Informationen über das Mailing gesammelt, um zukünftige Newsletter weiter auf zu werten.

zurück