ThuiszorgInHolland: connecting the care app to AFAS

I worked with two in-house developers on the connection between a home-care organisation’s app, login and AFAS system. My work covered recruitment integration, authentication, the app rebuild and its native shell.
Care workers need to find shifts and set their availability. Clients need to check their care log or change a visit. Applicants need their details to reach recruitment. I joined ThuiszorgInHolland in March 2026 to connect those tasks to AFAS, the system the office already used.
The in-house team built the public website and office portals. My responsibility was the seam between AFAS, authentication and the app, including rebuilding the app and wrapping it for iOS and Android.
One backend for the app and the website
The first app had a server of its own, largely forwarding requests to the website. I rebuilt it as a React app that calls the website directly. That gave the web and native versions one backend for business rules and integrations.
The user-facing tasks stay small: sign up for a nearby shift, pause care for a holiday, report a missed visit. Recruitment connects a submitted application to the right vacancy in AFAS, including the CV. An AFAS failure is recorded for the office to resolve after the candidate has received confirmation.
Real personnel data changes the design
Access follows an hourly AFAS sync. Someone leaving the organisation should lose access without an administrator maintaining a second staff list. Every request checks whether the account is still active.
The difficult part was the data in that list. Many care workers did not have a maintained work email address. After a go-live attempt exposed the problem, the office chose to use private addresses first. Shared addresses need attention too: when two staff records have the same address, the system reports the conflict instead of guessing who is signing in.
A partial AFAS export must not remove everyone’s access. A sync that would delete more than a fifth of the employee table stops and reports the problem. The go-live dry run covered records for 979 active employees with a login address and 7,851 clients.
Check the whole route
Testing account deletion revealed that clearing a client’s email did not invalidate an existing session. I added a live account check and a revocation timestamp so an old session cannot reopen the care log.
The app, website and AFAS each hold part of the workflow. Testing what happens across their boundaries was a central part of my work, alongside the team responsible for the rest of the site.