our own product · running in production

Subscriber Pilot

From visitor to paid job — in one system. Newsletter sign-up, automated mail, a time-limited offer, booking a slot and payment. Without wiring together five services that don’t talk to each other.

Quarkus + KotlinVue 3 adminPostgreSQLDockerself-hosted or hosted by us

The problem it solves

The usual small-business setup: a form in one tool, the newsletter in another, a booking calendar in a third, payments in a fourth, and “called, wants Saturday” on a sticky note. Nobody can then say which ad brought in the customer who paid yesterday.

Subscriber Pilot keeps the whole journey in one database. Contact, consent, campaign, coupon, booking and payment are one story you can read top to bottom.

The journey

  1. Ad or linkThe campaign is captured from the URL and stays with the contact for good.
  2. Sign-up on your own pageThe widget posts the address; nothing redirects anywhere.
  3. Confirmation emailDouble opt-in. Without confirmation, nothing else happens.
  4. The magnetAn e-book, a price list, a sample — whatever you promised arrives at once.
  5. An offer with a personal couponSent with a delay (a day, say) so it doesn’t tread on the magnet’s heels.
  6. Product page with the live priceThe discount fades over time — and how much is left is visible.
  7. Booking a slotThe calendar offers only slots that are genuinely free.
  8. Payment and confirmationA paid fee turns the tentative invitation into a confirmed one.
  9. The follow-up offerThe next step follows the job — without anyone keeping watch.
[ screenshot: admin: subscriber list ]
Admin — subscribers, their states and campaigns.

What it does

01 Sign-up with double opt-in

The sign-up form is a widget you drop into your page with one line. The address is confirmed by email, and consent is recorded together with language, source and campaign.

02 Automated sequences

Once confirmed, a scheduled series of emails starts — welcome, the magnet, an offer, a reminder. Steps carry conditions, so someone who already bought gets a different branch.

03 Discounts that fade over time

Every recipient gets their own coupon with its own validity. The discount holds at full value for a few days, then falls linearly to zero. The server computes the price — not a countdown in the browser.

04 Booking against a real calendar

Offered slots come from your opening windows minus your real calendar’s busy time minus slots already held. No double bookings.

05 Payment and confirmation

The booking fee goes through a payment gateway; the calendar invitation starts tentative and becomes confirmed once paid. The system holds the state of the job, not your notebook.

06 Incoming mail handling

Replies, bounces and invitation responses are recognised automatically — a hard bounce retires the address, a reply is filed with the person.

07 Multiple languages and salutations

Templates run in several languages and the salutation respects gender and grammatical case. In Czech that is not cosmetic — the wrong form reads as a mail merge gone wrong.

08 The whole journey measured

The campaign stays with the contact from the first visit to the paid job. The numbers go into metrics and dashboards, not into a spreadsheet somebody assembles once a quarter.

It embeds into your site, it doesn’t take it over

The widgets are standalone scripts. They run on your domain, so the form doesn’t look like a foreign inclusion and the browser has no cross-origin questions. The styling and the copy are yours.

your page
<!-- newsletter sign-up -->
<div data-sp-subscribe
     data-title="…"
     data-cta="…"></div>
<script src="/vendor/sp-subscribe.js" defer></script>

<!-- offer with a fading discount -->
<div data-sp-offer data-cta="…"></div>

<!-- booking calendar -->
<div data-sp-booking data-kind="reservation"></div>
[ screenshot: widget: booking a slot ]
Booking widget — a monthly calendar of genuinely free slots.
[ screenshot: widget: offer + countdown ]
An offer with a personal coupon and a countdown to expiry.

Who it is for

Technically

BackendKotlin + Quarkus (Java 21), Hibernate/Panache, Gradle
AdminVue 3 + Vite, Google sign-in, on a separate protected vhost
DatabasePostgreSQL, schema and data both versioned through Flyway
Mailtemplates in the database (composed from blocks), an outgoing queue in the DB with retries and an attempt log — survives a server restart
Widgetsstandalone scripts on the client’s domain, configured through data-* attributes
DeploymentDocker images from CI with the version pinned — no “it updated itself”
Multi-brandone build, many tenants: each with its own database, domain, copy and keys
Hostingon your server or on ours; Prometheus-format metrics, dashboards and alerts on request
Integrationspayment gateway, calendar over CalDAV, incoming mail, file storage

What is yours and what is ours: the system is our product, but it runs with your domain, your database and your copy. The contacts are yours — and can be exported at any time.

Getting started

  1. A short callWe go through what you sell and where the customer journey leaks.
  2. SetupWe prepare the installation, connect the domain, calendar and payments, and deploy the widgets.
  3. Copy and sequencesWe write the emails and the offer with you — or you write them yourself in the admin.
  4. Launch and tuningWe run the campaign and look at the numbers, not at impressions.
Book a demo info@sourcepaint.cz