ATTENTIO
Konkretnie: na co idą pieniądze
Podpisów przybywa, ale sam podpis nie opłaci konsultacji prawnej ani wysyłki pism do ministerstwa. Jedna kwota = jedna godzina pracy prawnika.
Wesprzyj petycję2026 · ATTENTIO — Association of Adults with ADHD
ATTENTIO's new petitions and donations service: from a click on a search ad, through a petition signature and a payment, to reminders and monthly support. Designed for adults with ADHD — people a form can easily lose — and built so every step can be measured.
Role End-to-end design and build — Jakub Nowak
See the live petition(opens in a new tab)Scope
Next.js 16 · React 19 · Payload CMS 3 · PostgreSQL + Drizzle · Stripe · Vercel · Cloudflare Workers
One person, nine stages
Stage 1 of 9 · Ad
Google Ad Grants gives non-profits up to USD 10,000 a month of search-ad credit. The service makes sure every click can be traced all the way to a donation.
Sponsored · attentio.org.pl › petycje
Podpisz petycję: Dorosły z ADHD nie przestaje mieć ADHD…
Niech przestanie za to płacić. Podpis zajmie minutę.
/petycje/refundacja-adhd-doroslych?utm_source=google-grants&utm_medium=grants-search&gclid=…
Why it works this way
The attribution path: from click to conversion
Stage 2 of 9 · Petition
An ad paid for this visit, so every pixel above the form is a decision. On mobile the order in the code is the reading order.

Why it works this way

Stage 3 of 9 · Signature
The signature is the page's only conversion, so it always works — even when JavaScript doesn't load.
Why it works this way
Validation in the landing-page bundle (gzip)
Stage 4 of 9 · Thank-you
The thank-you page is the bridge from signature to donation. Its layout follows the order of decreasing cost to the person who just signed.

Wesprzyj nasze działania!
Petycję trzeba dowieźć: prawnik, który napisze stanowisko, spotkanie w ministerstwie, dojazd.
Wybierz kwotę:
Why it works this way
A/B experiment on the ask
„Petycję trzeba dowieźć: prawnik, który napisze stanowisko, spotkanie w ministerstwie, dojazd…”
„Robimy to dla dorosłych z ADHD — żeby diagnoza, leczenie i codzienne sprawy przestały być torem przeszkód…”
Stage 5 of 9 · Donation
The donation form is a decision system: amount, cycle, method, details, consent. Each choice has a rule — and every rule works without JavaScript too. Below are the first three steps with the real rules.
Path: Stripe Checkout · subscription
Why it works this way
Four browser paths, one server core
przygotujWplate()
One core, because two paths building the same return URL in two ways is a recipe for a bug.


Stage 6 of 9 · Payment
One shared rule: payment data never touches the ATTENTIO server. Cards live in Stripe's frames and the BLIK code goes from the browser straight to the operator — which is why the PCI DSS scope is SAQ A.
Metoda płatności
Co miesiąc 100 zł · rezygnacja jednym kliknięciem
Wpłacam 100 złPłatność obsługuje Stripe
01 · Card
Metoda płatności
BLIKPłatność kodem z aplikacji banku
Płatność obsługuje Stripe
02 · BLIK
Metoda płatności
Double-click the side button
Płatność obsługuje Stripe
03 · Wallets
Metoda płatności
Coś nie działa?
Ta sama kwota i ten sam cykl na bezpiecznej stronie Stripe’a.
Zapłać na stronie Stripe’aFormularz renderowany na serwerze — działa bez JavaScriptu
Płatność obsługuje Stripe
04 · Fallback page
Methods
The payment page's shield
PCI DSS scope: SAQ A
Stage 7 of 9 · Booking
Clicking “Pay” books nothing yet. The server action ends at “pending” at most — “booked” is set only by the operator's webhook or the nightly reconciliation.
Dziękujemy za wpłatę!
100 zł · miesięcznie
Server side
Why it works this way
Subscriptions and nightly reconciliation
Stage 8 of 9 · Reminders
Two remarketing channels: our own messages, and server-side signals ad platforms build audiences from.
ATTENTIO
Konkretnie: na co idą pieniądze
Podpisów przybywa, ale sam podpis nie opłaci konsultacji prawnej ani wysyłki pism do ministerstwa. Jedna kwota = jedna godzina pracy prawnika.
Wesprzyj petycjęWhy it works this way
A daily job, hourly steps
Each step has a 36 h catch-up band and a 24 h repeat grace — chosen so nothing is missed and nothing goes out twice:
“A skipped reminder is a loss, a repeated one is harm” — so the token is created before sending, not after.
Stage 9 of 9 · Monthly
“Monthly” is the default across the funnel, but never forced. A one-time donor gets a single offer to switch — and a monthly donor can stop with one click.
100 zł
max(10 zł, gift ÷ 3, rounded to 5 zł)
Proposal35 zła month
Zamienić na 35 zł miesięcznie?30/45 chars
ATTENTIO
Jedna propozycja
Regularna wpłata pozwala planować dłużej niż do końca kwartału — a przy pracy z ministerstwem wszystko trwa dłużej niż kwartał. Wpłatę cykliczną zatrzymujesz albo wstrzymujesz na miesiąc w panelu, jednym kliknięciem.
Ustaw wpłatę miesięcznąWhy it works this way
The “My support” panel
Wpłata miesięczna
100 zł / mies.
Aktywna
“A cancellation maze hits people with ADHD harder.”
More and more people ask an AI assistant instead of searching. The service speaks the assistants' languages: an assistant finds the petition, learns the rules and prepares a donation — and the last step, approving the payment, always belongs to a person.
I'd like to support the petition on reimbursing adult ADHD treatment with 50 zł.
attentio-przygotuj-darowizne · kwotaZl: 50
I've prepared a 50 zł donation to this petition. Open the page and confirm the payment — the amount is already filled in.
attentio.org.pl/petycje/…/wesprzyj · 50 złA person approves the payment
Why it works this way
“The server does NOT charge the card — a person takes the last step.”
One core, thin bindings
The “Ask an assistant” page
Five buttons open popular assistants with a ready question about ATTENTIO's petitions. Copy rule: never “the assistant will pay for you”.
PageSpeed Insights report for the petition page the ads lead to. Speed here is an acquisition cost, not decoration.

Here the design system and accessibility are one decision: for adults with ADHD every needless choice, puzzle and maze is a cost, not a detail.
Motion: Material 3 Expressive springs
Six springs precomputed at build time into CSS linear() curves — exact for any distance, with no JavaScript in the browser. Pick one:
Contrast on orange
Seed #F26430 in the FIDELITY variant: the build asserts the primary container is exactly the seed. Contrast level 0.2 instead of 0 lifts text-on-container pairs from 4.53 to 5.56:1. CI guards 74 pairs and 14 banned ones.
Two-tone focus
No single colour reaches 3:1 on both white and orange — so the ring has two: a dark outline and a light halo. Try it with Tab.
Glyph contract
ĄĆĘŁŃÓŚŹŻ ąćęłńóśźż „” –—
A missing Polish character in a font subset fails the build. Bricolage Grotesque (headings), Onest (text), Atkinson Hyperlegible Next in reading mode — all self-hosted.
12 M3 Expressive shapes
polygon() only — the library went from 30 to 16.8 kB.
Principles that follow from ADHD
Architecture, privacy and quality — designed as carefully as the screens.
One domain, two worlds
The worker also merges two sitemaps into one and serves a short list of app paths from the domain root (llms.txt, verification files). Moving another section of the site means adding its prefix.
Six daily jobs (UTC)
Privacy by design
Every release passes the gates
A red test blocks the release, emergency fixes included. Most gates record a sabotage — a deliberate break proving they turn red. Plus tests in a production-shaped environment and scanners: Snyk, Semgrep, Aikido, Socket, and a malicious-package filter at install time.
The service takes money, so every dependency is part of the payment page. Four scanners and a malicious-package filter answer four different questions — from the moment a package leaves the registry to the release.
package registry
release
Malicious-package filter
Dependency behaviour
Vulnerabilities and data flow
Static analysis, locally
Code, secrets and infrastructure
How findings are handled
The dependency gate in every release
npm run audit
Role End-to-end design and build — Jakub Nowak
Let's talk about this project