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.
our own product · running in production
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.
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 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.
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.
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.
Offered slots come from your opening windows minus your real calendar’s busy time minus slots already held. No double bookings.
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.
Replies, bounces and invitation responses are recognised automatically — a hard bounce retires the address, a reply is filed with the person.
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.
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.
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.
<!-- 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> | Backend | Kotlin + Quarkus (Java 21), Hibernate/Panache, Gradle |
|---|---|
| Admin | Vue 3 + Vite, Google sign-in, on a separate protected vhost |
| Database | PostgreSQL, schema and data both versioned through Flyway |
| templates in the database (composed from blocks), an outgoing queue in the DB with retries and an attempt log — survives a server restart | |
| Widgets | standalone scripts on the client’s domain, configured through data-* attributes |
| Deployment | Docker images from CI with the version pinned — no “it updated itself” |
| Multi-brand | one build, many tenants: each with its own database, domain, copy and keys |
| Hosting | on your server or on ours; Prometheus-format metrics, dashboards and alerts on request |
| Integrations | payment 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.