A first review of the Xapti CRM, from a live walk-through of the sandbox. What it's built on, how much runway the platform has, where the UI stands, and where AI and modernisation can take it.
Xapti is a mature, multi-tenant CRM. It's broad, it works, and the screens are internally consistent. The dated feel is cosmetic. One Kendo theme drives every screen, so a re-skin lifts the whole app at once. The real question sits underneath: it runs on .NET Framework, Microsoft's frozen and final generation. There's runway (security-patched into 2034 on Windows Server 2025), so nothing's on fire. But moving off it is a when, not an if. So: re-skin now (cheap, weeks), migrate the platform gradually (strangler, 12 to 24 months), and don't rewrite 10+ years of donation, SEPA and segmentation logic from scratch.
On AI: skip the chatbot. Ship first-party-data predictions (churn, storno, periodieke-gift) that protect donor revenue and stay AVG-safe. Build the AI as a separate .NET 10 service, so it doubles as the first step of the migration. And use the market gap: AVG-proof, Dutch-hosted AI is a position Salesforce can't easily match.
Read straight off the sandbox's HTTP response headers and page assets. Not guesswork. The public site gives none of this away.
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 5.2
X-Powered-By: ASP.NET
Set-Cookie: ASP.NET_SessionId=…
→ Classic ASP.NET MVC 5 on .NET Framework 4.x, on IIS 10 (Windows-only). Razor views, not Web Forms. That's one notch better than the worst case.
The Telerik licence and Knockout MVVM are assets that carry forward into any modernisation.
The CLR build stamp 4.0.30319 dates to April 2010. ASP.NET MVC 5 to 2013. And 4.8.1 is the final version. No 4.9 is coming, and no "Framework 5". Everything new moved to modern .NET, now at .NET 10.
| Dimension | Reality |
|---|---|
| Keeps running & patched? | Yes. It's a Windows component, security-patched for the life of its Windows host (Server 2022 to 2031, Server 2025 to ~2034). It won't suddenly stop. |
| New framework features | None, ever. Frozen and maintenance-only since ~2019. |
| Library ecosystem | Eroding. The modern floor is .NET 8/10, and new packages increasingly skip Framework. |
| Hosting | Windows and IIS only. No Linux, no cheap containers, no cloud-native autoscaling. |
| Hiring & performance | Harder to staff new work on it. Modern .NET is much faster at SaaS scale. |
I logged into the sandbox and walked the core screens. The two that carry the product, the dashboard and the contact record, are well built. The back-office screens are all the same Kendo pattern, so the app is internally consistent. It reads as a 2018-era enterprise CRM: solid, a bit dense, and dated in specific, fixable ways.






"Modernise the UI" and "the platform is old" feel like one job. They aren't. Separating them is what makes the cheap win possible.
| What it is | Effort | Urgency | |
|---|---|---|---|
| Visual refresh | A re-skin of the existing MVC5/Kendo app. New Kendo theme plus CSS, lighter grid headers, kill the modal-in-modal, unify the accent, more whitespace | Weeks to months · low risk | Do now · no backend change |
| Platform migration | .NET Framework 4.x → ASP.NET Core (.NET 10), via the strangler pattern | 12 to 24 months | Deliberate · not urgent |
Answered as a target to migrate toward, not a big-bang rewrite (that's the trap with 10+ years of domain logic). Optimised for their reality: a small .NET team, no dedicated frontend/UX, EU/GDPR-first, SEPA-heavy.
| Layer | Choice | Why |
|---|---|---|
| Backend | ASP.NET Core (.NET 10), C#, modular monolith | Keep their language and people. No microservice overhead for 2 to 3 FTE |
| Database | PostgreSQL + EF Core (+ pgvector) | EU-hostable and free. pgvector gives AI/search in the same DB. SQL Server stays viable to cut risk |
| Frontend | Blazor Web App (.NET 10) render modes: static SSR + interactive server/WASM | Keeps a frontend-light team in C# end to end, and the Telerik licence carries over (Telerik UI for Blazor). React+TS only if they hire frontend talent |
| Batch jobs | Hangfire / Quartz.NET | For SEPA runs, reminders, the existing Workflow Manager logic |
| Auth / tenancy | ASP.NET Core Identity or Keycloak (EU) + Finbuckle.MultiTenant | SSO/2FA, clean multi-tenancy |
| AI layer | Azure OpenAI (EU) or Mistral (FR) behind a thin service | AVG-safe, matches the EU-hosting brand promise |
| Infra | Docker on EU hosting (TransIP / Hetzner / Scaleway / Azure-EU) | GDPR positioning intact |
The through-line: stay in the .NET/C# world and carry the Telerik investment forward. The big decision isn't the language. It's Blazor (stay all-C#) vs a React SPA (higher ceiling, needs frontend hires). For a 7-person, frontend-light team, bias to Blazor.
Visible value early, strategic safety underneath. The tracks run in parallel and intersect deliberately so the UI isn't redone twice.
A research pass on the three advisory questions. The mental model: make it look good now (re-skin), ship AI that protects donor revenue (first-party predictions, not a chatbot), and replace the engine quietly over 2 to 3 years (strangler).
| Area | Tool | Highest-value workflow | V/E |
|---|---|---|---|
| Engineering 2-3 devs | GitHub Copilot Business + 1-2 Claude Code seats | Point Claude Code at the undocumented Workflow Manager/SEPA module → your first real internal docs. Copilot .NET app-modernization on one library to feel how mechanical the migration is. AI-generated unit tests on SEPA/selecties for a regression net before migrating. | High/Low |
| Support | M365 Copilot or Le Chat Enterprise | Standing Dutch reply-draft prompt (human reviews before send). Batch de-identified resolved tickets into a knowledge base, the compounding win that feeds in-app help. | High/Low |
| Sales / onboarding Edwin | M365 Copilot | Meeting transcript → Dutch follow-up. Proposal/quote drafting from a winning template. RFP/aanbesteding answers with a "flag what we can't answer" rail against hallucinated compliance. | High/Low |
| Content / marketing | Le Chat / Claude (no PII) | Newsletter cadence against a "Xapti voice" brief. Case studies from calls (with sign-off). SEO and AI-search for "CRM voor goede doelen". | Med/Low |
| Ops / admin | M365 Copilot | Contract/DPA summarisation. Data-cleanup rules designed on synthetic samples, then run in-house on real data. | Med/Low |
The spine: predictive scores trained on each tenant's own CRM history, not bought-in US wealth data (that would break the EU brand). The score features need no LLM. They're in-house models on data already in the database, so they carry the lowest AVG risk. Ship those first. Below: 28 features across six clusters, tagged by engine (Rules = deterministic, ML = in-house model, LLM = generative, the only ones that send text off-box).
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 1 | Stille-stopper-radar silent-lapser radar | Predicts recurring donors/members about to silently lapse. Catch churn before the storno, not after. | ML | M | Low |
| 2 | Storno-redder SEPA storno triage | Classifies each R-transaction and routes the right recovery. Stops treating "no money" and "revoked mandate" the same. | Rules→ML | S-M | Low |
| 3 | Contributie-verlooprisico non-renewal risk | Scores non-renewal probability per member. Targeted retention before the contributie window. | ML | M | Low |
| 4 | Mandaat-gezondheid mandate-health monitor | Flags mandates likely to fail before the SEPA batch runs. Fewer R-transactions, lower bank cost. | Rules | S | Low |
| 5 | Toezeggings-nakoming pledge-fulfilment watcher | Flags promised-but-never-collected pledges. Recovers committed money that slipped through. | Rules | S | Low |
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 6 | Grote-gift opwaardeerkans major-gift upgrade propensity | Scores upgrade likelihood. The fundraiser targets the right 30, not 3,000. | ML | M | Med |
| 7 | Periodieke-gift-kans 5-yr ANBI propensity | Predicts conversion to a 5-year notarised gift. Unlocks the highest-LTV move in NL fundraising. | ML | M | Med |
| 8 | Nalatenschap-signalen legacy signals · DPIA-gated | Surfaces soft legacy-giving signals. Big income for NL goede doelen, but profiling here is sensitive. | ML | M | High · DPIA |
| 9 | Volgende-beste-actie next-best-action | One recommended next step per relatie. Turns a wall of scores into one clear action. | ML/Rules | M | Low |
| 10 | Relatie-LTV lifetime-value forecast | Expected multi-year value per relatie/segment. Board view of durable value vs one-off spikes. | ML | M | Low |
| 11 | Betrokkenheids-score engagement score (RFM++) | One 0-100 number from RFM + Mailjet + forms. One legible number everyone understands. | ML/Rules | S | Low |
| 12 | Beste-moment/-kanaal send-time & channel | Best send time and channel per relatie. Higher response, less fatigue and postage waste. | ML | M | Low |
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 13 | NL→Selectie opsteller schema-only, no PII | Plain-Dutch request drafts a Selectie the user reviews. Collapses the steepest learning curve. | LLM | M | Low |
| 14 | Brief-me / donateur-samenvatting "brief me on this donor" | One-paragraph Relatiekaart summary plus a next step. Informed in 5 seconds, not 3 tabs. | LLM | M | Med |
| 15 | Gespreksnotitie-capture meeting-note capture | Rough notes into a clean summary plus follow-up tasks. Notes get logged and turned into tasks. | LLM | S | Med |
| 16 | Semantisch zoeken semantic relatie search | Meaning-based search over relaties and notes. Finds people by intent, not exact match. | LLM+ML | L | Med |
| 17 | Rapport-uitleg plain-language report explainer | A narrative reading off existing Telerik report data. The board gets the story, not just the chart. | LLM | M | Low |
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 18 | Slimme-ontdubbelaar AI dedup & merge | Fuzzy-matches duplicate relaties, human-approved merges. The #1 data-quality complaint, beats rule-based dedup. | ML/Rules | M | Low |
| 19 | Formulier-validatie + fraude-vlag form validation + fraud flag | Validates IBAN/address and flags suspicious submits. Stops bad mandates at the front door. | Rules | S | Low |
| 20 | Adres-/relatie-verval-detectie address & relation decay | Flags stale, moved or deceased signals and proposes fixes. Mailings hit real addresses, dignity on "overleden". | Rules/ML | S | Med |
| 21 | Veld-anomalie-detectie field anomaly detection | Outliers in the per-tenant Datamodel (a €50k incasso, an 1850 birthdate). Catches errors before a SEPA run. | Rules/ML | S | Low |
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 22 | Trigger-gegronde concept-mails the honest generative one | Drafts grounded in a trigger plus facts, and never auto-sends. Removes the blank-page tax for a tiny team. | LLM | M | Med |
| 23 | Onderwerpregel-/segment-optimalisatie subject-line & segment | Subject variants plus the best Selectie, learning from Mailjet results. Higher opens without a marketing specialist. | LLM+ML | S | Low |
| 24 | Sentiment & intentie inkomend inbound sentiment & intent | Classifies inbound: complaint, cancel, thanks, opt-out. At-risk messages and opt-outs auto-routed. | LLM | M | Med |
| 25 | Opzeg-reden tekst-mining churn-reason text mining | Clusters free-text cancel reasons into themes. Tells the org why it loses donors. | LLM/ML | M | Med |
Turn the brand promise into a feature. These three double as guardrails for everything above.
| # | Feature | What it does | Engine | Effort | GDPR |
|---|---|---|---|---|---|
| 26 | Inzageverzoek-assistent DSAR assistant | Auto-assembles a relatie's full export plus a deletion-impact preview. Makes the time-boxed DSAR a product feature. | Rules | M | Med |
| 27 | Bewaartermijn-bewaker retention watcher | Flags records past per-tenant retention and proposes anonymise/delete. Keeps tenants AVG-compliant automatically. | Rules | S | Low |
| 28 | Toestemming-/opt-out-bewaker consent & opt-out guard | Verifies every Selectie and mailing run against consent flags. One opt-out leak can cost an AVG brand its reputation. | Rules | S | Low |
None of this needs the migration first. Most of it ships on the stack that's there today. Split it in two. Generative features (draft, summarise, NL→Selectie) are stateless calls to an EU LLM endpoint from the existing MVC5 controllers. Predictive features (the scores) are a model trained on Xapti's own data, scored nightly in a small sidecar that writes the score back into SQL Server. Rules features are plain .NET and SQL. The feasibility below was checked against current vendor docs and NuGet (June 2026).
Stateless EU REST from MVC5. Runs on Framework today. No model to host. The only features that send text off-box, so they get the strictest guardrails.
A model on Xapti's own data, batch-scored nightly and written back into SQL Server. Lives in a sidecar, not the web request. Nothing leaves the EU box.
Plain .NET and SQL. No model, no call. Several of the do-first wins (storno, validation, watchers) are pure rules.
| Component | On Framework? | Note |
|---|---|---|
| Azure.AI.OpenAI SDK | Yes | Targets netstandard2.0, runs on 4.6.2+. The official Azure OpenAI client, no raw HttpClient needed. |
| Semantic Kernel | Yes | netstandard2.0. Optional orchestration if you want it. |
| Microsoft.Extensions.AI | No | Needs .NET 8+. The trap: Microsoft's newest abstraction is off-limits on Framework. Don't depend on it in the MVC5 app. |
| Mistral (Paris) | Yes | Raw HttpClient + System.Text.Json. An LLM call is one POST. Strongest AVG fit, zero-retention on request. |
| ML.NET in-process | Risky | Runs on 4.6.1+, but x64-only (fails in a 32-bit app-pool), and you don't want training in the IIS pipeline. |
| Out-of-process AI service (.NET 10) | Recommended | Reads the same SQL Server, scores in batch, returns over REST. Also the migration's first new-stack component. |
A score is just a number in a custom field. Xapti already has the three things that make a number useful: the configurable Datamodel, Selecties and the Workflow Manager. The AI feeds those, and builds no new UI.
Nightly batch (Workflow Mgr / SQL Agent / Hangfire) → AI service reads SQL
→ ML produces churn_score per relatie (per tenant)
→ WRITE-BACK into the existing Datamodel custom field ← the linchpin
relatie."AI_verlooprisico" = 0.87
→ SELECTIE "Hoog verlooprisico" = AI_verlooprisico > 0.8
→ WORKFLOW that Selectie fires a win-back action
→ RELATIEKAART shows the score + a plain-Dutch reason
AI_verlooprisico = 0.87 onto Jan. The tenant's standing Selectie > 0.8 (built in the normal UI, no code) catches him. A Workflow rule fires a trigger-grounded draft mail to the approval queue. A human clicks send, it goes via Mailjet. The fundraiser opening the Relatiekaart sees "Verlooprisico: hoog (0,87). 8 mnd geen gift, laatste 2 mails niet geopend." The AI added one custom field. Everything else is Xapti's existing machinery.
SQL Server 2025 ships a native VECTOR type (GA Nov 2025, on-prem, not Azure-only). If the DB can move to 2025, that's the win: embeddings next to relational data, same backup, same EU and tenant boundary. Re-verify Xapti's edition and version first. Legacy CRMs run several versions behind, and that upgrade is the gating item. Fallback: self-hosted Qdrant on TransIP next to the AI service.
AI_verlooprisico. Scheduled via Workflow Manager, SQL Agent or Hangfire (Hangfire runs on Framework).AiService to MVC5 and ship one LLM feature. The trigger-grounded draft in a Kendo modal behind the send-gate, then NL→Selectie.targetFramework (needs to be ≥ 4.6.2 to use the SDKs cleanly, the one number that matters most), the current SQL Server version and edition (for the jump to 2025 native vectors), whether they're on Microsoft 365 (decides the team-AI tooling), and the Telerik licence tier.
Procurios is the benchmark (markets AI dedup only). Peers like Regas, Eudonet, e-Captain, Congressus and Stamhoofd are essentially AI-silent in mid-2026. Salesforce Agentforce Nonprofit sets the narrative, but not the price for Xapti's €99-799/mo buyer. AI-assisted writing is becoming table-stakes. AI that makes the CRM smarter about the donor relationship is wide open, which is exactly where Xapti's datamodel, selecties and workflow engine are an unfair substrate (a score can trigger a workflow).
"AVG-proof AI. Verwerkt in Nederland." Lead with trust. Goede Doelen Nederland made verantwoord AI-gebruik a 2026-2029 policy pillar and is teaching members to ask "is this EU-hosted and privacy-safe?". That's the answer Salesforce can't match.
"Je CRM die je donateurs écht begrijpt." Predictive lapse/upgrade scoring on first-party data, then close the loop: high lapse-risk auto-fires a win-back workflow. The open white space, and the workflow engine is the moat.
"Praat met je data." Natural-language selecties plus Dutch-native drafting. Drafting is the easy on-ramp (table-stakes). NL-segmentation is the differentiator.
"AI binnen handbereik voor élk goed doel." Enterprise outcomes, right-sized and affordable. No ML hire, no consultant. Owns the middle the frontrunners priced out.
The product roadmap keeps running. AI and modernisation slot in as small, bounded, killable bets. At most one product-AI experiment and one migration spike in flight.
| Weeks | Workstream | Action | Owner |
|---|---|---|---|
| 1-2 | Governance | Sign one EU-LLM DPA (Mistral/Paris or Azure OpenAI EU) plus a 1-page AI-use policy. | CTO + Edwin |
| 1-2 | Team AI | Pilot A: coding assistant for both engineers. Pilot B: support-reply drafter on de-identified tickets. | E1 / Edwin |
| 1-2 | UI | Phase 0 CSS re-skin. One global Kendo theme override, live on 1 pilot tenant. Before/after screenshots Edwin can demo. | E2 |
| 1-2 | Platform | Scope only. Pick a read-mostly, self-contained strangler slice. No code yet. | CTO + E1 |
| 3-6 | Team AI | Measure pilots, keep what sticks. Add a docs/onboarding bot only if A/B land. | CTO |
| 3-6 | UI | Roll the re-skin to all ~100 tenants. Fix the top 5 density offenders. | E2 |
| 3-6 | Product AI | Build one prototype in the sandbox on anonymised data behind a flag (churn/storno preferred, draft-emails the easier fallback). | E1 + CTO |
| 3-6 | Platform | Migration spike: minimal .NET 10 app plus a YARP proxy in front of IIS, passing 100% through unchanged. | E1 + CTO |
| 7-12 | Product AI | Validate cheaply: Edwin rates ~20 anonymised outputs send/edit/unusable. 60%+ usable means productize, else kill or narrow. Go/kill memo. | Edwin + CTO |
| 7-12 | Platform | Rebuild the chosen slice natively on .NET 10, served through YARP in real traffic. The real strangler proof. | E1 + E2 |
| 7-12 | UI | Relatiekaart polish. Begin replacing modal-in-modal with tabbed/inline. | E2 |
| 7-12 | Decision | 90-day readout: costed platform path, product-AI verdict, UI roadmap. | CTO |
One ranked list tying it together. Effort: S = days, M = weeks, L = months+.
| # | Do this | Why it's ranked here | Effort |
|---|---|---|---|
| 1 | Sign one EU-LLM DPA + 1-page AI-use policy | Unblocks every AI move safely. Protects the brand. | S |
| 2 | Phase 0 CSS re-skin → 1 tenant, then all | Cheapest, fastest, customer-visible win. Tokens carry into the migration. | S |
| 3 | Copilot for engineers + Claude Code on the SEPA module | Daily velocity, first real docs, and bus-factor capture. | S |
| 4 | Support reply-drafter + KB; Edwin's proposal/RFP workflow | High-ROI, low-risk, and a compounding KB. | S-M |
| 5 | Product-AI prototype: churn or storno-redder | Highest-value, AVG-safe, no-LLM revenue protection. Easiest to sell to a board. | M |
| 6 | Phase 1 proper Kendo theme + tokens (token spec FIRST) | Makes the re-skin real and migration-portable. | M-L |
| 7 | Migration foundations: YARP + System.Web adapters + shared auth + extract domain to .NET Standard 2.0 libs + characterization tests | The make-or-break phase. Reuses proven C#, captures tribal knowledge. | L |
| 8 | Build AI as an out-of-process .NET 10 service via Stekkerdoos | The AI service is the migration's first new-stack step. | M-L |
| 9 | Periodieke-gift bewaker + dedup + upgrade-kompas | Dutch-specific moat, data hygiene, and near-free propensity reuse. | S-M |
| 10 | Phase 2 UI: full-page tabbed Relatiekaart | The "feels modern" change. Doubles as the first Blazor port unit. | L |
| 11 | Strangler Wave A (read screens) on .NET 10 + Blazor | Customer value on the new stack inside year one. Proves the pattern. | L |
| 12 | Forecast, ledenadmin-assistent, draft-emails, web-form fraude-rem | Strong second-tier AI. Needs the EU-endpoint plumbing battle-tested first. | M |
| 13 | Strangler Waves B then C (CRUD, then finance LAST) | Finance migrates only once everything else is proven. Engine stays shared C#. | L |
| 14 | Nalatenschap-signalen, only with a completed DPIA | Highest upside per donor but ethically and AVG-gated. | M+ |
| 15 | (Deferred) Postgres evaluation; React frontend | Only after the migration is stable, never coupled to it. | n/a |