How the offline app, the CRM API and lead capture work together — plus what is already in the app.
The request form posts directly to the CRM LeadIntake API — without an intermediary server.
<!-- POST via fetch → https://launcherp.be/api/v1/leads --> { "name": "...", // name "email": "...", // email (required) "company": "...", // company "plan": "hidden", // chosen plan (from prijzen.html) "source": "salesonipad" // source → lead is tagged in CRM }
✓ Honeypot field website filters bots. ✓ Network error → clean message, no lost lead.
// config/cors.php 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_origins' => [env('APP_URL'), 'https://salesonipad.com'], // bootstrap/app.php — CSRF exception for the lead endpoint ->withMiddleware(function (Middleware $middleware) { $middleware->validateCsrfTokens(except: ['api/v1/leads']); })
✓ Existing LeadIntakeController processes the data; no new backend needed.
The app already syncs with the CRM API using the same patterns as orders. These modules run and only need to be connected.
scripts/leads.jsnovasync.syncLeads) and App → CRM (erp="send" queue)crm:<uuid> or lead:<ts>) — never duplicatesscripts/opportunities.jspdf.js: creditNotaFromFactuurscripts/novasync.jsWhat happens on the iPad and in the CRM.
| Component | How it works |
|---|---|
| PIN protection | Locks the app against unauthorized use |
| Dropbox backup | OAuth 2.0 PKCE — one-tap backup, restore later on the same/new iPad |
| Offline queue | Open orders survive a restart; separate backup queue |
| Peppol-ready | Fields for e-invoicing are present; the CRM module generates the UBL e-invoice as a download. Sending via a Peppol Access Point is not yet operational. |
| PWA / offline | Service worker caches the entire app — works without a network |
The app is a Progressive Web App: sales reps install it on their iPad without the App Store and it works fully offline.
The combination uses the existing sync — no new infrastructure.
1. CRM account created (Stripe checkout) 2. SalesOnIPad licence linked to the CRM company 3. App knows via config which sync endpoint to use 4. Sync runs automatically — users see "synchronized" in the app 5. Cancelling the CRM = sync stops; the app keeps working locally
Orders, leads, opportunities and credit notes already use the same sync pattern. The field sales module connects them to the CRM dashboard.
What still needs to happen to go live with the integration.
| Step | Work | Status |
|---|---|---|
| 1. Lead capture online | Posting form to API + CORS | Ready (testwebsite) |
| 2. Field sales module | Activating CRM modules + pricing | Next step |
| 3. Connect sync | Linking endpoints per customer | Pilot |
| 4. Upsell in checkout | Stripe + welcome page | Extension |