← work

AFAS integration, authentication, the app rebuild and its native shell, ThuiszorgInHolland

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.

The app’s opening screen on a phone: the ThuiszorgInHolland logo and three cards, log in as employee, log in as client, and vacancies, each with a one-line description in Dutch.
Three doors on one front page.
The employee login on a phone: a green header reading Medewerker App, one e-mail field, a button to send a login code, and a link for help with logging in.
An e-mail address, then a code. No password anywhere.
The client login on a phone: a blue header, a toggle between already logged in before and first time, link my account, and fields for client number and e-mail address.
Clients log in with their client number; the first time also asks the postcode.
The vacancy list in the app: filters for function and city, a count of 41 open positions, and cards for household help in Amsterdam, Haarlem and Eindhoven with hours and an hourly wage range.
The vacancies, read from the same table the recruiters edit.

4 images — swipe or scroll sideways

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.

The website’s front page on a desktop: a headline about reliable home care, a panel with three choices, I am already a client, I am not yet a client, apply, and a line saying more than 800 employees are ready to help.
The website, where the same three audiences arrive.
The website’s careers page: a heading Werken bij, a paragraph about working as household help, in individual support or at the office, and buttons to view vacancies and to apply.
Vacancies published here are the same rows that reach AFAS.

2 images — swipe or scroll sideways

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.