Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2,224 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Pipelinq logo

Pipelinq

Lightweight CRM for Nextcloud — client management, lead pipelines, and request intake

Latest release License Code quality Documentation


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).

Screenshots

Dashboard with KPI cards and pipeline overview Lead pipeline kanban board Client list and detail view
Dashboard Lead Pipeline Clients

Features

Client Management

  • 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

Lead Pipeline

  • 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

Request Intake

  • 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#Case implementer (e.g. Procest) is being built in openspec change semantic-handoff-emit; until it ships, requests stay in Pipelinq
  • Status Tracking — Follow requests through intake statuses with activity timeline

Work Management

  • 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

Messaging Channels (WhatsApp + SMS)

  • 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 messagingConsentRecord audit 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)

Point of Sale (BTW engine)

  • Per-item BTW rate — Each line carries its own Dutch VAT rate; the rate is pre-filled from the product's btwClass and 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 priceMode controls 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 invoiceBreakdown array (with Dutch descriptions) plus a GET /api/pos-transactions/tax-report endpoint give shillinq a per-rate split for GL posting

Dutch BTW rates0% zero-rated/exempt items (vouchers, certain exports), 9% reduced rate (food, beverages, books), 21% standard rate (most goods and services). Set a product's taxRate / btwClass in 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.

Integrations

  • 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

Architecture

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]
Loading

Data Model

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.

Directory Structure

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)

Requirements

Dependency Version
Nextcloud 28 – 33
PHP 8.1+
OpenRegister latest

Installation

From the Nextcloud App Store

  1. Go to Apps in your Nextcloud instance
  2. Search for Pipelinq
  3. Click Download and enable

OpenRegister must be installed first. Install OpenRegister →

From Source

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 pipelinq

Development

Start the environment

docker compose -f openregister/docker-compose.yml up -d

Frontend development

cd pipelinq
npm install
npm run dev        # Watch mode
npm run build      # Production build

Code quality

# 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 linting

The 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.

Tech Stack

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

Documentation

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

Standards & Compliance

  • 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

Related Apps

  • Procest — Case management; receives requests handed off from Pipelinq
  • OpenRegister — Object storage layer (required dependency)
  • OpenCatalogi — Application catalogue

Support

For support, contact us at support@conduction.nl.

For a Service Level Agreement (SLA), contact sales@conduction.nl.

License

This project is licensed under the EUPL-1.2.

Dependency license policy

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.

Authors

Built by Conduction — open-source software for Dutch government and public sector organizations.

About

Client and request management Nextcloud app — thin client on OpenRegister

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages