Zum Inhalt springen

Brücke für externe Shop-Kassen

Falls Ihr Platz-Shop auf einer eigenen Kasse läuft — Lightspeed, Zettle, ein eigenes Python-Skript, oder etwas anderes — lässt diese Brücke die Kasse jede Transaktion an CampOne senden. So fliessen die Tagessummen (und damit die SAP-Sammelbuchung sowie die Auswertungen) über alle Erlöse zusammen, nicht nur über die Rezeption.

Anders als die übrigen Integrationen ist diese eingehend: Die externe Kasse ruft CampOne, nicht umgekehrt. Hier konfigurieren Sie also kein Anbieter-Konto — stattdessen erstellen Sie in CampOne einen API-Schlüssel mit den passenden Scopes und tragen ihn im externen System ein.

  • Eine öffentliche API unter /api/v1/public/pos/transactions/, die externe Transaktionen entgegennimmt
  • Idempotent über external_ref — ein Wiederversuch nach Netzwerk-Aussetzer erzeugt nie Duplikate
  • Standard-API-Schlüssel-Authentifizierung von CampOne mit zwei neuen Scopes: pos:read und pos:write
  • Einen Lese-Endpoint für den Tagesabschluss-Abgleich
  • Einen Produkt-Endpoint, damit die externe Kasse das Sortiment synchronisieren kann
  • Aktivitätsprotokoll für eingehende Anfragen auf der Einstellungskarte

Auf der Anbieterseite keine — Sie brauchen weder einen Lightspeed-Vertrag noch ein Zettle-Konto, um die Integration zu aktivieren. Sie konfigurieren CampOne und richten dann das externe System darauf aus.

Was Sie schon brauchen:

  • Eine externe Kasse, die HTTP-Anfragen mit Bearer-Token absetzen kann
  • Wissen, wie Sie API-URL und Token in diesem System hinterlegen

Einstellungen → Integrationen → API-Schlüssel (die bestehende API-Schlüssel-Oberfläche, neben dem Reiter Anbieter-Adapter):

  1. Klicken Sie auf Neuen Schlüssel erstellen.
  2. Vergeben Sie einen Namen (z. B. Lightspeed Shop-Kasse).
  3. Setzen Sie die Haken bei pos:read und pos:write.
  4. Klicken Sie auf Erzeugen. CampOne zeigt den Token nur einmal im Klartext — kopieren Sie ihn sofort und tragen Sie ihn im externen System ein.
  5. Der Token liegt nur als Hash gespeichert; falls Sie ihn verlieren, widerrufen Sie ihn und erzeugen einen neuen.

Konfigurieren Sie dann in Ihrer externen Kasse:

  • API-URL: https://ihr-mandant.campone.ch/api/v1/public/pos/transactions/
  • Authentifizierung: Authorization: Bearer <der-soeben-kopierte-Token>
POST /api/v1/public/pos/transactions/
Authorization: Bearer ck_…
Content-Type: application/json
{
"external_ref": "lightspeed-2026-04-29-T-1234",
"payment_method": "CASH",
"total_amount": "12.50",
"items": [
{ "description": "Croissant", "quantity": 2, "unit_price": "3.50", "line_total": "7.00" },
{ "description": "Coffee", "quantity": 1, "unit_price": "5.50", "line_total": "5.50" }
],
"occurred_at": "2026-04-29T08:14:32Z"
}

Der external_ref ist Ihr Idempotenzschlüssel — er muss in Ihrem System pro Transaktion eindeutig sein. CampOne erzwingt die Eindeutigkeit pro Mandant; ein Wiederversuch derselben Transaktion liefert deshalb 200 mit dem bestehenden Datensatz statt 409 oder einer Dublette.

Am Tagesende kann das externe System mit GET /api/v1/public/pos/transactions/<external_ref>/ prüfen, ob CampOne die Transaktion hat. Mit GET /api/v1/public/pos/products/ aktualisiert es das Sortiment.

Innerhalb von CampOne erscheinen Transaktionen aus externen Quellen unter /kasse/transaktionen wie jede andere Kassentransaktion, mit Quelle: Externe Kasse als Filter.

  • API-Schlüssel werden mit dem Passwort-Hasher von Django (Argon2 / bcrypt) gespeichert.
  • Jeder API-Aufruf wird protokolliert: Methode, Pfad, Statuscode, Antwortzeit, Schlüssel-Präfix.
  • Schlüssel lassen sich sofort widerrufen. Widerrufene Schlüssel liefern ab dem nächsten Aufruf 401.
  • Scopes werden pro Endpoint geprüft — ein Schlüssel mit nur pos:read kann keine Transaktionen senden, auch wenn man es versucht.
  • Live-Anbindungen an konkrete externe Kassen (Lightspeed, Zettle, Sumup) sind noch nicht zertifiziert — der oben beschriebene Standard-HTTP-Vertrag ist das, woran sich diese Systeme halten müssen. Auf der Roadmap: getestete Adapter pro Anbieter.
  • Rückerstattungen aus der externen Kasse erscheinen in CampOne als eigenständige Transaktionen; CampOne verknüpft eine Rückerstattung systemübergreifend nicht automatisch mit dem ursprünglichen Verkauf.