Hristiyanski tsentar Sofia is a church in Lyulin with a Sunday service, a children’s ministry, two Bible schools and home groups. They wanted a website that would look unlike any other church website in Bulgaria, and through which people could donate by card without having to copy out an IBAN.
This was the most demanding website we have built in this category, for three separate reasons.
The first is the home page. Instead of a menu at the top, it features a full-length photo of the pastors, with six round buttons around them: Family, Team, Bible Schools, Learn More, Donate and Give Your Life. The circle is the least forgiving shape in web design because it does not behave like a rectangle when the screen changes. Six circles that had to sit around a person in a photo without covering them, overlapping one another or becoming harder to read on a phone or a wide monitor were reworked more times than the rest of the page combined. Beneath them, we added a countdown that automatically calculates how long remains until the next service.
The second is donations. We did not attach a button to somebody else’s platform; we wrote our own API: Node and PostgreSQL, separate from the website. The donor chooses a one-time donation or a partnership, and the partnership can be monthly or weekly, in other words, a Stripe subscription, not a one-time payment. Each payment is recorded in the database only after Stripe confirms it by webhook, not when the browser returns to the thank-you page, because browsers lie. Stripe sends the same webhook more than once by design, so every event is recorded by its identifier and the second pass records nothing: a duplicate donation cannot appear. The second and every subsequent payment under a monthly partnership arrives as an invoice, not as a new session, and lives in its own table. Anyone who prefers a bank transfer sees the account holder, bank, IBAN and BIC on the same page, and the number can be copied with a single tap.
The third is the design. There is no bought template and no repeated layout: each of the seventeen pages was created separately, with its own colours and structure. The Pistis school has questions and answers, the donation page has four giving declarations, and the children’s ministry, home groups, team and sermons all look completely different. The website went live at ccsofia.com in September 2026.
After launch, we also carried out GEO optimisation: the site is a Vue application, and every page returned zero words to a bot that did not execute JavaScript, in other words, to the bots used by ChatGPT, Claude and Perplexity. We wrote a build-time prerendering process that opens every route in a browser and saves the finished HTML. All seventeen of seventeen pages can now be read by AI search engines.
In October 2026, we also added a custom CMS. The church wanted to change the service times, address, team photos and upcoming events itself, without contacting us for every change, while the English version up to that point had been a machine translation that did not work. We had one requirement: the site’s design and HTML had to remain identical down to the last pixel. We placed Directus on the same database and modelled the entire site as content: 71 collections, each page with its own fields, lists of events, leaders, schools and subjects, and a translation of every text field in both languages.
The editor is visual: the team opens the site inside the panel, points to a piece of text, a time or a photo, a pencil appears, they make the change and press “Save”. About two minutes later, the site is prerendered again, the static HTML for Google and AI search engines is generated again, and the change is live without any of us touching a thing. Sermons continue to arrive automatically from YouTube and can be hidden with a single checkbox. The English is now a proper translation, not Google Translate, and can be edited from the same place.
We gave the client the minimum access possible: an “Editor” role that can see only the visual editor, six lists and their own profile, with no access to donations, users or settings. A password of at least 12 characters, a delay after an incorrect login attempt, and uploads limited to photos and PDF files. Before launch, we automatically compared the DOM of all 17 pages before and after the panel was added: identical.