epilot Help Center
KonfigurationApps

Lima

Wie epilot und Lima zusammenspielen - vom unterschriebenen Auftrag bis zum laufenden Kundenkonto.

Was ist die Lima-Integration?

Lima ist das Abrechnungssystem (Customer Information System), das viele Stadtwerke und Energievertriebe für die Verwaltung ihrer Kunden, Verträge, Zähler und Rechnungen einsetzen. Damit epilot und Lima im Alltag wie ein einziges System wirken, sorgt die Lima-Integration für drei Aufgaben:

  1. Neukundenakquise (NKZ) – ein in epilot abgeschlossener Auftrag wird in Lima als echter Kunde mit Vertrag angelegt.
  2. Aus Lima übernehmen (Inbound) – Änderungen aus Lima fließen zurück nach epilot, damit Service-Mitarbeitende und Endkunden im Portal immer aktuelle Daten sehen.
  3. An Lima senden (Outbound) – Änderungen, die der Kunde oder ein Agent in epilot vornimmt (z. B. Bankverbindung, Zählerstand, Abschlag), werden nach Lima geschrieben.

Dieser Artikel beschreibt, wie diese drei Aufgaben funktionieren – mit besonderem Fokus auf die Neukundenakquise, weil dort die meisten projektspezifischen Entscheidungen getroffen werden.

Das große Bild

Die Integration besteht nicht aus einer einzigen großen Schnittstelle, sondern aus mehreren kleinen, klar abgegrenzten Datenflüssen. Jeder Fluss hat einen eindeutigen Auslöser, eine zugeordnete Lima-Operation und ein klares Ergebnis – entweder in epilot oder in Lima.

RichtungFlussWofür
epilot → LimaNKZ (Neukundenschnitstelle)Kunde + Vertrag werden in Lima angelegt, sobald ein Auftrag in epilot unterschrieben wurde. Im gleichen Schritt wird der zugehörige Kontakt in epilot mit der zurückgemeldeten Lima-Kundennummer markiert - damit gilt er fortan als Bestandskunde.
Lima → epilotOn-Demand-ÜbernahmeWenn ein Mitarbeiter oder Endkunde einen Datensatz öffnet, wird live der vollständige Datensatz aus Lima geladen.
Lima → epilotDelta-ÜbernahmeAlle paar Minuten werden Lima-Änderungen abgefragt; betroffene Kunden werden in epilot aktualisiert.
Lima → epilotNächtliche Vollübernahme (CRM-Export)Einmal pro Nacht lädt Lima einen vollständigen CSV-Export hoch; geänderte Datensätze werden gegen den Vortag verglichen und nach epilot gespielt.
epilot → LimaAn Lima senden (Outbound)Zählerstände, Adress-, Kontakt-, Bank-, Abschlags- und Tarifänderungen aus dem Self-Service.
Lima → PortalDynamische TarifeRead-only-API, die der Endkundenportal-Widget für Preis-, Kosten- und Verbrauchskurven nutzt.

Neukundenakquise (NKZ)

NKZ - die Schnittstelle in Lima, über die ein neuer Kunde samt Vertrag angelegt wird. Sobald ein Tenant mit Lima verbunden ist und ein Auftrag in epilot unterschrieben wird, klopft die Integration genau hier an, um den Kunden im Abrechnungssystem zu registrieren.

Der Ablauf, Schritt für Schritt

  1. Auftrag wird in epilot abgeschlossen. Entweder über eine Customer-Journey („Checkout & Unterschrift") oder manuell durch einen Mitarbeiter in epilot 360.
  2. Webhook wird ausgelöst. Die Automatisierung in epilot schickt die Order-Entität an den NKZ-Endpunkt. Der Auslöser ist konfigurierbar - meistens „Auftrag erstellt", manchmal an einen bestimmten Workflow-Schritt, einen Button oder eine Statusänderung gebunden.
  3. Payload wird gemappt. Ein JSONata-Ausdruck in der Webhook-Automatisierung transformiert die epilot Bestellung in die Form, die NKZ erwartet (siehe Mapping-Referenz weiter unten).
  4. Straßensuche. NKZ ruft Limas Straßensuche mit der Lieferadresse auf. Das prüft, ob die Straße vom Versorger beliefert wird, und liefert die internen Felder BEZIRKNR und STRASSENNR zurück, die Lima benötigt, um den Vertrag dem richtigen Netzgebiet zuzuordnen.
  5. SOAP-Aufruf writeneukunde. NKZ baut den SOAP-Umschlag (Kundenblock p3SATZ + Vertragsblock p4SATZ) und ruft Limas writeneukunde-Operation auf.
  6. Kundennummer wird zurückgeschrieben. Bei Erfolg liefert Lima eine KUNDENNUMMER. NKZ schreibt diese als customer_number in den Rechnungskontakt in epilot zurück. Damit weiß jede nachgelagerte Synchronisation (Delta-Sync, Self-Service, CRM-Export), dass dieser Kontakt nun ein echter Lima-Kunde ist.

Schlägt ein Schritt fehl – Straße nicht beliefert, Validierungsfehler, Lima-Ablehnung - wird der Fehler an die Automatisierung zurückgemeldet, der Kontakt wird nicht mit einer Kundennummer markiert, und der Auftrag kann nach Korrektur erneut versendet werden.

Warum Webhook + JSONata?

NKZ ist ein einfacher HTTP-Endpunkt mit einer strikten, Werk-unabhängigen Eingabeform. Jedes Werk hat aber einen eigenen Produktkatalog, eigene Journey-Fragen und eigene Konventionen – ein universelles Mapping ist daher nicht möglich. Die Trennung zwischen Integration und JSONata-Mapping bedeutet:

  • Werke können ihr eigenes Mapping ausliefern, ohne dass Integrationscode geändert wird.
  • Neue Produktattribute, Bonusregeln oder Journey-Felder lassen sich in Minuten anbinden.
  • Derselbe NKZ-Service unterstützt beliebig viele Werke mit völlig unterschiedlichen Eingangs-Strukturen.
  • Werk-spezifische Eigenheiten (Bonuslogik, Abrechnungsgruppen, Energieart-Erkennung) bleiben außerhalb des Integrationscodes.

Die Integration übernimmt nur die generischen, Werk-übergreifenden Transformationen (Straße/Telefon/Datum validieren, Straßensuche, SOAP-Umschlag). Alles Werk-spezifische ist Daten, kein Code.

Mapping-Referenz: Welches epilot-Feld geht wohin in Lima?

So liest sich diese Referenz: Für jedes Feld im NKZ-Request stehen Typ, ob es Pflicht ist, das Standard-Mapping aus der epilot-Order und eine Bemerkung dazu, was das Feld in Lima steuert. Wenn der eigene Produktkatalog andere Attributnamen verwendet, zeigt der JSONata-Ausdruck einfach auf die richtigen Felder – die Integration prüft nur die Form des Ergebnisses.

Metadaten

FeldTypPflichtStandard-MappingBedeutung in Lima
metadata.organization_idStringjametadata.organization_idepilot-Organisation, wird vom Webhook automatisch gesetzt.
metadata.correlation_idUUIDjametadata.correlation_idWird für Logging und Nachverfolgung verwendet, unverändert weitergereicht.
metadata.creation_timestampISO 8601jametadata.creation_timestampBestimmt SEPA-Mandatsdatum und Logik für die Abrechnungsgruppe.
tenantStringjaline_items[0]._product.tenant bzw. line_items[0]._product.werkLima-Tenant-Identifier. Bei mehreren parallelen Lima-Umgebungen aus dem Produkt aufgelöst.
billing_contact_idUUIDjabilling_contact[0]._idDer Kontakt, der bei Erfolg mit der Kundennummer markiert wird.

Kunde (Lieferadresse + Person) – wird zu p3SATZ in Lima

FeldPflichtStandard-MappingBedeutung
customer.delivery_address.streetjadelivery_address[0].streetStraßenname ohne Hausnummer.
customer.delivery_address.street_numberjadelivery_address[0].street_numberFrei formatiert. Der Server parst „12", „12a", „12 a", „12a-c" automatisch zu Nummer + Zusatz.
customer.delivery_address.postal_codejadelivery_address[0].postal_code5-stellige PLZ, wird für die Straßensuche genutzt.
customer.delivery_address.cityjadelivery_address[0].cityOrt.
customer.delivery_address.countryneindelivery_address[0].country, sonst "DE"ISO-Ländercode.
customer.delivery_address.additional_infoneindelivery_address[0].additional_infoWohnung/Etage/„c/o" – landet in Limas TEXT-Feld.
customer.anredeverknuepfungjaLookup auf salutation: Mr→"1", Mrs/Ms→"2", sonst "!"1 = Herr, 2 = Frau, ! = neutral/Firma.
customer.name1jabilling_last_name & ", " & billing_first_nameFormat „Nachname, Vorname". Firmen tragen hier den Firmennamen ein.
customer.name2neinAus „weitere Vertragspartner"-FeldernZweiter Vertragspartner oder Ansprechperson bei Firmenkunden.
customer.geburtsdatum1neinbilling_contact[0].birthdate (auf Datum gekürzt)Server formatiert nach DD.MM.YYYY.
customer.kundennummerneinbilling_contact[0].lima_kundenummer bzw. customer_numberBei Bestandskunden setzen, damit Lima den vorhandenen Datensatz weiterverwendet. Bei Erstkunden leer lassen.
customer.emailjabilling_emailE-Mail.
customer.phonejabilling_phoneFrei formatiert. Der Server zerlegt in Vorwahl + Nummer und akzeptiert +49… oder 0….

Vertrag – wird zu p4SATZ in Lima

Produkt & Energie

FeldPflichtStandard-MappingBedeutung
contract.produktidjaline_items[0]._product.codeLima-Produktcode. Muss zu einem in Lima für diesen Tenant konfigurierten Produkt passen.
contract.energieartjaLookup auf _product.energieart: Strom→E, Gas→G, Wasser→W, Fernwärme→FEnergieartcode. Bei abweichenden Produktnamen den Lookup oder die Produkt-Tags anpassen.
contract.preisschluesselnein_product.preisschluesselLima-Preisschlüssel.
contract.angebotsidnein_product.angebotsidAngebots-ID zur Unterscheidung von Produktvarianten.
contract.bilanzkreisnein_product.bilanzkreisBilanzkreisverantwortlicher (BKV).
contract.lastprofilnein_product.lastprofilLastprofil, z. B. H0 für Haushalte.

Zähler & Verbrauch

FeldPflichtStandard-MappingBedeutung
contract.zaehlernummerlangjazaehlernummer (Leerzeichen entfernt)Zählernummer. Server entfernt zur Sicherheit nochmals Leerzeichen.
contract.zaehlpunktbezeichnungneinmarktlokationsnummerMaLo-Identifier.
contract.energieverbrauchneinerwarteter_jahresverbrauch_in_kwh oder stromverbrauchJahresverbrauch in kWh. Der Attributname variiert je nach Journey.
contract.eaw11neinzaehlerstand_tarifrechner oder lieferauftrag_strom_zahlerstandAnfangszählerstand.

Preis & Abrechnungsgruppe

FeldPflichtStandard-MappingBedeutung
contract.abrechnungsgruppemeist jaPriorität: Bestandskunde → bestehende Gruppe; dynamischer Tarif → "602"; sonst _product.abrechnungsgruppeLima-Abrechnungsgruppe. Konventionen sind tenant-spezifisch – es gibt keinen universellen Standard. Manche Tenants lassen sie serverseitig aus der BEZIRKNR ableiten; in dem Fall Feld weglassen.
contract.abschlagsbetragja$ceil(line_items[0].amount_total / 100)Monatlicher Abschlag in Euro (auf Cents aufgerundet).
contract.abschlagsbeginndatumjaFrühester Termin aus Einzugsdatum / bestätigtem Kündigungstermin / nächstmöglichem Kündigungstermin / Erstellzeitpunkt + 14 Tagen, gerundet auf den 15. oder 1. des FolgemonatsStartdatum des Abschlagsplans. Die Rundung ist eine Lima-Konvention.
contract.netzbetreibernummerneinTenant-spezifischer Lookup nach EnergieartNetzbetreibernummer. Eigenen Lookup pflegen oder leer lassen, damit Lima sie ableitet.

Belieferung – steuert VERSORGUNGAB und ZUGANGSART

Diese Felder werden als Eingabe an die Integration übergeben; die finalen Lima-Felder berechnet der Server.

FeldPflichtStandard-MappingBedeutung
contract.belieferungjabelieferungEiner von Versorgerwechsel, Umzug, Umzug/Einzug, Wechsel, Lieferantenwechsel. Bestimmt Zugangsart und Datumswahl.
contract.uebernahme_kuendigungneinuebernahme_kuendigungEnthält der Wert „Nein", kündigt der Kunde selbst (ZUGANGSART = B1); sonst übernimmt der Versorger (ZUGANGSART = BW).
contract.einzugsdatumneineinzugsdatumEinzugsdatum, wichtig bei Umzug.
contract.bestaetigter_kuendigungsterminneinbestaetigter_kuendigungsterminBestätigter Kündigungstermin beim Altversorger. Höchste Priorität bei Versorgerwechsel.
contract.naechstmoeglicher_kuendigungsterminneinnaechstmoeglicher_kuendigungsterminFallback, wenn der bestätigte Termin noch nicht bekannt ist.
contract.kuendigung_wirksam_zumneinkuendigung_wirksam_zumWirksamkeitsdatum der Kündigung.
contract.lieferantenwechseljabelieferung = "Versorgerwechsel" ? "J" : "N"Harte Kennzeichnung „Lieferantenwechsel ja/nein".
contract.eaw01neinErstes verfügbares Datum, formatiert YYYYMMDDLima-Feld EAW01, rein numerisch.

Zahlung

FeldPflichtStandard-MappingBedeutung
contract.kzeinzugjapayment_method[0].type = "payment_sepa" ? "J" : "N"SEPA-Lastschrift ja/nein. Bei „J" ist ein bank-Block Pflicht.
contract.bank.ibanbei SEPApayment_method[0].data.iban (Leerzeichen entfernt)IBAN.
contract.bank.kontoinhaberbei SEPApayment_method[0].data.fullnameKontoinhabername.

Abweichende Rechnungsadresse (nur wenn sie sich von der Lieferadresse unterscheidet)

Das Standard-Mapping fügt den Block contract.billing_address nur ein, wenn Straße, Hausnummer oder PLZ von der Lieferadresse abweichen. Inhalt: dieselben Felder wie bei der Lieferadresse plus Anrede und name1.

Bonus & Coupons (optional)

Die Bonusfelder kommen entweder aus dem Produkt (_product.bonusart, _product.bonusbetrag, _product.bonusname, _product.bonustext, _product.sofortbonus_betrag, _product.mindestlaufzeit_bonus) oder – wenn der Tenant epilot-Coupons nutzt – aus line_items[0]._coupons[0]. Wichtig: Wenn bonusart gesetzt ist, müssen auch bonusname und bonusbetrag vorhanden sein. Lima lehnt unvollständige Bonusblöcke ab.

Was die Integration zentral übernimmt (du musst nichts selbst rechnen)

Manche Transformationen sind entweder rein generisch oder erfordern einen Lima-Aufruf. Diese laufen serverseitig – jedes Werk bekommt sie automatisch:

AufgabeWarum zentral
Hausnummer parsen („12a-c" → Nummer + Zusatz)Reines Parsing, für alle Werke identisch.
Telefonnummer in Vorwahl + Nummer zerlegenGleicher Grund.
Geburtsdatum ISO → DD.MM.YYYYGleicher Grund.
SEPA-MandatsdatumWird aus metadata.creation_timestamp abgeleitet.
Belieferungsdatum (VERSORGUNGAB)Wird aus belieferung ausgewählt und auf ≥ 2 Arbeitstage in der Zukunft geschoben.
Zugangsart (ZUGANGSART)BE / B1 / BW abhängig von belieferung und uebernahme_kuendigung.
Kündigung durch Kunde (KUENDIGUNGDURCHKUNDE)Gleiche Eingaben wie Zugangsart.
Lima-StraßensucheLive-Aufruf an Lima – liefert BEZIRKNR und STRASSENNR, validiert zugleich, dass die Straße beliefert wird.

Fehlerfälle – woran scheitert ein NKZ-Aufruf?

UrsacheWas passiert
Straße wird vom Versorger nicht beliefertNKZ meldet „Street not found in Lima". Es wird kein Auftrag angelegt.
Lima-Validierungsfehler (fehlendes oder falsches Feld)NKZ gibt success: false mit Limas FEHLERSTATUS und FEHLERTEXT zurück. Der Kontakt wird nicht markiert.
Netz- oder Timeout-FehlerNKZ meldet einen internen Fehler. Die Automatisierung kann erneut versenden.
Mapping erzeugt ungültige FormDie Schema-Validierung lehnt den Request vor dem ersten Lima-Aufruf ab.

Da in jedem Fehlerfall die customer_number nicht auf dem Kontakt landet, kann der Webhook nach Korrektur einfach neu angestoßen werden, ohne Duplikate zu erzeugen.

Was nach erfolgreicher Anlage passiert

  • Der nächste Nightly-Sync bzw. Delta-Sync verknüpft den neuen Lima-Vertrag zurück mit dem Kontakt.
  • Self-Service-Funktionen (Zählerstand melden, Adresse ändern, Bankverbindung ändern, dynamische Tarifkurven) sind ab sofort nutzbar.
  • Der Kontakt gilt nun als Bestandskunde. Künftige Aufträge derselben Person verwenden die vorhandene Kundennummer weiter, statt ein Duplikat anzulegen.

Mapping selbst erweitern – das Vorgehen

  1. Den Wert in der Order finden. In epilot 360 lässt sich die eingehende Entität in der Webhook-Automatisierung inspizieren.
  2. In JSONata referenzieren: $entity.dein_feld für Top-Level-Attribute, $entity.line_items[0]._product.dein_feld für Produktattribute, $contact.dein_feld für Rechnungskontakt-Attribute.
  3. In der JSONata-Sandbox testen (epilot bietet eine direkt im Automation-Editor). Form der Ausgabe gegen die Tabellen oben prüfen.
  4. Speichern und mit einer Test-Order über die Journey live durchspielen. Die Integrations-Logs zeigen den tatsächlichen NKZ-Request.

Wenn der angelegte Lima-Kunde ein falsches oder fehlendes Feld hat, ist die Lösung fast immer eine JSONata-Änderung – kein Deployment im Integrationscode.

Inbound-Synchronisation: Lima → epilot

Damit epilot ein vollständiges, aktuelles Bild des Kunden zeigt, gibt es drei eingehende Flüsse aus Lima. Sie überschneiden sich bewusst, weil jeder eine andere Lücke schließt.

Wie die Daten aus Lima auf die Felder in epilot übertragen werden, ist im Integration Hub definiert. Über ein Standard-Blueprint bekommt jeder Tenant ein vorkonfiguriertes Mapping, das die typischen Felder (Stammdaten, Vertrag, Zähler, Rechnungen, Dokumente) sofort abdeckt. Möchte ein Kunde einzelne Felder anders abbilden oder eigene Attribute hinzufügen, kann er das direkt im Integration Hub anpassen – ohne dass am Integrationscode etwas geändert werden muss.

On-Demand-Sync

Sobald ein Mitarbeiter in epilot 360 einen Kontakt öffnet oder ein Endkunde sich im Portal anmeldet, ruft epilot die Integration auf und holt synchron alles, was zum Kunden gehört: Stammdaten, Verträge mit Geräten, Abschlägen, Verlauf, Tarifen und VG50-Daten, dazu Zahlwege, Vermerke, Objekte, Rechnungen und Dokumente. Die wichtigsten Daten (Name, Adresse, Vertragsliste) erscheinen typischerweise nach einer Sekunde, Dokumente kommen in den folgenden Sekunden nach. So sehen Service-Mitarbeitende und Endkunden in epilot immer den aktuellen Stand aus Lima, ohne ihn aktiv anstoßen zu müssen.

 

Delta-Sync

Alle paar Minuten fragt ein Poller Limas Änderung ab (Kunden-, Vertrags-, Forderungs- und Debitorenfeed). Jede Änderung wird auf eine Kundennummer reduziert, dedupliziert und in eine Warteschlange pro Kunde gestellt. Ein Prozessor zieht jeden Eintrag heraus und holt die vollständigen Stammdaten nach. So fließen auch Änderungen, die niemand in epilot angeklickt hat (z. B. nachts erstellte Rechnungen oder Back-Office-Korrekturen) automatisch nach epilot. Wichtig zu wissen: Der Delta-Sync meldet nur, was sich geändert hat – er gleicht nicht den gesamten Datenbestand ab. Da Lima zudem nicht für alle Bereiche eine Änderungsmeldung anbietet, ergänzen die On-Demand-Übernahme (für die Sicht im Moment des Öffnens) und die nächtliche Vollübernahme (für lückenlosen Abgleich) das Bild.

 

Nightly-Sync (CRM-Export)

Einmal pro Nacht stellt Lima einen vollständigen CRM-Export bereit. epilot speichert diesen Export, vergleicht ihn mit dem Export des Vortags und schickt nur die tatsächlich geänderten Datensätze in epilot – die Briefhistorie ist dabei ausgenommen. So landen auch Massenänderungen, Korrekturen aus dem Back-Office und nachgereichte Zählerstände zuverlässig in epilot, selbst wenn an dem Tag keine Lima-Schnittstelle aufgerufen wurde. Die nächtliche Vollübernahme ist langsamer als die anderen Flüsse, aber dafür vollständig und unabhängig von der Tagesform der Lima-APIs.

Wie die drei zusammenspielen

BedarfDeltaOn-DemandNightly
„Hat sich etwas in Lima geändert?"primär (Minuten)innerhalb von 24 Std.
Aktueller Stand beim Öffnen eines Kundenprimär
Vollständige Erstbefüllung beim Onboardingprimär
Bulk-Änderungen ohne UI-Triggerteilweiseprimär
Dokument-Benachrichtigungenprimär (Minuten)nur bei AufrufStunden bis Tag

An Lima senden (Outbound)

Aus epilot heraus können bestimmte Selbstbedienungs-Vorgänge direkt in Lima ausgeführt werden. Die unterstützten Anwendungsfälle sind:

  • Zählerstand melden
  • Rechnungsadresse ändern
  • Kontaktdaten ändern
  • Bankverbindung ändern
  • Abschlag ändern
  • Tarifwechsel anstoßen (in Erprobung)

Welche dieser Anwendungsfälle aktiv sind, hängt vom jeweiligen Tenant ab. Sie werden über ein Blueprint installiert – also als vorkonfiguriertes Paket aus Journey, Automatisierung und Mapping, das nur noch auf den Tenant ausgerollt wird.

TODO: Dieser Abschnitt braucht noch mehr Detail (z. B. genaue Eingangsereignisse, Voraussetzungen pro Use Case, Fehlerbilder). Bitte ergänzen.

Dynamische Tarife

Bei einem dynamischen Tarif ändert sich der Energiepreis stündlich nach dem EPEX-Markt. Damit Endkunden verstehen, was sie zahlen und sparen, zeigt das Portal drei Diagramme: Preisverlauf, Kostenverlauf (Preis × eigener Verbrauch) und Verbrauchsverlauf. Eine eigene, schreibgeschützte API der Integration liefert diese Zeitreihen live aus Lima – sie werden nicht zwischengespeichert. Voraussetzungen für die Anzeige im Portal: Die Lima-App muss für installiert sein, und der Zähler des Vertrags muss ein intelligentes Messsystem (iMS) sein. Konventionelle Zähler liefern nicht den nötigen 15-Minuten-Lastgang, und ohne die Lima-App fehlt das Widget im Portal.

Auf dieser Seite