Own product
Voto por Ideias — Compare proposals, with the source of each one
You answer neutral statements on topics like economy, health and security, and the site shows how closely each government plan matches your answers, topic by topic. Every position links to its public source, and your answers stay in your browser only. On election night, the same site becomes live results from the official Electoral Court (TSE) data, by state and by state capital.

- 1,800+
- 108
- 26
- 223
Problem.
Reading government plans is impractical: the documents are long, written in campaign language and hard to compare. An election comparison tool also carries its own risk: storing voters' answers would mean holding a register of political opinion, which Brazilian data protection law (LGPD) treats as sensitive data. And an election site lives on short peaks — it has to be indexed before the date and have something to offer after it.
Solution.
A Next.js and Supabase platform that turns the 2026 government plans into simple statements, with the source of each position in plain sight. It has a general quiz, a runoff quiz, an ideology test, candidate comparison, automatic results built from the TSE catalog, promise tracking with email alerts, and a paid report. The calculation runs in the browser, so the server never receives the answers. Behind it, daily GitHub Actions store metrics, index pages on Google and measure offer experiments.
Result.
Live at votoporideias.com.br. Over 1,800 quizzes completed between Sep 30 and Oct 16, 2026 (GA4 count, which misses people who block tracking), 108 results pages generated automatically from the TSE catalog, and real payments via Pix and card. Revenue and opinion data are not published.
Screens.
Screenshots of the live site.







What the data showed.
A live product produces numbers. These changed decisions.

Analytics missed a third of the sales
GA4 recorded 4 of 6 sales: ad blockers, and the tab a phone discards while the user pays the Pix in the bank app. Sales are now recorded in the database from Mercado Pago's payment notification, and GA is no longer a revenue source.
Price wasn't the bottleneck
Whoever generates the Pix pays (6 of 9); the loss happens earlier: about 4% of people who see the result click the offer. A price cut was reverted the same day; instead came a report preview and an A/B copy experiment, tracked by cookie all the way to the sale.
A day can only be read after 48 hours
The first report for Oct 16 showed 77 visits from Instagram; with the day closed, it was 508. The hypothesis that Instagram converted better fell with the right number. The Action now reprocesses the day before yesterday.
A visual bug hidden for two months
The result's affinity bars used an entrance animation that was only triggered on page mount — and the result appears later. They were invisible since August, and only a user's screenshot revealed it.
The hard part.
Every project has a point where the obvious solution doesn't cut it. Here, it was these.
Privacy by design: not receiving what you shouldn't have to protect
Political conviction is sensitive personal data under the LGPD. Instead of protecting a database of answers, the decision was not to have one. Answers live in sessionStorage, the calculation runs on the client, and closing the tab erases everything. Even the paid report is calculated in the browser, so the purchase and the answers never meet on the server. The only way out is opt-in: an anonymous contribution that just adds +1 to per-question counters.
Neutrality as a calculation and layout rule
A 'don't know' or skipped answer never counts for or against anyone; a mixed position is worth half a point; an important question weighs double; weaker evidence weighs less. Without a source, the site says 'no public position' — it never guesses. On screen, the finalists have the same size and color, in alphabetical order until the TSE declares a winner.
Results with no manual input: the TSE as the source of truth
The TSE publishes a catalog of every election, office and region. The site reads it and figures out on its own where there is a runoff, generating 108 pages (states, governor, senator, capitals). In the first round the TSE also marks runoff candidates as 'elected'; the written status is what tells them apart — a dry run of the election-night Action caught this before the day.
Charging without linking the purchase to the answers
The card becomes a token in Mercado Pago's own form; the server knows someone bought, not what they answered. Paid access is a signed cookie. Each approved sale becomes a database row (id, product, amount, experiment variant — nothing personal), written through three non-duplicating paths: Mercado Pago's notification, the status check, and the approved card.
What I did.
- End-to-end product: quiz, result, paid report, comparisons, live results and promise tracking
- Generic live results from the TSE catalog: state, office and capital as parameters, ready for municipal elections
- Data pipeline: a daily Action stores GA4, Search Console and sales in the database and in CSV, and posts the report to an issue
- A/B experiments without an external tool: cookie-assigned variant, attached to events and to the payment reference
- Mercado Pago checkout (Pix and card), resumable Pix when the browser discards the tab, and payment notifications recording each sale
- Postgres (Supabase) modeling with RLS, migrations applied by an Action, and server-key functions
- Technical SEO: daily indexing through the Search Console API, titles guided by real queries, structured data
- Double opt-in email alerts (Brevo), with the domain authenticated by DKIM
Stack.
Have a similar project?
Tell me the problem — I answer personally.
See it live.
Public pages of the product, open to anyone.