cd /news/artificial-intelligence/ai-proposal-writer-a-two-stage-promp… · home topics artificial-intelligence article
[ARTICLE · art-77465] src=promptcube3.com ↗ pub= topic=artificial-intelligence verified=true sentiment=↑ positive

AI Proposal Writer: A Two-Stage Prompt Engineering Guide

A two-stage prompt engineering workflow that splits AI proposal writing into extraction and generation phases eliminates generic 'AI smell,' according to a developer who built a dedicated proposal tool using Next.js 14, Supabase, and GPT-4o. The first stage parses a job post into structured JSON fields, and the second stage uses those signals as constraints to generate tailored proposals under 200 words with strict negative rules.

read3 min views1 publishedJul 28, 2026
AI Proposal Writer: A Two-Stage Prompt Engineering Guide
Image: Promptcube3 (auto-discovered)

The secret to high-conversion AI writing isn't the model you use—it's the architecture. After building a dedicated proposal tool, I found that splitting the process into a two-stage workflow (Extraction then Generation) completely eliminates the "AI smell."

The Architecture: Extraction vs. Generation #

The core issue with single-prompting is that the LLM tries to analyze the requirements and write the prose simultaneously, often defaulting to safe, boring templates. By decoupling these, you force the AI to understand the client's pain points before it even thinks about writing a sentence.

Stage 1: Signal Extraction

First, I use a prompt that acts as a data parser. It ignores the "writing" part entirely and just converts the messy job post into a structured JSON object.

const extractionPrompt = ` You are analyzing a freelance job posting. Extract ONLY these fields as JSON:

{ "client_company": "string | null", "specific_problem": "string - the exact pain point described", "desired_outcome": "string - what success looks like", "tone": "formal | casual | urgent", "budget_signal": "string | null - any rate mentioned" }

Job Post: ${jobPost} `;

Stage 2: Proposal Generation

Now that we have the "signals," the second prompt uses that data as a constraint. I implement strict negative constraints (the "NEVER" rules) to kill the generic AI habits.

const proposalPrompt = ` Write an Upwork proposal using this EXACT structure:

OPEN with: "${extracted.specific_problem || 'Your project sounds interesting'}"
Reference their SPECIFIC problem, not your skills
Do NOT start with "Hi" or "I read your post"
PROVE with one quantified result
Example format: "I helped a client [do X] which resulted in [Y]"
Keep it specific, not generic
MATCH their tone: ${extracted.tone}
END with a specific question about their current setup
Example: "Are you currently using [tool]?"
Keep total word count under 200
NEVER start sentences with "I am," "I have," or "I am a"
Client: ${extracted.client_company || 'not mentioned'} `;

Technical Implementation and Lessons #

For the build, I went with a standard modern stack: Next.js 14 (App Router) for the frontend, Supabase for the backend and edge functions, and GPT-4o. I found GPT-4o to be the most reliable for the extraction phase because it handles the JSON formatting without hallucinations.

If you're planning a similar deployment, avoid these mistakes I made:

Latency: Don't wait for the full response. Implement streaming immediately, or your users will think the app has crashed.Efficiency: Cache your extraction results. There's no reason to re-run the extraction prompt if the job post hasn't changed; hash the input and store the JSON.Iterative UI: Add a "regenerate" or "tweak" button from the start. Even with great prompts, users always want a slightly different version.

This two-stage pattern is a massive lever for any AI workflow where you need tailored output from unstructured data. It moves the LLM from "guessing" what to write to "executing" based on extracted facts.

Next Claude Code System Prompt: Why it Stops Asking Permission →

── more in #artificial-intelligence 4 stories · sorted by recency
── more on @next.js 14 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/ai-proposal-writer-a…] indexed:0 read:3min 2026-07-28 ·