Wie die Offline-App, die CRM-API und die Lead-Erfassung zusammenarbeiten — plus was bereits in der App steckt.
Das Anfrageformular sendet direkt an die CRM-LeadIntake-API — ohne zwischengeschalteten Server.
<!-- POST über fetch → https://launcherp.be/api/v1/leads --> { "name": "...", // Name "email": "...", // E-Mail (Pflichtfeld) "company": "...", // Firma "plan": "hidden", // gewählter Plan (aus prijzen.html) "source": "salesonipad" // Quelle → Lead wird im CRM getaggt }
✓ Das Honeypot-Feld website filtert Bots. ✓ Netzwerkfehler → verständliche Meldung, kein verlorener Lead.
// config/cors.php 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_origins' => [env('APP_URL'), 'https://salesonipad.com'], // bootstrap/app.php — CSRF-Ausnahme für den Lead-Endpoint ->withMiddleware(function (Middleware $middleware) { $middleware->validateCsrfTokens(except: ['api/v1/leads']); })
✓ Der bestehende LeadIntakeController verarbeitet die Daten; kein neues Backend nötig.
Die App synchronisiert bereits über dieselben Muster wie Aufträge mit der CRM-API. Diese Module laufen und müssen nur noch angebunden werden.
scripts/leads.jsnovasync.syncLeads) und App → CRM (erp="send"-Warteschlange)crm:<uuid> oder lead:<ts>) — niemals Duplikatescripts/opportunities.jspdf.js: creditNotaFromFactuurscripts/novasync.jsWas auf dem iPad und im CRM passiert.
| Baustein | Funktionsweise |
|---|---|
| PIN-Schutz | App gegen unbefugte Nutzung schützen |
| Dropbox-Backup | OAuth 2.0 PKCE — ein Tipp Backup, später auf derselben/neuen iPad wiederherstellen |
| Offline-Warteschlange | Offene Aufträge überstehen einen Neustart; separate Backup-Warteschlange |
| Peppol-ready | Felder für die E-Rechnung vorhanden; das CRM-Modul erzeugt die UBL-E-Rechnung als Download. Der Versand über einen Peppol Access Point ist noch nicht operativ. |
| PWA / offline | Der Service Worker cached die gesamte App — funktioniert ohne Netzwerk |
Die App ist eine Progressive Web App: Außendienstmitarbeiter installieren sie ohne App Store auf ihrem iPad und sie funktioniert vollständig offline.
Die Kombination nutzt den bestehenden Sync — keine neue Infrastruktur.
1. CRM-Konto angelegt (Stripe-Checkout) 2. SalesOnIPad-Lizenz mit dem CRM-Unternehmen verknüpft 3. Die App weiß über die Konfiguration, welchen Sync-Endpoint sie verwenden muss 4. Der Sync läuft automatisch — Benutzer sehen „gesynchronisiert" in der App 5. CRM kündigen = Sync stoppt; die App funktioniert weiterhin lokal
Aufträge, Leads, Opportunities und Gutschriften nutzen bereits dasselbe Sync-Muster. Das Außendienst-Modul bindet sie an das CRM-Dashboard an.
Was noch passieren muss, um die Anbindung live zu schalten.
| Schritt | Arbeit | Status |
|---|---|---|
| 1. Lead-Erfassung online | Formular an API senden + CORS | Fertig (testwebsite) |
| 2. Außendienst-Modul | CRMModules aktivieren + Preise | Nächster Schritt |
| 3. Sync verbinden | Endpoints pro Kunde anbinden | Pilot |
| 4. Upsell im Checkout | Stripe + Willkommensseite | Erweiterung |