Mit welcher Analogie lässt sich Unternehmenskultur am besten beschreiben? Diese Frage stellt Mark Poppenborg auf dem Blog von intrinsify.me und hat damit einen spannenden Austausch zum Thema “Was ist Unternehmenskultur?” angestoßen. Er schickt selbst drei Beispiele für Analogien inklusive Stärken und Schwächen ins Rennen und bittet um weitere Vorschläge.
comspace von der Straße aus betrachtet. (c) Veit Mette
Bei comspace fanden wir die Frage nach einer eingängigen Veranschaulichung von Unternehmenskultur sofort spannend. Darum haben wir – unsere Feelgood Managerin Sarah Jansohn und ich – uns direkt an die Arbeit für diesen Artikel als Antwort auf die intrinsify.me-Frage gemacht.
Unternehmenskultur als Straßenverkehr(snetz)
Zugegeben, das klingt erstmal ziemlich technisch und wenig spektakulär. Und tatsächlich haben wir anfangs in der gemeinsamen Diskussion einige Zweifel gespürt oder müdes Gähnen geerntet. 😉 Aber wir finden: Diese Analogie hat es in sich! Denn:
Das Verkehrsnetz in einer gewissen Region oder einem Land entspricht in unserer Analogie einem Unternehmen. Der Straßenverkehr hat immer gewisse Rahmenbedingungen: Das Straßennetz, offizielle Verkehrsregeln und ungeschriebene Regeln. Im Unternehmen sind das z.B. der physische Standort, die Büroausstattung und arbeitsvertragliche Regelungen, an die sich jeder Mitarbeiter halten muss. So wie sich das Straßennetz von Land zu Land unterscheidet (und in Teilen doch ähnlich ist), unterscheiden sich auch Unternehmen in einigen ihrer Rahmenbedingungen voneinander.
Das wichtigste in unserer Analogie sind aber die Menschen in den Autos. Denn der Verkehr entsteht erst durch die Teilnehmer, so wie die Unternehmenskultur durch die Mitarbeiter_innen im Unternehmen entsteht, die sich innerhalb der Rahmenbedingungen bewegen.
Weitere Merkmale der Analogie
Die Straßenlandschaft sowie das Unternehmen bilden ein Netzwerk aus vorgegebenen Rahmenbedingungen ab, die relativ(!) stabil sind. Mit der individuellen Nutzung dieser Rahmenbedingungen manifestieren oder verändern sich die Vernetzungen.
Um teilhaben zu können, braucht es ein Aufnahmeritual. Beim Straßenverkehr ist das die Fahrprüfung; im Unternehmen der Einstellungsprozess.
Jeder Verkehrsteilnehmer hat ein eigenes Auto, ein individuelles Ziel und einen persönlichen Fahrstil. Im Unternehmen trägt jeder Mitarbeiter mit seinen Zielen, Kompetenzen und konkretem Verhalten zur Unternehmenskultur bei.
Wer eine Auffahrt nutzt oder das Straßennetz verlässt (temporär oder final) verändert den Verkehrsfluss; Zu- und Abgänge von Mitarbeitern im Unternehmen verändern die Unternehmenskultur.
Es gibt viel und wenig befahrene Straßen, Autobahnen und Feldwege. Unternehmenskultur kann bestimmte Werkzeuge und Methoden bedeuten, die von vielen oder wenigen benutzt werden. Bei comspace z.B. Projektmanagement-Methoden, die je nach Kunde und Team variieren oder nach speziellem Bedarf eingesetzte Linux-Betriebssysteme
Wenn es zu viel Verkehr / Gleichförmigkeit gibt, kommt es zu Stau oder unharmonischer Unternehmenskultur.
Wenn alle Verkehrsteilnehmer/Mitarbeiter unterschiedlich genug sind (Fahrzeug, Fahrstil, Geschwindigkeit) und jeder Rücksicht nimmt, ist alles im Fluss – und man braucht nicht mal viele Regelungen dafür. 😉 Diversität macht ein System stabiler und resilienter!
Störungen durch Personen, der Infrastruktur oder Umweltbedingungen können berücksichtigt werden: Falschfahrer und Verkehrsbehinderer (personenbezogen), Straßensperrung oder Geschwindigkeitsbegrenzung (Unternehmensvorgaben), schlechte Witterungsbedingungen (Krisen).
Stärken unserer Analogie
Anschaulich
Alltagsnah
Entsteht und verändert sich durch aktives benutzen durch die Teilnehmer (jeder gestaltet – bewusst oder unbewusst – durch sein Verhalten und auch das, was er NICHT tut, die Unternehmenskultur). Unternehmenskultur ist durch objektive Rahmenbedingungen geprägt, entsteht aber durch jeden Einzelnen und verändert sich auch ständig.
Schwächen der Analogie
Andere Verkehrsteilnehmern als Autofahrer sind nicht berücksichtigt. Was ist mit Fahrradfahrern und Fußgängern? Die Analogie müsste erweitert werden, wird dann aber zu kompliziert.
tl;dr und Fazit:
Mit dem Führerschein erhält man die Erlaubnis am Straßenverkehr teilzunehmen. Mit der Einstellung erhält man die Möglichkeit an einer Unternehmenskultur teilzunehmen. Dabei gibt es klar niedergeschriebene Regeln, ungeschriebene Regeln und Freiraum zur individuellen Gestaltung und Nutzung. In beiden Fällen lernen die Teilnehmer_innen erst mit der aktiven Teilnahme und Nutzung wie die Kultur funktioniert. Nur wenn Kultur gelebt und über sie kommuniziert wird, entwickelt sie sich weiter.
Vertiefung des Themas
Kultur-Systeme haben eine wichtige Funktion: Durch ihre objektiven Rahmenbedingungen und (un)geschriebenen Verhaltensregeln konstituieren sie Routinen, die Entscheidungen erleichtern und beschleunigen. So wie Rechtssysteme oder religiöse Systeme wie die Zehn Gebote uns die Entscheidung abnehmen, ob Stehlen eine gute Idee ist oder nicht, helfen uns Ampeln im Straßenverkehr schnell zu entscheiden, dass man bei rot sicherheitshalber stehen bleibt und erst bei grün geht. Eine unterscheidbare und authentisch kommunizierte Unternehmenskultur gibt eine ähnliche Hilfestellung, um das Zusammenarbeiten zu vereinfachen, persönliche Unsicherheiten zu minimieren und manche Entscheidungen auf Autopilot zu stellen.
Natürlich gibt es vergleichbare Mechanismen auch in anderen Bereichen des Lebens. Die Uni Paderborn hat dazu einige interessante Arbeiten unter dem Oberbegriff Automatismen veröffentlicht. In diesem Zusammenhang sind wir auf dieses wunderbare Zeitraffer-Video von nordamerikanischen Flugrouten gestoßen – ein Verkehrsnetz mit einer ganz eigenen Kultur:
Der Wettbewerb um die passendste Analogie ist mittlerweile beendet und die Gewinnerin ist Simone Gilau mit ihrem Vorschlag „Unternehmenskultur ist wie ein Garten„. Uns gefällt diese Analogie ebenfalls sehr gut, da sie einen kreativen und komplexen Entwicklungsprozess beschreibt, der Diversität würdigt und die Wichtigkeit von kontinuierlichem „Kümmern“ zur Erhaltung und Weiterentwicklung der Unternehmenskultur voraussetzt.
Konferenzen, Barcamps und Kongresse sind für uns Pflichtprogramm und wichtige Werkzeuge mit denen sich unsere Entwickler_innen, Projekt- und Account-Manager_innen, HR-Leute, der IT-Service oder Online-Marketers weiterbilden, vernetzen und Know-how austauschen.
Workshops, Seminare und Weiterbildungen nehmen wir einerseits selber zur Weiterentwicklung in Anspruch und führen sie andererseits auch als Anbieter für und mit unseren Kunden durch.
Warum sollte man eine solche Veranstaltung besuchen?
Die bunte Mischung an Teilnehmern führt zu einem gegenseitigem und offenen Erfahrungsaustausch. So entsteht neues Wissen, es wird erweitert, veredelt und natürlich an andere vermittelt. So können wir beispielsweise:
die Erfahrungen von anderen nutzen, um uns vor Fehlern zu bewahren
erfolgreiche Projekte und Maßnahmen aus anderen Branchen mitnehmen, die gute Ideen für die eigene Arbeit liefern können
altbewährte Vorgehensweisen zu neuen Inspirationen kombinieren, aus denen innovative Lösungen entstehen
Aus der Welt der Web-Entwicklung und des Online Marketings sind uns diese Effekte mehr als bewusst. Daher freuen wir uns besonders, im Februar ein bisschen von unserem Know-how und unsere Räumlichkeiten für das HR Inspiration Camp in die Waagschale zu werfen und gemeinsam mit Ihnen als Teilnehmer und den anderen HRIC Teammitgliedern (Girls4IT, Die Talentwerker, Trendbrause, Viacon) über den Tellerrand der modernen Personalarbeit zu schauen.
Was hat comspace mit dem Thema HR und Personal zu tun?
Wer unser Blog regelmäßig verfolgt wird feststellen, dass uns die Themen Human Relations, Employer Branding und Zukunft der Arbeit genauso wichtig sind, wie unsere Haupttätigkeiten rund um Enterprise CMS, Webentwicklung, Projektmanagement und Online Marketing. Daher war es für uns nur logisch, “Hier!” zu rufen und unsere Hände samt Computermäusen zu heben, als aus den verschiedenen Augenhöhe Film-Vorführungen die Idee entstand, in Ostwestfalen eine Veranstaltung zum Thema Human Relations zu schaffen. Unternehmens-Führungen, Personalverantwortliche und Interessierte an zukunftsfähigen Arbeitsmodellen sollen die Möglichkeit erhalten, sich aus einer Kombination von praktischen Umsetzungen, Erfahrungen von Vordenkern und moderierten Workshops neue und anwendbare Inspirationen für die eigene Arbeit zu holen.
Wir starten mit einer Keynote von Guido Bosbach zum Thema Zukunft der Arbeit für alle Teilnehmer zusammen.
Danach finden 2 Vorträge gleichzeitig statt:
Für Recruiting-Interessierte spricht Martin Gaedt über seine Thesen zum Mythos Fachkräftemangel: “Wer unter Fachkräftemangel leidet, ist selbst schuld.”
Unternehmensführung auf ganz andere Art und Weise demonstriert Uwe Lübbermann am Beispiel des Getränkehersteller-Kollektiv Premium Cola, das seit bereits 15 Jahren am Markt ist.
Danach werden wir Themen für moderierte Open Space Sessions zusammen stellen, in denen sich die Teilnehmer inspirieren lassen, diskutieren und gemeinsam eigene Frage- und Problemstellungen lösen können.
Unsere eigenen Session-Vorschläge werden sich u.a. mit Feelgood Praxisbeispielen und Erfahrungen aus eigenen Recruiting Projekten beschäftigen.
Wir sind jetzt schon gespannt und freuen uns auf Freitag, den 26. Februar um 9:30 Uhr, wenn wir um die 60 Teilnehmer bei comspace begrüßen dürfen.
Personalmarketing-Aktionen konkurrieren ebenso um die Aufmerksamkeit ihrer Adressat_innen wie jede andere Marketingmaßnahme auch. Deswegen versuchen wir uns regelmäßig etwas Neues einfallen zu lassen, um potenzielle Bewerber_innen, die zu comspace passen und die Region OWL charmant finden, zu erreichen.
tl;dr: Mit der Kombination aus SMS-Bewerbungsgespräch und Plakaten in Bussen, Bahnen und Universitäten haben wir in einer 8-wöchigen Kampagne 600% mehr Bewerbungen generiert als durch eine durchschnittliche Jobanzeige. Bei vergleichbarem Aufwand.
In diesem Beitrag stellen wir unsere frechmutigste Recruiting-Aktion 2015 vor. Und liefern damit unseren Beitrag zur gleichnamigen Blogparade ab, in der wir innovative, erfolgreiche und kreative Personalmarketing-Maßnahmen sammeln möchten.
Was ist das Problem mit Jobanzeigen, wenn man Entwickler sucht?
Egal ob wir auf Jobportalen oder in Fachmagazinen Anzeigen geschaltet haben: Die Rücklaufquote an qualifizierten Bewerbungen war immer OK, aber hat uns nie aus den Socken gehauen. Natürlich waren immer wieder kleine Erfolge dabei und ganz ignorieren kann man diesen Kanal sicher nicht. Doch wir wollten einfach mal etwas völlig Anderes machen.
Zudem erreicht man auf Jobportalen vor allen Dingen Menschen, die bereits aktiv auf Jobsuche sind. Wir wollten aber auch diejenigen erreichen, die im Hinterkopf über etwas Neues nachdenken, aber noch nicht selber aktiv nach neuen Wirkungsstätten suchen. Im Stellenanzeigenteil oder auf dem Jobportal konkurriert man als Unternehmen mit vielen anderen.
Die mit Abstand und weit über 50% erfolgreichste Quelle für neue Mitarbeiter_innen ist bei uns die Empfehlung. Ist auch klar: Leute, die comspace bereits kennen haben natürlich auch ein gutes Gefühl dafür, wer aus ihrem Freundes- und Bekanntenkreis fachlich, aber vor allem auch menschlich gut zu uns passen könnte.
Der Empfehlung dicht auf den Fersen ist unsere Job-Seite, die seit einigen Monaten auch in neuem Glanz erstrahlt. Doch auch hier muss natürlich Traffic erzeugt werden, um Interessenten auf die Seite zu bringen. Hier kommt unsere eigene Expertise in SEO, Online und Social Media Marketing zum Tragen.
Doch: Wir wollten möglichst die ungeteilte Aufmerksamkeit unserer Zielgruppe erreichen. Wo könnte das besser gehen, als da, wo die meisten Menschen wenig zu tun haben – im Bus auf dem Weg zur Arbeit.
Wie man Bewerbungen per SMS einsammelt.
Die Idee zu dieser ungewöhnlichen Personalmarketing-Aktion entstand durch den Artikel ‘Futures of text’ von Jonathan Libov aus dem Februar 2015. Hier zeigt Jonathan einige innovative Einsatzmöglichkeiten von SMS, Messenger und Chat-Funktionen bsw. bei den New Yorker Stadtwerken oder in asiatischen Online-Shops.
Zugegeben: Als meine Kollegin Sarah und ich unserem Geschäftsführer und unserem Head of HR vorschlugen, die eher altbackenen Kanäle SMS und Plakate in öffentlichen Verkehrsmitteln zu benutzen (und das als Digital-Agentur!), um unsere Stellen für Java-Entwickler_innen zu besetzen, haben wir in den ersten Minuten unserer Präsentation eine Mischung aus Interesse und Fluchtreflex geerntet.
Unsere Überzeugung war aber: Auch eine Kombination aus zwei alten Herangehensweisen kann eine Innovation sein.
Schnell war klar, dass die Bewerbung per SMS prima mit Plakatwerbung in Bielefelder Bussen und Bahnen kombinierbar ist.
Während der Fahrt in öffentlichen Verkehrsmitteln hat man meistens Zeit.
SMS ist ein Kanal, der zeitlich unabhängig benutzbar ist. Ich kann eine SMS-Konversation beginnen, aus dem Bus aussteigen und 2 Stunden später problem weiter führen.
Die Ansprache kann sehr persönlich erfolgen.
Wir erreichen Menschen, die auf dem Weg zur Arbeit oder Uni sind.
Wir erreichen Menschen, die hin in unserer Region leben und für eine Stelle bei uns nicht umziehen müssen.
Als erste Lösung hatten wir uns überlegt, das Ganze selber zu bauen. Und zwar mit dem Chatbot, den unser Kollege Martin bereits 2013 auf Basis von Node.JS entwickelt hatte. Schnell war klar, dass die Idee “binde doch den Bot mal eben schnell an ein Telefon an, um die Bewerbungen entgegen zu nehmen” doch nicht so zeitnah und einfach umzusetzen wäre.
Besser mit Spezialisten zusammenarbeiten als alles selber machen
Relativ schnell haben wir mit mobilejob den perfekten Partner für die Aktion gefunden, der sich mit einem Rundum-Sorglos-Paket auf Bewerbungen per SMS fokussiert hat. Das passte exzellent zu unserer Philosophie: Wenn sich jemand anders spezialisiert und bereits alle wichtigen Erfahrungen gesammelt hat, sollte man das Rad nicht neu erfinden.
Wie wir unser virtuelles Bewerbungsinterview technisch umgesetzt bekommen, war damit geklärt: MobileJob stellt uns eine Telefonnummer zur Verfügung, die von Bewerber_innen angesimst werden kann. Danach versendet MobileJob die einzelnen Fragen, sammelt die Antworten ein, fragt bei nicht abgeschlossenen Interviews nach und kümmert sich um ein rechtssicheres Opt-In. Wir konnten uns auf die Inhalte und die Kampagne an sich konzentrieren.
Screenshot der ersten zwei Fragen des SMS-Bewerbungsprozess
Wenn wir schon einen so ungewöhnlichen Weg für ein digitales Bewerbungsgespräch gehen, dann wollen wir auch ungewöhnliche Fragen stellen. Also haben wir uns 10 Fragen ausgedacht, durch die nicht nur wir die Bewerber_innen kennen lernen, sondern die Bewerber zwischen den (Pixel)-Zeilen auch ein Gefühl dafür bekommen, wie comspace tickt und was uns wichtig ist.
Warum SMS und nicht WhatsApp oder Facebook Messenger?
Initial haben Kollegin Sarah und ich den Fragenkatalog zunächst grob umrissen und dann zur Verfeinerung und Diskussion in unser Intranet gegeben. Dabei kamen neben konstruktiven Ergänzungen natürlich auch einiges an Skepsis und Kritik zusammen. Vor allem natürlich die Frage:
„Wer benutzt denn schon noch SMS in Zeiten von Whatsapp, iMessage, Facebook Messenger usw.?“
Eine absolut berechtigte Frage, über die wir uns auch Gedanken gemacht hatten und uns dann bewusst gegen Messenger entschieden haben. Auch wenn Daimler mit WhatApps sehr gute Erfahrungen in einem ersten Test gemacht hat, gibt es da durchaus rechtliche Grauzonen einerseits. Zum anderen waren wir der Meinung, SMS ist der kleinste gemeinsame Nenner der mobilen Kanäle, der sich sogar ganz ohne Smartphone benutzen lässt. Und sogar ohne Internetverbindung lässt sich per SMS kommunizieren, was besonders für unseren Haupt-Trafficbringer Bus&Bahn wichtig war.
Diese Fragen konnten die Bewerber_innen beantworten
Da die Nummer nicht mehr geschaltet ist, können Sie den Bewerbungsprozess leider nicht mehr per SMS auf Ihrem Handy durchspielen. Daher hier noch einmal unsere Fragen, die Kurznachricht für Kurznachricht an die Bewerber_innen verschickt wurden:
Willkommen beim comspace Bewerbungs-Bot! Lass dir mit der Beantwortung unserer Fragen so viel Zeit wie nötig. Los geht’s! 🙂 Wie lautet dein Name?
An was für einer Stelle hast du Interesse? Fulltime / Teilzeit / Ausbildung / Praktikum?
Welche Erfahrung hast du in der Software- und/oder Web-Entwicklung?
Welches Highlight aus deiner persönlichen Entwickler-Karriere würdest du uns gerne vorstellen?
Wenn du ein halbes Jahr Zeit und ausreichend Geld hättest, um an nur einem Projekt zu arbeiten: Was würdest du machen?
Viele Kolleg_innen bei uns verbringen auch nach Feierabend Zeit miteinander: Was machst du in deiner Freizeit?
Bei comspace kombinieren wir moderne Arbeitsmethoden mit klassischer Vor-Ort-Arbeit. Von welchen digitalen Arbeitsmethoden oder Tools bist du ein Fan?
Wir haben bei comspace flache Hierarchien und arbeiten sehr transparent. Was ist dir bei der Arbeit wichtig?
Wir haben eine Zeitmaschine erfunden & schicken dich zu deinem 16jährigen Ich. Welchen Rat würdest du dir geben? “Kauf Facebook- & Google-Aktien!“ gilt nicht 🙂
Was möchtest du uns noch sagen?
Bitte nenne uns noch deine Kontaktdaten (E-Mail, Adresse) und wann wir dich am besten erreichen können.
Danke! Wir freuen uns über dein Interesse an einem Job bei comspace:) Wir melden uns schnellstmöglich bei dir, versprochen!
Die Vorbereitung zur SMS-Bewerbung
Nachdem feststand, wann wir einen Slot für Plakate in den Bussen und Bahnen von mobiel.de bekommen können (Mitte August bis Mitte September), ließen wir zunächst mal die Plakate einer wunderbaren Agentur in Rekordzeit designen. Darin mussten alle Infos von mobilejob enthalten sein, wie die Schritte der SMS-Bewerbung ablaufen. Ohne das Gefühl zu vermitteln ein Jamba-Abo zu verkaufen 😉
Die Plakate sollten auffällig sein, nicht zu sehr überfrachtet, schnell zu verstehen und vor allem wollten wir comspace und seine Unternehmenskultur so sympathisch und liebenswert rüberbringen, wie wir nun mal sind 🙂 Denn wir sehen jede Personalmarketing-Maßnahme auch so, dass wir uns bei neuen Kolleg_innen bewerben und nicht nur umgekehrt.
Also fragten wir unseren Entwickler-Kollegen und Wunschmodel John, ob er sich vorstellen kann, einen Monat lang das comspace Gesicht im öffentlichen Personennahverkehr zu sein. Da sein Urlaub in den Großteil der Kampagnenlaufzeit fiel und er damit kaum mit Autogrammwünschen bei Benutzung der Öffis zu rechnen hatte, mussten wir deutlich weniger Überzeugungsarbeit leisten als erwartet 😉
Dann trug ich unseren John auf einem Stapel Plakaten rüber zu Betreibergesellschaft mobiel.de:
Die Kampagne startet
Zusätzlich zu der Telefonnummer mit anhängender SMS-Interview-Software und den Bussen und Bahnen richteten wir selber noch eine Landingpage unter http://codeninja.comspace.de ein, die nur in den entsprechenden Kanälen genannt wurde und die entsprechende Stellenbeschreibung zu Java-Entwickler_in wieder gab. Über die Web-Analyse dieser Landingpage konnten wir quasi in Echtzeit eine Erfolgskontrolle durchführen und uns bsw. solche Fragen beantworten wie:
Wie gut performt die SMS-Idee?
Wie viel Rückfluss kommt über die Plakate?
Wie viele Teilnehmer_innen benötigen noch zusätzliche Informationen?
Unser Plakat in einem mobiel.de Fahrzeug
Nach zwei Wochen war außer 3 nicht zu Ende geführten Interviews noch nichts passiert. So langsam wurden wir etwas nervös. 🙂 Wir zündeten die zweite Stufe unserer Kampagne:
Wir informierten die lokale Presse, die in einer Story über den Hintergrund der Plakate berichtete, die im Bielefelder Personen-Nahverkehr zu sehen war und verlängerten daher die Aktion um weitere 4 Wochen.
Wir hingen zusätzlich noch Plakate in den umliegenden Universitäten auf und
platzierten die Plakate in unseren Agentur-Fenstern, die dank unserem Standort in der Bielefelder Innenstadt einiges an Laufkundschaft anziehen.
Plötzlich traf eine Bewerbung nach der anderen ein.
Das Ergebnis sind insgesamt 12 + 3 Bewerbungen. Das klingt erstmal nicht viel, doch für die Zielgruppe und unsere Region (Bielefeld ist eben nicht Berlin ;)) ist das ein bemerkenswert gutes Ergebnis. Wie in der Einleitung bereits beschrieben: Im Vergleich zu mancher Stellenanzeige ist das eine Steigerung um das 6-fache oder eben 600% 😉
Noch wichtiger ist aber: Alle 12 Bewerbungen, die als SMS über die Plattform von mobilejob zu uns kamen, waren qualitativ richtig gut.
Mindestens 3 zusätzliche Bewerbungen haben uns per Mail erreicht. Der Auslöser für die Aufmerksamkeit auf comspace kam aber über eines der Plakate. Und so haben wir bereits eine Kollegin dank unserer Aktion eingestellt. Übrigens nicht als Java-Entwicklerin, sondern tatsächlich in der HR-Abteilung.
Die Aktion generierte 169 Besucher auf die Landingpage codeninja.comspace.de.
Zwei Bewerber auf die Stelle als Java-Entwickler sind noch am Ball. Wobei wir uns tatsächliche Einstellungen auch bewusst nicht als Messgröße gesetzt haben, sondern die Zahl der eingehenden Bewerbungen und deren Qualität.
War die Aktion erfolgreich? Ja! Denn neben den Bewerbungen haben wir auch folgendes erreicht:
Regionales Employer Branding
Personalmarketing durch PR unterstützen
Mund-Propaganda erzeugen (Bewerber haben im Kennenlerngespräch erzählt, dass man an der Uni über die Plakate spricht)
„Etwas Neues ausprobieren“
Erfahrungen sammeln.
Einige zusätzliche Einblicke in die Aktion werden wir übrigens auch auf dem HR Inspiration Camp anbieten, das am 26.2. in den Räumen von comspace statt findet. Hier erfahren Sie mehr zur Veranstaltung.
Beispielhaftes Feedback der SMS-Bewerber_innen
Zum Abschluss hier noch ein paar Messages, die uns die Bewerber_innen im Abschluss der Konversationen geschickt haben als Eindrücke:
Funfacts zur SMS
Die erste SMS wurde 1992 verschickt
durch den britischen Entwickler Neil Papworth
und lautete: „Merry Christmas“
22.500.000.000 SMS werden jährlich in .de verschickt
18,19 Sekunden braucht der schnellste SMS-Tipper auf einem Samsung S4 für den folgenden Text: “The razor-toothed piranhas of the genera Serrasalmus and Pygocentrus are the most ferocious freshwater fish in the world. In reality they seldom attack a human.”
Bisher ging es in dieser Serie um die Verwaltung und Darstellung von Produkten und Preisen aus Hybris. Das Ziel dieses Artikels ist es auch erste Prozesse rund um den Warenkorb mittels Sitecore Commerce Connect abbilden zu können.
Die zentrale Überlegung am Anfang eines Projektes ist, welches System zu welcher Zeit die Zuständigkeit für den Warenkorb hat. Wird der Warenkorb immer auf beiden Seiten synchron gehalten, das heißt jede Änderung am Warenkorb wird unmittelbar an das externe Shopsystem (kurz ECS) gemeldet, oder wird der Warenkorb im ECS nur zu definierten Zeitpunkten synchronisiert, also z.B. beim Checkout? Letzteres bedingt weniger Requests an das ECS, aber Sitecore-seitig ist dann z.B. eine Warenkorbwertermittlung erforderlich, die im schlechtesten Fall nicht mit der im ECS synchron ist.
Warenkorb-Verwaltung
Im Rahmen unserer Evaluierung ist das ECS für den Warenkorb zuständig und Sitecore meldet alle Änderungen unmittelbar an das ECS. Für die Darstellung auf der Webseite werden die Daten rund um den Warenkorb wiederum immer online vom ECS abgefragt.
Außerdem haben wir uns entschieden, den mitgelieferten Engagement Plan ‘Abandoned Carts’ gleich mit zu nutzen, zumal dafür scheinbar keine weitere Implementierung erforderlich ist.
Warenkorb anlegen/ abfragen
Für alle Funktionen rund um den Warenkorb ist der Service Provider ‚CartServiceProvider‘ des Cart Service Layers zuständig.
Beispiel Verwendung CartServiceProvider.CreateOrResumeCart
[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;
namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
public const string TrackerAttachmentKeyCart = "Comspace.Sitecore.CommerceConnect_Cart";
public static Cart GetCart()
{
if (!Tracker.Current.Contact.Attachments.ContainsKey(TrackerAttachmentKeyCart))
{
//create cart
var createOrResumeCartRequest = new CreateOrResumeCartRequest(
"Website",
Context.User.Profile.Email,
"Default",
Context.User.Profile.Email); //NOTE FindCartInEaState: c.CustomerId == request.CustomerId
var cart = new CartServiceProvider().CreateOrResumeCart(createOrResumeCartRequest).Cart;
Die Anbindung des ECS erfolgt mittels Erweiterung der Pipeline ‚loadCart‘ der Sitecore.Commerce.Carts.config. .config
[xml]
<!– LOAD CART
Gets the cart object that matches the specified criteria.
This pipeline is responsible for reading data for a specific cart that is managed by the commerce system.
This pipeline reads the cart data from the commerce system and converts that data into the Commerce format.
–>
<commerce.carts.loadCart>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts.LoadCart, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.LoadCart.LoadCartFromEaState, Sitecore.Commerce‘]"/>
</commerce.carts.loadCart>
[/xml]
Processor LoadCart
[csharp]
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model.Cart;
using Comspace.Sitecore.CommerceConnect.Services.Carts;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Pipelines.Carts.Common;
using Sitecore.Commerce.Services.Carts;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts
{
/// <summary>
/// commerce.carts.loadCart
/// </summary>
public class LoadCart : CartPipelineProcessor
{
public override void Process(ServicePipelineArgs args)
{
var loadCartRequest = args.Request as LoadCartRequest;
//get from ECS
ExternalCart externalCart = CartConnector.Load(global::Sitecore.Context.Language.Name, loadCartRequest.UserId);
//convert to commerce connect cart
Cart cart = new Cart();
cart.ExternalId = externalCart.Code;
cart.ShopName = loadCartRequest.ShopName;
cart.UserId = loadCartRequest.UserId;
//persist for next processor
((CartResult) args.Result).Cart = cart;
}
}
}
[/csharp]
Produkt zum Warenkorb hinzufügen
Beispiel Verwendung CartServiceProvider.AddCartLines
[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;
namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
//…
//create cartlines
List<CartLine> lines = new List<CartLine>
{
new CartLine
{
Product = new CartProduct
{
ProductId = externalId,
SitecoreProductItemId = new ID(sitecoreItemId),
Price = PriceManager.GetPrice(externalId, Context.Language)
},
Quantity = quantitiy,
LineNumber = (uint) (cart.Lines.Count + 1)
}
};
//add cart lines
AddCartLinesRequest addCartLinerequest = new AddCartLinesRequest(cart, new ReadOnlyCollection<CartLine>(lines));
CartResult cartResult = new CartServiceProvider().AddCartLines(addCartLinerequest);
[xml]
<!– ADD CART LINES
This pipeline is responsible for adding a new line to the shopping cart and recording a corresponding page event in DMS.
This happens when a product is added to the cart.
–>
<commerce.carts.addCartLines>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts.AddLineToCart, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.AddCartLines.AddLinesToCart, Sitecore.Commerce‘]"/>
</commerce.carts.addCartLines>
[/xml]
Processor AddCartLines
[csharp]
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Carts;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Carts
{
/// <summary>
/// commerce.carts.addCartLines
/// </summary>
public class AddLineToCart : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var cartLinesRequest = args.Request as CartLinesRequest;
Damit die Summen im Warenkorb immer korrekt sind und keine Sitecore-seitige Berechnung stattfinden muss, werden auch die Warenkorb Summen immer online aus dem ECS geholt. Dafür muss die Pipeline ‘saveCart’ erweitert werden:
Pipeline saveCart
.config
[xml]
<!– SAVE CART
Saves the cart object to the external system and in Sitecore EA state.
–>
<commerce.carts.saveCart>
<processor type="Comspace.Sitecore.CommerceConnect.Pipelines.Carts.UpdateCartTotals, Comspace.Sitecore.CommerceConnect" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Carts.Common.SaveCartToEaState, Sitecore.Commerce‘]"/>
</commerce.carts.saveCart>
[/xml]
Processor UpdateCartTotals
[csharp]
using Comspace.Sitecore.CommerceConnect.Services.Carts;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Carts;
namespace Comspace.Sitecore.CommerceConnect.Pipelines.Carts
{
/// <summary>
/// commerce.carts.saveCart
/// </summary>
public class UpdateCartTotals : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var cartRequest = (CartRequestWithCart) args.Request;
//get from ECS
Cart cart = CartManager.UpdateCartTotals(cartRequest.Cart);
//persist for next processor
((CartResult) args.Result).Cart = cart;
}
}
}
[/csharp]
Beispiel Verwendung PricingServiceProvider.GetCartTotal
[csharp]
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore;
using Sitecore.Analytics;
using Sitecore.Commerce.Entities.Carts;
using Sitecore.Commerce.Services.Carts;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Data;
namespace Comspace.Sitecore.CommerceConnect.Services.Carts
{
/// <summary>
/// Sitecore.Commerce.Carts.config
/// </summary>
public class CartManager
{
//…
public static Cart UpdateCartTotals(Cart cart)
{
var request = new GetCartTotalRequest();
request.Cart = cart;
//get from ECS
var cartTotalResult = new PricingServiceProvider().GetCartTotal(request); //result contains the updated cart
Der Processor ‘FindCartInEaState’ benötigt eine CustomerId, damit der Contact ermittelt werden kann. Dafür muss die eigentlich optionale CustomerId mit an den ‘CreateOrResumeCartRequest’ übergeben werden (siehe oben). Anderenfalls wird immer wieder ein neuer Warenkorb angelegt, obwohl für den Contact bereits einer existiert.
Resumé
Und auch diesen letzten Beitrag möchte ich mit ein paar Eindrücken und Erkenntnissen abschließen:
Der Cart Sercice Layer ist sehr umfangreich und im Rahmen der Evaluierung konnte nur ein sehr kleiner Ausschnitt evaluiert werden.
Eine Herausforderung in einem echten Projekt sind die Zuständigkeit und Synchronisation zwischen dem Sitecore Shop und dem ECS. Was wird wo zwischengespeichert und wann an wen gemeldet?
Wie auch schon unter Stolpersteine beschrieben, war der Zugriff auf die Contacts im Engangement Plan (automatisch im Hintergrund) immer wieder holprig. Eine der Ursachen war sicherlich die Entwicklungsumgebung: wechselnde Browser, plötzliche Neustarts etc. Hier müsste in einem echten Projekt eine kritische Analyse erfolgen.
Auch dem Umgang mit Fehlern in der Verarbeitung muss in einem echten Projekt eine hohe Aufmerksamkeit gewidmet werden – Stichwort Transaktionssicherheit.
So, das war’s erstmal von meiner Seite zum Thema Commerce Connect. Ich freue mich über euer Feedback 🙂
Nach der Marketingaktion ist vor der Marketingaktion. Diese Regel gilt natürlich auch im Recruiting und Personalmarketing.
2015 haben wir mit der Bewerbung per SMS selbst eine sehr erfolgreiche Aktion durchgeführt, die uns neben unerwartet (aber erhofft) vielen Bewerbern, einige Aufmerksamkeit in der Presse und allgemeine Bekanntheit für comspace in unserem direkten Umfeld eingebracht hat.
Wie und was genau sich dahinter verbirgt, in einem eigenen Beitrag zu dieser Blogparade.
Was ist eine Blogparade?
Ein Blog – in diesem Falle unseres bei comspace – stellt Fragen oder ein allgemeines Thema in den Social Web Raum. Andere Blogger, Unternehmensblogs und Experten schreiben Antworten, Artikel und Kommentare auf die initialen Fragen und tragen somit zu einer hochverdichteten Zusammenstellung von Know-how bei, die allen aktiv Beteiligten, wie auch den passiven Lesern aller teilnehmenden Blogs zu Gute kommt.
Unsere Einstiegsfragen lauten:
Wie sah Ihre Aktion aus und wie ist sie entstanden?
Welchen Erfolg konnten Sie erzielen?
Welche Schwierigkeiten mussten Sie überwinden?
Welche Erfahrungen können Sie daraus weiter geben?
Wie sähe die perfekte Recruiting-Aktion für Sie aus, wenn es keine Beschränkungen gäbe?
Haben Sie selber als Bewerber an einer besonderen Recruiting-Aktion teilgenommen? Wie war das für Sie?
Zukunftsausblick: Werden frechmutige Aktionen in Zukunft mehr werden? Wie werden sie sich weiter entwickeln? Oder bleibt doch alles beim Alten?
Wie können Sie an der Blogparade teilnehmen?
Schreiben Sie einen Blogbeitrag über Ihre ausgefallenste Recruiting-Maßnahme und beantworten Sie eine oder mehrere der o.g. Fragen darin.
Die Überschrift kann frei gewählt werden – Recruiting und frechmutig sollten zum besseren wiederfinden enthalten sein.
Verlinken Sie aus Ihrem Beitrag auf diesen Artikel hier und weisen Sie uns mit einem Link in den Kommentaren auf Ihren Artikel hin.
Eine kurze einleitende Erklärung in Ihrem Artikel für Ihre Leser zu dieser Blogparade ist empfehlenswert.
Sie haben keinen Blog, möchten Ihre Erkenntnisse trotzdem teilen? Sehr gerne! Einfach unter diesem Beitrag als Kommentar hinterlassen oder per Mail mit dem Betreff Blogparade Recruiting an alex.kahl@comspace.de senden.
Bis zum 19.2.2016 werden wir Beiträge sammeln und dann mit der Zusammenfassung beginnen.
// UPDATE 12.1.2016 Verlängerung der Blogparade bis zum 19.2.: Ich gebe zu, es war sehr optimistisch kurz vor Weihnachten eine Blogparade zu starten. Ein wenig hatte ich auf die ruhige Zeit zwischen den Tagen gehofft und dass die eine oder der andere da bereits dazu käme einen Beitrag ins Rennen zu schicken.
Damit noch genug Zeit für spannende Artikel bleibt, haben wir die Parade also bis zum 19.2. verlängert. Bis eine Woche vor dem HRIC – dem ersten HR Inspiration Camp am 26.2. in Bielefeld. Hier werden wir voraussichtlich einige der Ergebnisse live vorstellen.
Was haben Sie von der Teilnahme an der Blogparade?
Erkenntnisgewinn, neue Inspirationen und Erfahrungs-Austausch mit anderen Unternehmen und Experten im Bereich Bewerber_innen Ansprache. Im Anschluss werden wir alle Beiträge zu einem kostenlosen E-Book zusammenfassen und hier zum Download anbieten.
In den letzten beiden Teilen dieser Serie ging es um die Synchronisation von Produkten und Klassifizierungen. Das Ziel dieses Artikels ist es auch die Preise aus dem externen Shopsystem, in unserem Fall Hybris, auf der Webseite anzeigen zu können.
Der Pricing Layer ist ein “klassischer” Layer im Sitecore Commerce Connect, d.h. die Preise werden online abgerufen und nicht synchronisiert. Der Grund: Preise ändern sich häufiger und die Preisfindung ist sehr komplex, hier wird die Hoheit im externen Shopsystem (kurz ECS) belassen.
Preisabfragen
Für die Abfrage von Preisen ist der Service Provider ‚PricingServiceProvider‘ zuständig.
Eine Beispiel:
[csharp]using System.Linq;
using Sitecore.Commerce.Entities.Prices;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Globalization;
namespace Comspace.Sitecore.CommerceConnect.Services.Prices
{
/// <summary>
/// Sitecore.Commerce.Prices.config
/// </summary>
public class PriceManager
{
public static Price GetPrice(string productId, Language language)
{
CustomGetProductPriceRequest request = new CustomGetProductPriceRequest(language.Name, productId);
GetProductPricesResult result = new PricingServiceProvider().GetProductPrices(request);
Um die Preise aus dem ECS abzurufen, muss die Pipeline ‚getProductPrices‘ der Sitecore.Commerce.Prices.config erweitert werden:
Pipeline getProductPrices
.config
[xml]<!– GET PRODUCT PRICES Gets the price object that matches the specified criteria.
This pipeline is responsible for reading pricing data from a commerce system.
This pipeline requests product pricing information from the commerce system and
then converts the output into the proper Commerce format.
–>
<commerce.prices.getProductPrices>
<processor type="Sitecore.Commerce.Pipelines.Prices.GetProductPrices.GetProductPrices, Sitecore.Commerce">
<patch:delete />
</processor>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Prices.GetProductPrices, Comspace.Sitecore.CommerceConnect.Hybris" />
</commerce.prices.getProductPrices>[/xml]
Processor GetProductPrices
[csharp]using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore.Commerce.Entities.Prices;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Prices;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Prices
{
/// <summary>
/// commerce.prices.getProductPrices
/// </summary>
public class GetProductPrices : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as CustomGetProductPriceRequest;
//get from ECS
ExternalProduct productSource = ProductConnector.Load(request.Language, request.ProductId);
if (productSource != null && productSource.Price != null)
{
//convert to commerce connect price
Price price = new Price
{
Amount = productSource.Price.Value,
CurrencyCode = productSource.Price.CurrencyIso
};
//persist for next processor
((GetProductPricesResult) args.Result).Prices.Add("List price", price); //simplified
}
}
}
}[/csharp]
Stolpersteine
Der ‚GetProductPricesRequest‘ enthielt überraschenderweise kein Attribut für die aktuell zu synchronisierende Sprache. Daher musste dieser überschrieben werden:
[csharp]using Sitecore.Commerce.Services.Prices;
namespace Comspace.Sitecore.CommerceConnect.Services.Prices
{
/// <summary>
/// Extendended GetProductPricesRequest.
/// </summary>
public class CustomGetProductPriceRequest : GetProductPricesRequest
{
public string Language { get; set; }
public CustomGetProductPriceRequest(string language, string productId, params string[] priceTypeIds)
: base(productId, priceTypeIds)
{
Language = language;
}
}
}[/csharp]
Resumé
Zuletzt möchte ich wieder ein paar Eindrücke und Erkenntnisse zusammenfassen:
Der Service Layer ist eher klein und schnell erfasst.
Was mir wirklich gut gefällt ist, dass die Preishoheit im ECS verbleibt.
In umfangreicheren Produklisten sollte zwecks Performance die Nutzung der Methode/Pipeline ‚getProductBulkPrices‘ bevorzugt werden.
Wenn ihr mehr zum Sitecore Commerce Connect wissen wollt, dann schaut mal hier:
Ich bin seit 8 Jahren Sky-Kunde und verbringe jede Woche mindestens drei Stunden damit, Bundesliga-, Europapokal- und DFB-Pokal-Spiele meiner Lieblingsmannschaft zu verfolgen.
In den Halbzeitpausen wirbt der Sender aktuell mit Prämien, wenn ich Sky an Noch-nicht- aber-hoffentlich-bald-Kunden weiterempfehle.
Das Prinzip „Empfehlungen gegen Prämie“ ist gängige Praxis in Marketing und Werbung. Ähnlich funktioniert das Influencer Marketing im Web bzw. in den Sozialen Medien.
Was ist Influencer-Marketing?
Ein Unternehmen beauftragt sogenannte „Influencer“, also aktive Youtuber, Blogger und Twitterer damit, ihre Reichweite zu nutzen, um Werbebotschaften oder Produktempfehlungen zu verbreiten. Diese Beeinflusser dienen dabei dem werbenden Unternehmen als Multiplikatoren. Eine sehr clevere Lösung durch Technologie haben beispielsweise die Verlagshäuser der Bertelsmann-Gruppe geschaffen, die auf ihrem gemeinschaftlichen Bloggerportal.de Influencer auf sich zukommen lassen. Web-Publisher können hier gezielt Rezensionsexemplare anfordern, ihre Beleg-Links einreichen und so hat der Verlag nicht nur qualifizierte Inbound-Anfragen, sondern bekommt auch Analyse-Daten frei Haus zurück geliefert.
Was bringen denn solche Marketingaktionen mit Influencern?
Eine ganz simple Rechnung: Ein Fashion-Unternehmen hat in verschiedenen sozialen Kanälen eine Reichweite von 2.000 Followern. Wird über diese Kanäle ein edles paar Designer-Schuhe beworben, so erreicht diese Botschaft im besten Fall eben jene 2.000 Rezipienten (der Tatsache, dass diese Empfänger das stylishe paar Schuhe ebenso weiterempfehlen können, wird an dieser Stelle der Einfachheit halber keine Rechnung getragen).
Wird jedoch ein Multiplikator beauftragt, diese Schuhe in seinem oder ihrem Netzwerk zu bewerben, so erhöht sich die Reichweite um die Gefolgschaft eben jenes Influencers.
Neben den nackten Zahlen gibt es noch ein paar weitere, marketingpsychologische Effekte:
Trust: Der Influencer genießt in seinem Netzwerk einen gewissen Grad an Vertrauen – oftmals mehr als das werbende Unternehmen. Neben der Reichweite wird also – schwer messbar – dieses Vertrauen weitervererbt.
Indirekte Einflussnahme: Ähnlich wie bei meinem “Sky”-Beispiel bewirbt der Influencer und nicht das Unternehmen das Produkt. Direkte Werbung wird oftmals argwöhnischer betrachtet als Empfehlungen vertrauter Personen und Personenkreise.
Copy with Pride: Verhaltensmuster von Vorbildern werden oftmals kopiert. Bis vor ein paar Jahren zählten neongelbe Fußballtreter nicht unbedingt zum modischem Mainstream. Kaum wurden diese von namhaften Testimonials getragen und zur Schau gestellt, gelangten diese rasend schnell auf Amateurfußball- und Bolzplätze.
Social Proof: Das Prinzip des Word-of-Mouth-Marketings kombiniert mit sozialer Akzeptanz und künstlicher Verknappung funktioniert übrigens auch ganz ohne – im klassischen Sinne – prominente Fürsprecher. Tupperpartys sind hier ein seit Jahrzehnten bewährtes Paradebeispiel, ebenso wie der immer weitere Verbreitung findene Thermomix-Alleskönner: Produkte, die nicht im Handel, sondern nur über selbstständige Repräsentanten erhältlich sind. Beiden Unternehmen gelingt es, ohne große “Above-the-Line”-Kampagnen, Kunden zu gewinnen und auch zu binden. Zudem haben die Produktpräsentationen einen nicht zu unterschätzenden Eventcharakter. Das Auditorium wiederum fungiert hier als Multiplikator, indem es den eigenen Bekanntenkreis zu diesen Veranstaltungen einlädt.
Für das Online Marketing eröffnen sich in puncto Influencer Marketing ungeahnte Möglichkeiten.
Maja Wyh mit einer großen Reichweite bei Facebook und Instagram postet regelmäßig Kollektionen von Modelabels und sammelt damit unzählige Likes und Kommentare.
Aus KPI- bzw. Messbarkeitssicht gibt es bei der Auswahl und Erfolgsmessung möglicher Beeinflusser mehrere Kennzahlen:
Die Anzahl der Follower (oder: Abonnenten) gibt einen ersten Hinweis über die mögliche Reichweite. Jedoch verrät diese quantitative Zahl noch nicht viel darüber, ob die Posts, Tweets, Videos auch tatsächlich Beachtung finden.
Qualitative Kennziffern ergänzen neben der Reichweite die Interaktionsrate der Influencer mit ihrem Publikum, wie z. B. die Anzahl an Retweets, Likes, Kommentare oder Aufrufe.
Testimonial-Brand-Fit: Die Multiplikatoren, wie auch die durch sie angesprochenen Zielgruppen sollten eine Affinität zum werbenden Unternehmen sowie seinen Produkten und Dienstleistungen aufweisen. Somit ist gewährleistet, das neben glaubwürdigen Aussagen auch eine ungefähre Erfolgsquote in Aussicht gestellt werden kann.
Zukunftsausblick Influencer-Marketing
Wir dürfen gespannt sein, wie sich das Influencer Marketing in Zukunft entwickeln wird. Sowohl rechtlich: Denn letztlich müssen Productplacement-Inhalte auch als das was sie sind gekennzeichnet werden: nämlich Werbung. Als Lektüre empfiehlt sich hier das Gesetz zum unlauteren Wettbewerb UWG – insbesondere §3 und §4 inkl. Anhänge.
Aber auch technologisch tut sich einiges: Momentan gibt es schon Marktplätze, auf denen sich Influencer bewerben und Unternehmen nach geeigneten Multiplikatoren Ausschau halten können.
Die technische Komponente wird sich zukünftig sicherlich auch noch entwicklen. So werden Bezahlmodelle Schule machen, die sich nicht mit der bloßen Verbreitung von Inhalten begnügen, sondern erfolgsabhängig gestaltet werden. Amazon vergütet über das Affiliate Marketing seine Multiplikatoren anteilig am Verkaufspreis des verlinkten Produktes (sofern der Käufer seine Transaktion über eben diesen Link tätigt). Ähnlich wird das Influencer Marketing funktionieren. Über eine Parametrisierung der URL werden Rückschlüsse gebildet, aus welcher Quelle die Transaktion stammt.
Im letzten Teil dieser Serie ging es um die Synchronisation von Produkten. Das Ziel dieses Blog-Artikels ist es auch Klassifizierungen unidirektional aus dem Sitecore heraus mit dem externen Commerce System (kurz ECS, in unserem Fall Hybris) zu synchronisieren und den Produkten zuzuordnen.
Klassifizierungen sind im Projekt individuell definierbare Spezifikationen zur Beschreibung von Produkten. Die sog. Classifications in Sitecore können über eine Parent-Verknüpfung (ExternalParentID) beliebig geschachtelt werden, die erste Ebene ist aber immer eine Gruppe, eine sog. ClassificationGroup.
Synchronisation Klassifizierungen
Um Klassifizierungen zu synchronisieren muss zunächst die Pipeline ’synchronizeClassifications‘ der Sitecore.Commerce.Products.config erweitert werden:
[csharp]using System.Collections.Generic;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeClassifications
/// </summary>
public class ReadClassificationGroups : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizationRequest;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>; //integration guide (page 9)
groups = groups ?? new List<ClassificationGroup>();
//get groups from ECS
IEnumerable<ExternalCategoryGroup> categoryGroups = ClassificationConnector.Load(request.Language);
//convert and add to commerce connect list
groups.AddRange(from @group in categoryGroups
select new ClassificationGroup
{
ExternalId = @group.Code,
Name = @group.Name
});
//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}
}
}[/csharp]
Processor ReadClassifications
[csharp]using System.Collections.Generic;
using System.Collections.ObjectModel;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Classifications
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeClassifications
/// </summary>
public class ReadClassifications : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizationRequest;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>; ////integration guide (page 9)
groups = groups != null ? groups : new List<ClassificationGroup>();
foreach (ClassificationGroup group in groups)
{
var classifications = new List<Classification>();
//get categories from ECS
foreach (ExternalCategory externalCategory in ClassificationConnector.Load(group.ExternalId, request.Language)) //TBD
{
//convert to commerce connect classification
var classification = new Classification();
classification.ExternalId = externalCategory.Code;
classification.Name = externalCategory.Name;
classifications.Add(classification);
//…with sub-classifications
HandleSubCategories(externalCategory, classifications);
}
group.Classifications = new ReadOnlyCollection<Classification>(classifications);
}
//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}
private static void HandleSubCategories(ExternalCategory parentCategory, List<Classification> allClassifications)
{
if (parentCategory.Categories != null)
{
foreach (var category in parentCategory.Categories)
{
var classification = new Classification();
classification.ExternalId = category.Code;
classification.Name = category.Name;
classification.ExternalParentId = parentCategory.Code;
Anschließend müssen die Klassifizierungen nur noch den Produkten zugeordnet werden. Und auch dafür muss wieder eine Pipeline der Sitecore.Commerce.Products.config erweitert werden:
Pipeline synchronizeProductClassifications
.config
[xml]<!– SYNCHRONIZE PRODUCT CLASSIFICATIONS
This pipeline is responsible for synchronizing and updating the references between a given product and associated classifications and categories within.
It’s assumed that classifications are already synchronized and present in CMS.
The references to categories are stored directly on the main product item. –>
<commerce.synchronizeProducts.synchronizeProductClassifications>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products.ReadProductClassifications, Comspace.Sitecore.CommerceConnect.Hybris" patch:after="processor[@type=’Sitecore.Commerce.Pipelines.Products.SynchronizeProductClassifications.ReadExternalCommerceSystemProductClassifications, Sitecore.Commerce‘]" />
</commerce.synchronizeProducts.synchronizeProductClassifications>[/xml]
Processor ReadProductClassifications
[csharp]using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Entities.Products;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeProductClassifications
/// </summary>
public class ReadProductClassifications : ReadProduct
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizeProductRequest;
var product = request.Properties["Product"] as Product;
var groups = request.Properties["ClassificationGroups"] as List<ClassificationGroup>;
groups = groups != null ? groups : new List<ClassificationGroup>();
//get product from ECS
ExternalProduct externalProduct = ProductConnector.Load(request.Language, product.ExternalId); //tbd
if (externalProduct != null && IsProductValidForImport(externalProduct))
{
//convert to commerce connect product classification groups and classifications
foreach (ExternalCategoryGroup externalCategoryGroup in externalProduct.CategoryGroups)
{
ClassificationGroup group = new ClassificationGroup();
group.ExternalId = externalCategoryGroup.Code;
group.Name = externalCategoryGroup.Name;
IEnumerable<Classification> classifications = from externalCategory in externalCategoryGroup.Categories
select new Classification
{
ExternalId = externalCategory.Code,
Name = externalCategory.Name
};
group.Classifications = new ReadOnlyCollection<Classification>(classifications.ToList());
groups.Add(group);
}
}
//persist for next processor
request.Properties["ClassificationGroups"] = groups;
}
}
}[/csharp]
Resumé
Mein erster Eindruck:
Es gibt viel Dokumentation, aber z.B. zum Thema Zuordnung von Klassifikationen zu Produkten konnte ich nichts finden. Da habt ihr es jetzt ja besser 😉 Häufig war dann doch dotPeek mein bester Freund.
Der Differenzabgleich funktionierte problemlos, Mehrsprachigkeit war im Kontext der Zuordnung von Klassifizierungen zu Produkten noch etwas holprig, da sollte ein zweiter Blick erfolgen.
Wenn ihr mehr zum Sitecore Commerce Connect wissen wollt, dann schaut mal hier:
Im ersten Teil dieser Serie ging es darum einen kurzen Überblick über das Sitecore Commerce Connect Modul zu verschaffen. In diesem Beitrag geht es nun um die Synchronisation von Produkten zwischen einem externen Shopsystem (kurz ECS, in unserem PoC Hybris) und Sitecore.
Zunächst ist es wichtig zu verstehen, dass Preise und Bestand im Commerce Connect nicht als Produktstammdaten gelten. Der Bestand ändert sich ständig und DEN Preis gibt es ja auch nicht, Preisfindung ist ein sehr komplexes Thema. Sitecore geht davon aus, dass diese Informationen online vom ECS ermittelt und geliefert werden. Im Teil 4 dieser Serie wird dann beschrieben, wie ihr auch an diese Informationen kommt.
Die Hoheit für die Produktdaten liegt sicherlich im ECS. Für die Synchronisation der Produktdaten schlägt Sitecore folgende Varianten vor:
Produkte als Items in Sitecore Datenbank (optional bidirektional)
Produkte in ECS, Zugriff über Sitecore Data Provider
Produkte in ECS, Zugriff über Sitecore Index
Wir haben uns im Verlauf des PoC für die Variante 1 entschieden, da diese standardmäßig vom Sitecore so vorgesehen ist und den höchsten Komfort bietet. In der Sitecore Commerce Components Overview im Kapitel “Products” sind einige Argumente für oder gegen die unterschiedlichen Variante aufgeführt.
So, jetzt aber Butter bei die Fische 🙂
Installation Modul
Falls ihr das Modul noch nicht installiert habt, findet ihr wie gewohnt eine gute Installationsanleitung auf dev.sitecore.net.
Synchronisation Produkte
Das Ziel: Titel, Beschreibung und Bilder der Produkte aus dem externen Shopsystem mit Sitecore zu synchronisieren.
In folgende Pipelines der Sitecore.Commerce.Products.config muss für die unidirektionale Synchronisation der Produkte eingegriffen werden:
Pipeline getExternalCommerceSystemProductList
.config
[xml]
<!– GET EXTERNAL COMMERCE SYSTEM PRODUCT LIST
This pipeline is responsible for obtaining the list of product Ids to be synchronized from the external commerce system.–>
<commerce.synchronizeProducts.getExternalCommerceSystemProductList>
<processor type="Sitecore.Commerce.Pipelines.Products.GetExternalCommerceSystemProductList.GetExternalCommerceSystemProductList, Sitecore.Commerce">
<patch:delete />
</processor>
<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products.ReadProducts, Comspace.Sitecore.CommerceConnect.Hybris" />
</commerce.synchronizeProducts.getExternalCommerceSystemProductList>
[/xml]
Processor ReadProducts
[csharp]
using System.Collections.Generic;
using System.Linq;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products
{
/// <summary>
/// commerce.synchronizeProducts.getExternalCommerceSystemProductList
/// </summary>
public class ReadProducts : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
var request = args.Request as SynchronizeProductsRequest;
var productIds = args.Request.Properties["ExternalCommerceSystemProductIds"] as List<string>; //integration guide (page 12)
productIds = productIds ?? new List<string>();
//get products from ECS
IEnumerable<ExternalProduct> externalProducts = ProductConnector.Load(request.Language);
//convert and add to commerce connect list
productIds.AddRange(from product in externalProducts
where product.Code != null
select product.Code);
//persist for next processor
args.Request.Properties["ExternalCommerceSystemProductIds"] = productIds;
}
}
}
[/csharp]
[csharp]
using Comspace.Sitecore.CommerceConnect.Entities.Products;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Products;
using Sitecore.Diagnostics;
namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Products
{
/// <summary>
/// commerce.synchronizeProducts.synchronizeProductEntity
/// </summary>
public class ReadProduct : PipelineProcessor<ServicePipelineArgs>
{
public override void Process(ServicePipelineArgs args)
{
SynchronizeProductRequest syncProdRequest = args.Request as SynchronizeProductRequest;
//persist for next processor
args.Request.Properties["Product"] = product; //integration guide (page 12)
}
}
protected bool IsProductValidForImport(ExternalProduct product)
{
var result = true;
if (string.IsNullOrEmpty(product.Name)) // = item.Name
{
result = false;
Log.Info("Skip product ‚" + product.Code + "‘: Name not valid.", product); //NOTE System.Messages
}
return result;
}
}
}
[/csharp]
CustomProduct
Wenn auch die Bilder synchronisiert werden sollen, muss das Produkt-Template des Commerce Connect erweitert werden. Konkret müssen dafür folgende Anpassungen vorgenommen werden:
Template
Neues Template “CustomProduct” anlegen, welches vom Standard Commerce Connect Template „Product“ erbt.
[csharp]
using Sitecore.Commerce.Entities.Products;
using Sitecore.Data.Items;
namespace Comspace.Sitecore.CommerceConnect.Entities.Products
{
/// <summary>
/// Custom product including image field.
/// </summary>
public class CustomProduct : Product
{
public string ImageUrl { get; set; }
public MediaItem Image { get; set; }
}
}
[/csharp]
Die Klasse „CustomProductRepository“ definiert dann wie das erweiterte Produkt gelesen und geschrieben wird:
[csharp]
using Comspace.Sitecore.CommerceConnect.Entities.Products;
using Comspace.Sitecore.CommerceConnect.Model.sitecore.templates.User_Defined.Comspace.CommerceConnect;
using Sitecore.Commerce.Data.Products;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
using Product = Sitecore.Commerce.Entities.Products.Product;
namespace Comspace.Sitecore.CommerceConnect.Data.Products
{
/// <summary>
/// Custom product repository including image field.
/// </summary>
public class CustomProductRepository : ProductRepository
{
/// <summary>
/// Save product data to related item.
/// </summary>
/// <param name="entityItem"></param>
/// <param name="product"></param>
protected override void UpdateEntityItem(Item entityItem, Product product)
{
base.UpdateEntityItem(entityItem, product);
using (new EditContext(entityItem))
{
var url = (product as CustomProduct).ImageUrl;
<!– Commerce ENTITIES
Contains all the Commerce cart entities.
The configuration can be used to substitute the default entity implementation with extended one. –>
<commerce.Entities>
<Product type="Sitecore.Commerce.Entities.Products.Product, Sitecore.Commerce" >
<patch:delete />
</Product>
<Product type="Comspace.Sitecore.CommerceConnect.Entities.Products.CustomProduct, Comspace.Sitecore.CommerceConnect" />
</commerce.Entities>
[/xml]
Stolpersteine
In der Klasse „Sitecore.Commerce.Templates“ existiert eine Konstante „ProductTemplateId“, deren Id fest verdrahtet ist und nicht auf die zuvor eingerichteten Konfigurationsdateien verweist. Die Konstante wird u.a. in der Klasse „ItemClassificationService“ verwendet, daher ist dieser auszutauschen:
Zuletzt möchte ich ein paar erste Eindrücke und Erkenntnisse zusammenfassen:
Der erste Einstieg durch Pipelines in Pipelines in Pipelines ist herausfordernd.
Es gibt umfangreiche Dokumentationen.
Einige hilfreiche Klassen aus Beispielen im Internet verweisen leider auf die CommerceServer API, z.B. ProductsSearchResult und CommerceConstants. Auch in dem Dynamics AX Demoshop von Sitecore (Commerce.Dynamics.Storefront) sind Verweise auf die CommerceServer API enthalten. Die Trennung bzw. Abstraktion ist m.E. noch nicht ganz sauber erfolgt.
Verwunderlich fand ich zunächst, dass die Synchronisation von Bildern nicht im Standard enthalten ist. Aber dem von Sitecore definierten Prinzip “kleinster gemeinsamer Nenner” folgend, ist es verständlich, denn Bild-Quelle und -Ziel sind doch sehr projektspezifisch.
Der “Merchandising Manager” ist NICHT Bestandteil des Commerce Connect, sondern des CommerceServer Connect.
In einem echten Projekt mit einem umfangreichen Datenmodell wird der größte Aufwand in das Verständnis und das Mapping der Datenmodelle gehen.
Wenn ihr mehr zum Sitecore Commerce Connect wissen wollt, dann schaut mal hier:
Das Jahr 2015 geht zu Ende und Bastian Wilkat ruft zum Blick in die Glaskugel. “New Work 2016 – Vom Hype zum Allag?” Wird New Work weiter aus der Nische kommen oder verkommt es vielleicht sogar schon zum Buzzword? Um es kurz zu machen: Ich finde das zu optimistisch. Nicht, dass ich es mir nicht wünschen würde! Aber von irgendeiner Art von Alltag ist die deutsche Unternehmenskultur meiner Meinung nach in Sachen “Neues Arbeiten” noch weit entfernt.
Warum New Work 2016 nur Gallier interessiert
Mein direktes Arbeitsumfeld empfinde ich als sehr “new workig”. Bei comspace gibt es dank unserer Unternehmenskultur und digitalisierter Arbeitsumgebung flexible Arbeitsmodelle, ein gelebtes Gemeinschaftsgefühl und Freiraum für Individualität. So weit, so gut. Aber: Wer einmal mit dem New Work-Gedanken angesteckt ist, schärft automatisch seine Wahrnehmung zu diesem Thema. Man besucht Barcamps und Konferenzen zum Thema Arbeiten 4.0, vernetzt sich mit Gleichgesinnten und liest entsprechende Blogs. So kann schnell der Eindruck entstehen, New Work und all seine Synonyme würden längst zum durchgekauten Begriff. Spricht man aber mit Leuten außerhalb dieser New Work-Wolke wird schnell klar, dass viele vermeintliche Buzzwords und die Konzepte dahinter totales Neuland sind. Man stößt auf ungläubige Blicke, irritierte Kommentare und im besten Fall auf kritische Fragen, die zu einer weiteren Diskussion über das Thema führen. Ähnlich hat es auch bereits Guido Bosbach in seinem Beitrag zu dieser Blogparade beschrieben:
Da gibt es zwar die kleine Gruppe unbeugsamer, die in ihrem virtuellen gallischen Dorf immer wieder darauf hinwiesen, dass wir mittendrin sind in einer globalen Veränderung von Arbeitsweisen, Arbeitsstrukturen und Arbeitszielsetzungen.
Auf andere HR-Themen übertragen hat übrigens Henner Knabenreich neulich beim XING Barcamp eine ganz ähnliche Erfahrung mit der Candidate Experience gemacht. New Work wird daher auch 2016 noch einen Exotenstatus haben und von Alltag weit entfernt sein.
»Menschen mit einer neuen Idee gelten so lange als Spinner, bis sich die Sache durchgesetzt hat.« Mark Twain
Nun wäre es ein leichtes sich auf dieser ernüchternden These auszuruhen und alle New Work-Pioniere (zugegebenermaßen provokant) als Spinner abzutun. Warum wir das bei comspace nicht tun, liegt daran, dass wir vom New Work Gedanken überzeugt sind. Wir leben New Work und möchten den Gedanken einer Unternehmenskultur auf Augenhöhe weitertragen. Manchmal kommen wir dabei auch an unsere Grenzen, und zwar spätestens wenn es um unsere Systemgrenzen geht: in Kundenterminen, Vorstellungsgesprächen, öffentlichen Veranstaltungen. Dann merken wir, dass wir uns weiter oder sogar mehr anstrengen sollten, wenn wir dazu beitragen wollen, dass New Work irgendwann gelebter Unternehmensalltag in Deutschland wird.
Was können wir tun?
In unserer Wahrnehmung ist es so, dass es eigentlich fast niemanden gibt, der extern ist, also der nicht betroffen ist von dem was wir tun oder von dem was wir nicht tun. (Uwe Lübbermann, Premium Cola)
Wer als Unternehmen bereits intern den New Work-Gedanken lebt, kann den Kreis der Beteiligten erweitern, die in dieses Konzept einbezogen werden. D.h. wir können New Work vorleben, z.B. in dem wir die Nutzen der digitalen Zusammenarbeit auch verstärkt für Kunden oder Bewerber aufzeigen, z.B. ausgewählte Kundentermine oder Vorstellungsgespräche via Skype. Das spart Zeit, Kosten und natürliche Ressourcen.
Wie wir den New Work Gedanken weitertragen können:
Austausch mitgestalten, z.B. bei Veranstaltungen wie dem nächsten Wevent zum Thema “New Work im Konzern”.
In persönlichen Gesprächen oder auf Veranstaltungen Impulse liefern, für Irritation sorgen, positive Beispiele kommunizieren und den New Work-Gedanken Stück für Stück zu mehr Präsenz verhelfen.
New Worker müssen andere einbinden, coachen, motivieren, anstecken. (Alex Kahl, Digital Strategist bei comspace)
Längerfristig betrachtet bin ich der Überzeugung, dass “New Work” sich als Konzept von Unternehmenskultur, Zusammenarbeit und Begegnung auf Augenhöhe durchsetzen wird. Vielleicht nicht im Jahr 2016, aber sicher später. Vielleicht sogar schon im Jahr 2025; so wie viele von den Impulsgebern des Projekts “Arbeitsvisionen 2025” das vermuten. Denn dafür sprechen einige gute Gründe:
Die demografische Entwicklung, die die strukturellen Machtverhältnisse zugunsten der Arbeitnehmer verschiebt. Wer nicht mit einer positiven Arbeitskultur punkten kann, wird im Zweifel der evolutionäre Verlierer auf dem Arbeitgebermarkt sein.
Die Generation Y, die mit neuen Vorstellungen von (Zusammen-)Arbeit die Unternehmen füllt und gestaltet.
Die Kraft des Menschlichen: In einer zunehmend komplexen und digitalisierten Welt werden sich Unternehmen dadurch unterscheiden, inwieweit sie menschliche Zusammenarbeit in den Fokus ihres Tuns rücken.