Lightweight CRM for Nextcloud — client management, lead pipelines, and request intake
Pipelinq brings CRM capabilities natively into Nextcloud. Track clients and organizations, manage leads through visual kanban pipelines, capture service requests before they become formal cases, and log every interaction — without leaving your Nextcloud workspace.
📚 Step-by-step tutorials — user + admin walkthroughs with screenshots, kept in sync with the live UI via the journeydoc capture spec defined in hydra.
It pairs naturally with Procest to form a complete intake-to-resolution workflow: Pipelinq handles the customer-facing side, Procest handles the internal case processing.
Requires: OpenRegister — all data is stored as OpenRegister objects (no own database tables).
![]() |
![]() |
![]() |
| Dashboard | Lead Pipeline | Clients |
- Persons & Organizations — Full CRUD with contact details, notes, and complete interaction history
- Contact Persons — Link individuals to organizations with roles (sales manager, project lead, etc.)
- Duplicate Detection — Provided via OpenRegister master-data management, which flags clients with matching names or email addresses
- Nextcloud Contacts Sync — Two-way sync with the native Contacts app via CardDAV
- Visual Kanban Board — Drag-and-drop leads through configurable pipeline stages
- Pipeline Configuration — Define custom stages, assign monetary values, set close probabilities
- Lead Detail — Full history, notes, associated client, assigned owner, and stage transitions
- Verzoeken — Capture incoming service requests before they're handed to formal case management
- Request-to-Case Bridge (in development) — A kind-addressed handoff to the
ns#Caseimplementer (e.g. Procest) is being built in openspec changesemantic-handoff-emit; until it ships, requests stay in Pipelinq - Status Tracking — Follow requests through intake statuses with activity timeline
- My Work Queue — Personal dashboard showing all assigned leads, requests, and follow-ups
- Activity Feed — Real-time updates on assignments, stage changes, new notes, and interactions
- Contact Moments — Log calls, emails, visits, and other client interactions with timestamps
- WhatsApp — Meta Cloud API direct + BSP fallback (Twilio, 360dialog); HSM template send with parameter validation; 24-hour customer-service window enforcement; inbound media downloaded, virus-scanned and stored alongside the conversation in Nextcloud Files
- SMS — Multi-provider abstraction (Twilio, MessageBird, CM.com, Vonage) with priority-based failover, caller-pinned provider hints, and a shared HMAC webhook surface
- Compliance — Append-only
messagingConsentRecordaudit log; automatic STOP / STOPALL / UITSCHRIJVEN opt-out detection; GDPR Art. 17 erasure cascade - Budgets — Per-tenant, per-provider message + EUR caps with hard-stop or soft-alert; cost capture from provider webhooks (Twilio) with ECB EUR conversion and static-price-table fallback (Meta)
- Per-item BTW rate — Each line carries its own Dutch VAT rate; the rate is pre-filled from the
product's
btwClassand may be overridden per line - Per-rate breakdown — Receipts and the detail view show tax grouped by rate (e.g. "9% BTW: €X", "21% BTW: €Y"); totals are recomputed server-side and never trusted from the client
- Inclusive / exclusive pricing — A transaction's
priceModecontrols whether entered prices already contain BTW (incl) or have it added on top (excl); the net base is the same either way - GL invoice breakdown — An
invoiceBreakdownarray (with Dutch descriptions) plus aGET /api/pos-transactions/tax-reportendpoint give shillinq a per-rate split for GL posting
Dutch BTW rates —
0%zero-rated/exempt items (vouchers, certain exports),9%reduced rate (food, beverages, books),21%standard rate (most goods and services). Set a product'staxRate/btwClassin the catalog so it pre-fills onto POS lines; an unknown class fails closed to the 21% standard rate so BTW is never silently dropped to zero.
- Unified Search — Clients, leads, and requests appear in Nextcloud's global search via OpenRegister (
lib/Search/ObjectsProvider.php), which provides search centrally for all OpenRegister-backed apps - Activity Stream — Nextcloud activity integration for assignments and status changes
- Notifications — Native Nextcloud notifications for new assignments and important updates
graph TD
A[Vue 2 Frontend] -->|REST API| B[OpenRegister API]
B --> C[(PostgreSQL JSON store)]
A <-->|CardDAV| D[Nextcloud Contacts]
A --> E[Nextcloud Activity]
A --> F[Nextcloud Search]
B --> G[Procest — case handoff]
| Object | Description | Schema.org | VNG Mapping |
|---|---|---|---|
| Client | Person or organization | Person / Organization |
Partij |
| Contact Person | Individual linked to a client | Person + worksFor |
Contactpersoon |
| Lead | Sales opportunity | Offer |
— |
| Request | Service intake / inquiry | Demand |
Verzoek |
| Contact Moment | Logged interaction | CommunicateAction |
Contactmoment |
| Pipeline | Workflow stage definition | ItemList |
— |
Data standard: Schema.org + vCard (RFC 6350) with VNG Klantinteracties API compatibility.
pipelinq/
├── appinfo/ # Nextcloud app manifest, routes, navigation
├── lib/ # PHP backend — controllers, services, activity, notifications
├── src/ # Vue 2 frontend — components, Pinia stores, views
│ ├── components/ # Reusable UI components
│ ├── store/ # Pinia stores per entity (clients, leads, requests…)
│ └── views/ # Route-level views
├── docs/
│ ├── FEATURES.md # Full feature specification
│ ├── ARCHITECTURE.md
│ └── features/ # Per-feature documentation
├── img/ # App icons and screenshots
├── l10n/ # Translations (en, nl)
└── docusaurus/ # Product documentation site (pipelinq.app)
| Dependency | Version |
|---|---|
| Nextcloud | 28 – 33 |
| PHP | 8.1+ |
| OpenRegister | latest |
- Go to Apps in your Nextcloud instance
- Search for Pipelinq
- Click Download and enable
OpenRegister must be installed first. Install OpenRegister →
cd /var/www/html/custom_apps
git clone https://github.com/ConductionNL/pipelinq.git
cd pipelinq
npm install
npm run build
php occ app:enable pipelinqdocker compose -f openregister/docker-compose.yml up -dcd pipelinq
npm install
npm run dev # Watch mode
npm run build # Production build# PHP
composer phpcs # Check coding standards
composer cs:fix # Auto-fix issues
composer phpmd # Mess detection
composer psalm # Static analysis (Psalm)
composer phpstan # Static analysis (PHPStan, level 5)
composer phpmetrics # HTML metrics report
composer check:strict # Run the full strict gate suite (all of the above + phpunit)
# Frontend
npm run lint # ESLint
npm run stylelint # CSS lintingThe strict gate suite (PHPCS, PHPMD, Psalm, PHPStan, PHPUnit) runs on every
pull request through the shared ConductionNL/.github quality workflow, and a
weekly cron (code-quality.yml, Mondays 06:00 UTC) re-runs it against
development to catch drift between PRs.
The one-off legacy quality cleanup (PHPCS/PHPMD/PHPStan burn-down split out of
pipelinq-legacy-quality-cleanup per ADR-032) is complete: PHPCS and PHPMD
are clean with no legacy-debt suppression sections, and PHPStan runs clean at
level 5. The remaining phpstan-baseline.neon entries are intentional,
documented tracked debt (unread forward-compat DI stubs and one nextcloud/ocp
stub false-positive) — see the file header and issue #496 before regenerating.
| Layer | Technology |
|---|---|
| Frontend | Vue 2.7, Pinia, @nextcloud/vue |
| Build | Webpack 5, @nextcloud/webpack-vue-config |
| Backend | PHP 8.1+, Nextcloud App Framework |
| Data | OpenRegister (PostgreSQL JSON objects) |
| UX | @conduction/nextcloud-vue, vue-draggable |
| Quality | PHPCS, PHPMD, Psalm, PHPStan, phpmetrics, ESLint, Stylelint |
Full documentation is available at pipelinq.app
| Page | Description |
|---|---|
| Features | Complete feature specification |
| Architecture | Technical architecture and design decisions |
| Development | Developer setup and contribution guide |
- Data standard: Schema.org + vCard (RFC 6350)
- Dutch interoperability: VNG Klantinteracties, VNG Verzoeken API
- Accessibility: WCAG AA (Dutch government requirement)
- Authorization: RBAC via OpenRegister
- Audit trail: Full change history on all objects
- Localization: English and Dutch
- Procest — Case management; receives requests handed off from Pipelinq
- OpenRegister — Object storage layer (required dependency)
- OpenCatalogi — Application catalogue
For support, contact us at support@conduction.nl.
For a Service Level Agreement (SLA), contact sales@conduction.nl.
This project is licensed under the EUPL-1.2.
All dependencies (PHP and JavaScript) are automatically checked against an approved license allowlist during CI. The following SPDX license families are approved for use in dependencies:
- Permissive: MIT, ISC, BSD-2-Clause, BSD-3-Clause, 0BSD, Apache-2.0, Unlicense, CC0-1.0, CC-BY-3.0, CC-BY-4.0, Zlib, BlueOak-1.0.0, Artistic-2.0, BSL-1.0
- Copyleft (EUPL-compatible): LGPL-2.0/2.1/3.0, GPL-2.0/3.0, AGPL-3.0, EUPL-1.1/1.2, MPL-2.0
- Font licenses: OFL-1.0, OFL-1.1
Dependencies with licenses not on this list will fail CI unless explicitly approved in .license-overrides.json with a documented justification.
Built by Conduction — open-source software for Dutch government and public sector organizations.


