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.

YEAR
2026 — present
TYPE
Own product · Web platform
ROLE
Creator & Developer
VOTO POR IDEIAS: o site no computador e no celular
1,800+
quizzes completed in 17 days (GA4 floor)
Fonte: The product's own Google Analytics 4
108
results pages generated from the TSE catalog
26
versioned migrations, applied by a GitHub Action
223
automated tests

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.

Voto por Ideias home page in the runoff, with both finalists side by side
Runoff home: both finalists at the same size, same color, in alphabetical order — neutrality as a layout rule.
Amazonas results page with the governor runoff and the first-round result
Results by state: which races exist, where there is a runoff, candidates and votes all come from the TSE catalog and files, with no manual input. Alphabetical order until the TSE declares a winner.
Ideology test topic page showing each finalist's position with its source
Ideology topic page: each finalist's position on the same question, with the excerpt from the government plan.
A quiz question on mobile, with a plain-language explanation and agree, don't know and disagree options
A quiz question: the proposal in plain language, without the name of who supports it — names only appear in the result.
Per-topic affinity bars for each candidate
Per-topic affinity: the same result favors one candidate on the economy and the other on health.
Paid report offer with a preview of two statements from the user's own quiz
Offer with a preview: two real statements from the user's own quiz, instead of a feature list (demo answers).
Checkout with Pix and card and a trust block
Checkout: Pix and card via Mercado Pago, plus the four answers a visitor from Google needs before paying.

What the data showed.

A live product produces numbers. These changed decisions.

Bar chart of daily visitors by source between September 30 and October 16, 2026
Daily visitors by source (labels in Portuguese), from the daily CSVs the Action commits to the repository. Search carried the first round; the biggest day came from a story with a link posted by another Instagram account, not from the site's own profile.

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.

Next.jsReactTypeScriptSupabaseMercado PagoGitHub ActionsGA4 Data APIBrevo

Have a similar project?

Tell me the problem — I answer personally.

See it live.

Public pages of the product, open to anyone.