SNE Częstochowa · case study

Seven weeks to move a community’s courses off the director’s phone: the app rebuilt on the backend that already worked, with sign-up, payment, crew and settlement running through it.

SNE Częstochowa runs retreat courses for hundreds of participants a year, organized by volunteers across ten local communities. Sign-ups came through an old website form, payments were matched against bank statements by hand, and each course ran on the director’s phone calls. We rewrote their app natively, kept the backend, and put every step of a course into it.

operations into software
7 weeks
from decision to live app
Seven weeks from the decision to rewrite the app to the new version in the stores. Online payments switched on two days later and took their first payments within a day.
backend test functions
66 799
backend test functions, run in CI on every change
The backend was kept and extended rather than rewritten: every original data model is still in place, and the automated tests grew twelvefold alongside the new features.
the organization
100s a year
course participants, across 19 courses a season
Hundreds of members in dozens of volunteer groups, and hundreds of course participants a year, now run through one system: the season’s courses, their sign-ups, payments and settlements.

SNE Częstochowa is a Catholic evangelization community that has run retreat courses and events since 2011, across ten local schools, by volunteers. We built its first app, then rebuilt it in seven weeks and moved the organization’s courses into it, from the sign-up to the settlement. The app is what people see. The process is what changed.

Payments that match themselves

Online payments land on the participant’s record automatically, instead of someone matching bank statements to course lists.

Sign-up without a coordinator

People sign up in the app or from the website, answer the course’s own questions, and get every follow-up message on schedule.

One view of the organization

Every course’s stage, every payment and every member’s history in one place, instead of on the director’s phone.

The Situation

SNE is not a small operation. Hundreds of members are organized into dozens of groups across ten local schools, each group with its own leaders. Hundreds of people take part in its courses every year, and every course is staffed by a volunteer crew. Every course follows the same arc: preparation, sign-up, checking who has paid and who is coming, the course itself, then a settlement of money and attendance and a review. The community has run that arc for years. What it ran on was people.

Sign-ups arrived through a form on a website more than a decade old. Each one sent a confirmation to the participant and a copy to a shared mailbox, with a promise that details would follow two weeks before the course; a volunteer with access to that mailbox removed cancellations by hand. Payment meant a bank transfer, and one person with access to the account matched transfers against each course’s own list. Crew members applied through a separate online form. Who had attended or served on which course, and who belonged to which group when, was spread across an old member database, group lists and spreadsheets. The state of the whole organization was visible to one person, on one phone.

The community already had an app: we built its first version a year earlier, for news, events and groups. It ran inside a web view, and its history was a list of workarounds for the framework rather than for the product. The course work still happened outside it.

What We Did

Seven weeks to the stores

A native rewrite of the app, from the decision to rebuild to the App Store and Google Play.

Payments from day one

Online payments switched on two days after the release and took their first payments within a day.

Nothing thrown away

Every original data model kept and extended, with automated tests grown from 66 to 799.

We rewrote the part that was fighting its framework and kept the part that worked. The app was rebuilt natively on Expo, with the old app as the reference for how every screen should behave. The Django backend stayed and grew: every original data model kept, new modules for messaging and payments, and the process rules added on top. A small senior team did it, a lead developer and QA, with AI doing much of the typing. The first working version of the new app, from sign-in to the course catalogue and participant lists, came out of Claude Code in the first two days, built against architecture decisions written before any code. The remaining weeks went into what makes software like this hold: the rules of the process, the tests, QA and review.

The course lifecycle became something the software enforces rather than something the director remembers. A course moves through its stages on its own dates: registration opens and closes when it should, and a course that has ended moves itself into settlement overnight. Settlement cannot be submitted until attendance is marked, the finances are in and the required summary questions are answered.

A course page in the app: dates, a parish location in Częstochowa, registration open with its deadline, the price, and a button to apply to join the crew. A participant’s record as the course manager sees it: signed up, attendance not yet confirmed, the price option, a crew toggle, and the payment due.

Course details open to all participants, and participation management layer for manager.

Sign-up and payment now happen in one place. The community’s website lists the season’s courses straight from the platform and hands the sign-up to it, with each course’s own questions: dietary needs, parish, previous courses. Payment runs online through Tpay and is matched to the participant automatically, with a bank transfer as the fallback. Crew members owe nothing, as a rule in the system rather than a note to the treasurer. Members apply to serve on a course from the app, and the director approves or declines.

Every new course starts with a default schedule of six messages, from the sign-up confirmation to the note after the course, plus messages to all participants or the crew by email or SMS. Each member carries one history: the courses they attended or served on, their service roles, and the groups they belonged to over time.

A course’s settlement screen: attendance incomplete, finances complete, summary incomplete, a comment, and a warning listing what must be done before it can be submitted for approval. A new message to everyone on a course, with a channel selector set to email, a subject and a message body.

A settlement that will not submit until attendance and the required summary answers are in, and a message to everyone on the course.

What Moved

The organization’s courses now run through one system instead of forms, mailboxes, bank statements and phone calls:

  • Sign-up: from a web form and a shared mailbox to a self-service sign-up, in the app or from the website, with the course’s own questions.
  • Payment: from bank statements matched by hand to online payments matched automatically. They took their first payments within a day of switching on.
  • Crew: from a separate form and phone calls to a request in the app that the director approves.
  • Messages: from emails written per course to a schedule every course starts with.
  • Settlement: from an ad hoc reckoning per course to a stage every course enters when it ends, which will not close with anything missing.
  • Oversight: from one person’s phone to every course’s stage visible in the app.

Underneath, the season’s 19 courses sit on a backend that was extended, not replaced, with its automated tests grown from 66 to 799 and checks that run on every change.

your system next

If This Sounds Like Your Codebase, start with a call.

A free 30-minute call scopes the next step, for a system like this one, usually the audit: a diagnosis of the code you actually have, free for now, report in hand before you commit to anything further.

newsletter

Notes on Building High-Quality Software

A short founder’s note and a digest of what we’ve published, sent only when there’s something worth the inbox.

No sequence · Unsubscribe in one click