Inspiration

Flow Proposals was born from a real freelancer's pain on Workana. The lesson that cost the most wasn't writing bad proposals, it was burning limited "connects" applying to projects we were never going to win, or to clients who post a dozen projects and never hire anyone. On Workana every application is a finite resource. So the real problem isn't writing faster, it's deciding where NOT to apply. We built the tool we wished existed: one that reads a posting and tells you honestly if it's worth your time, then writes a proposal that sounds like you.

What it does

Paste a Workana job posting and in seconds Flow Proposals:

  • Scores the fit 0 to 100 by crossing your skills, the competition (how many proposals already exist), the budget, sweet-spot tech, and seniority red flags.
  • Flags client risk: serial posters who never hired anyone, unverified payment, freshly registered accounts, and scope-vs-budget mismatches (a huge multi-component build for almost nothing).
  • Writes the proposal in the client's language (Spanish, Portuguese, or English, auto-detected), in your voice, with a realistic timeline and a price inside the client's range. It avoids the mistakes that kill proposals: no self-disqualifying, no stiff "Dear Sir," no agency-speak.

A Chrome extension autofills the proposal straight into Workana in one click. Premium users also get automatic discovery of new pre-scored vacancies, full history with status tracking, and clean PDFs.

The difference from "just use ChatGPT": ChatGPT gives you text about any posting. Flow gives you a decision about which postings deserve your time, calibrated on what actually closes on Workana.

How we built it

  • App: Next.js (App Router) + TypeScript + Tailwind, deployed on Vercel.
  • Database: AWS Aurora (PostgreSQL). A real relational model (users, profiles, analyzed jobs, generated proposals, subscriptions, extension tokens, discovery tables) with foreign keys and constraints, not a JSON blob. We developed against Postgres in Docker (Aurora-compatible) and ran the same migrations on Aurora.
  • The brain: the scoring and generation rules are a faithful port of a Python tool used in real Workana applications. Scoring is deterministic (the calibration is the moat); only the final proposal text goes through an LLM, with provider failover.
  • Auth: email and password, session as a signed JWT in an httpOnly cookie.
  • Billing: Stripe with Adaptive Pricing, so each user is charged in their local currency (MXN base, BRL, USD) automatically.
  • Chrome extension (Manifest V3): authenticates with a per-user bearer token (the session cookie is SameSite=Lax and doesn't travel cross-origin to workana.com), reads the posting, calls the same API, and autofills.
  • PDF export with react-pdf, dynamic Open Graph images with next/og.

Challenges we ran into

  • Porting calibrated logic without "improving" it. The scorer and prompts were tuned on real results, so we translated them faithfully to keep the behavior identical.
  • Cross-origin auth for the extension. The session cookie doesn't reach workana.com, so we built a bearer-token system just for the extension.
  • Adaptive Pricing vs static copy. The price on the site has to match what the user pays at checkout in their currency, so we show a local-base price plus a "adjusts to your currency" line to avoid any mismatch.
  • Keeping the LLM honest. Stopping it from self-disqualifying or sounding like an agency took strict prompt rules and a cleanup pass.

Accomplishments that we're proud of

  • A real, complete product, not a demo: deployed on Vercel + Aurora, with real auth, a Chrome extension working on live Workana, freemium with a real Stripe integration, history, discovery, and PDF.
  • The defensible core: a calibrated engine that tells freelancers where NOT to spend their applications. That is product thinking a thin GPT wrapper can't replicate.
  • Multi-language generation (es/pt/en) that matches the client automatically, opening the whole LatAm market including Brazil.

What we learned

  • The hard part of a freelancer's job isn't writing, it's deciding. The highest-value feature is the one that tells you NOT to apply.
  • An opinionated, calibrated engine beats a generic model. Encoding what actually closes on a specific platform is the moat.
  • Shipping the full loop (analysis, generation, extension, billing) end to end on Aurora + Vercel is very doable solo when the data model and the calibration are clear.

What's next for Flow Proposals

  • Distribution to real freelancers across LatAm Workana communities, starting with founder-led content.
  • A referral and affiliate loop, since freelancers trust other freelancers.
  • Sharpening discovery and the free-to-premium upgrade moment.
  • More platforms beyond Workana once the calibration is proven.

Built With

Share this project:

Updates