# AI Apply - easy.jobs

Case study by Sumaia Aktar · https://sumaia.xyz · 2025-06-01
A job application that talks back

> Replaced a long multi-step application form with a conversational flow, added resume auto-parsing and AI candidate scoring, and found the production bug that was silently swallowing every employer notification.

- Period: 2021 - 2026
- Role: Backend and feature owner, easy.jobs (WPDeveloper)
- Stack: Laravel · PHP · Vanilla JavaScript · Blade · MySQL · Redis · REST APIs
- Live: https://app.easy.jobs

## The problem

easy.jobs is a GDPR-compliant recruitment SaaS. Candidates were abandoning a long application form partway through, and every abandoned form is a hire the employer never sees. The brief was to make applying feel like a conversation rather than paperwork.

## What I built

**The chat engine.** A multi-step conversational flow that walks a candidate through personal details, education, employment history, cover letter, documents, a video answer, screening questions and a quiz, one message at a time. It is plain server-rendered Laravel and vanilla JavaScript; no framework was needed and none was added.

**Resume parsing.** Upload a CV and the parser pre-fills what it can, so the conversation is confirming rather than typing. An AI scoring step then ranks candidates in the employer's pipeline.

**Persistence and safety.** Every answer is saved as it is given, so a candidate who reloads, closes the tab or navigates back resumes where they stopped. Input is validated at entry to block XSS and code injection before anything reaches storage.

**The tail of the pipeline.** Submitting triggers in-app notifications, confirmation emails, pipeline assignment, AI scoring, Slack alerts and Zapier webhooks.

## The bug

For a period in production, that tail stopped. Applications saved correctly, candidates saw a success message, and employers were never told. There was nothing in any log, which is what made it dangerous: the system was not failing, it was succeeding at the wrong thing. I traced it, fixed it, and then changed how the pipeline reports on itself so that "nothing happened" is now a recorded event rather than silence. I wrote more about this in [the note on silent failures](/notes/the-bug-that-failed-silently).

## What I learned

The most expensive bugs are the ones that look like success. Side effects need their own assertions.
