How to Automate Freelance Proposals and Invoices with AI
>This covers proposals and invoicing. OpenClaw: The Money-Making Guide includes the full 5-tool freelancer operations stack plus 6 other agent builds.

OpenClaw: The Money-Making Guide to AI Agents
Build 7 AI Agents That Earn $3K-$10K/Month
Summary:
- Build a proposal generator that matches your portfolio to client briefs automatically.
- Automated invoice generation with PDF delivery and payment tracking.
- Escalating payment reminder system (friendly, firm, final) that chases late invoices for you.
- Passive time tracking that infers hours from calendar events and git commits.
A freelancer billing $150/hour who spends 15 hours per week on admin is burning $117,000/year on work that does not generate revenue. Proposals, invoices, client status updates, payment follow-ups, time tracking. None of it is billable. All of it is mandatory.
Assumption: $150/hr rate, 15 hrs/week admin. Adjust both numbers to your rate and admin load. At $75/hr and 8 hrs/week, the burn is $31,200/year. The automation savings scale proportionally.
Those numbers are not hypothetical. A 2026 survey from SchedulingKit found freelancers spend 6.2 hours per week on scheduling and admin alone, with only 50-70% of total work hours being billable. And 47% of freelancers say scheduling back-and-forth is their single biggest admin drain. The automation payoff: freelancers who automate scheduling report a 23% revenue increase.
This tutorial automates the worst parts. You focus on the work clients pay for. The AI agent handles everything around it.
How does the proposal generator work?

Feed it three things: the client brief, your portfolio, and a template. It produces a complete proposal in 2 minutes. You spend 10-15 minutes editing.
First, build a portfolio database the generator can reference:
# portfolio.json -- your work history for proposal matching
PORTFOLIO = [
{
"client": "Acme Corp",
"project": "API Redesign",
"result": "Reduced response times by 73%, handled 5x traffic",
"duration": "6 weeks",
"value": "$12,000",
"tech": ["Node.js", "PostgreSQL", "Redis"],
"category": "backend"
},
{
"client": "StartupXYZ",
"project": "Mobile App MVP",
"result": "Launched in 8 weeks, 10K downloads month one",
"duration": "8 weeks",
"value": "$18,000",
"tech": ["React Native", "Firebase"],
"category": "mobile"
}
]
def match_portfolio(brief_keywords, portfolio=PORTFOLIO, top_n=3):
"""Match client brief to relevant portfolio items."""
scored = []
for item in portfolio:
relevance = sum(
1 for kw in brief_keywords
if kw.lower() in str(item).lower()
)
if relevance > 0:
scored.append((relevance, item))
scored.sort(reverse=True)
return [item for _, item in scored[:top_n]]
# Client wants a Node.js API -- match to relevant work
matches = match_portfolio(["Node.js", "API", "backend"])
# Returns: Acme Corp API Redesign (most relevant)
The portfolio matching is what separates this from generic AI proposal tools. HoneyBook and Accordio generate proposals from templates. This system pulls YOUR specific results with YOUR specific numbers. “Reduced response times by 73%” sells better than “extensive experience with APIs.”
Minimal portfolio schema:
{
"projects": [
{
"client_industry": "fintech",
"deliverable": "REST API + React dashboard",
"result": "Reduced processing time from 4 hours to 12 minutes",
"tags": ["api", "react", "performance"]
}
]
}
Three fields per project is enough. The agent matches tags to client brief keywords.
How do you generate the actual proposal?
The generator uses a structured prompt that produces sections clients expect:
async def generate_proposal(client_name, company, brief, budget_range=None):
"""Generate a complete proposal from client brief + portfolio."""
relevant_work = match_portfolio(brief.split())
prompt = f"""Generate a freelance proposal.
Voice: professional, confident, specific. Never generic.
CLIENT: {client_name} ({company})
BRIEF: {brief}
RELEVANT PAST WORK:
{chr(10).join(f'- {w["client"]}: {w["project"]} -- {w["result"]} ({w["value"]})'
for w in relevant_work)}
BUDGET: {budget_range or "Not discussed yet"}
Sections required:
1. Executive Summary (2-3 sentences. Restate their problem, your solution.)
2. Proposed Approach (3-5 numbered phases with deliverables)
3. Timeline (realistic dates with milestones)
4. Investment (pricing broken down by phase)
5. Why Me (cite the specific past work above with real numbers)
6. Next Steps (one clear call to action)
Tone: like you've done this 100 times.
No hedging. No "I think." No "I believe."
State what you will deliver and when."""
proposal = await generate(prompt=prompt, model="premium", temperature=0.4)
return proposal
# Generate a proposal in ~2 minutes
proposal = await generate_proposal(
client_name="Sarah Chen",
company="GrowthCo",
brief="Need a Node.js API that integrates with Stripe for subscription billing",
budget_range="$8,000-$12,000"
)
The premium model is worth it here. A proposal is a sales document. The difference between a generic proposal and one that cites specific results from similar projects is the difference between “we’ll get back to you” and a signed contract.
How do you automate invoicing and payment tracking?
The invoice machine generates, sends, and tracks. Three parts.
Part 1: Invoice generation
from datetime import datetime, timedelta
def generate_invoice(project, line_items, tax_rate=0):
"""Generate an invoice from project data and line items."""
invoice = {
"number": f"INV-{datetime.now().strftime('%Y%m%d')}-{project['id'][:4]}",
"date": datetime.now().isoformat(),
"due_date": (datetime.now() + timedelta(days=30)).isoformat(),
"client": {
"name": project["client_name"],
"company": project["company"],
"email": project["client_email"]
},
"items": [
{
"description": item["description"],
"hours": item.get("hours", 1),
"rate": item.get("rate", project["hourly_rate"]),
"amount": item.get("hours", 1) * item.get("rate", project["hourly_rate"])
}
for item in line_items
]
}
invoice["subtotal"] = sum(i["amount"] for i in invoice["items"])
invoice["tax"] = round(invoice["subtotal"] * tax_rate, 2)
invoice["total"] = invoice["subtotal"] + invoice["tax"]
return invoice
# Generate invoice for 18.5 hours of backend work
inv = generate_invoice(
project={"id": "acme-api", "client_name": "Sarah Chen",
"company": "GrowthCo", "client_email": "sarah@growthco.com",
"hourly_rate": 150},
line_items=[
{"description": "API development -- Sprint 1", "hours": 13.5},
{"description": "Stripe integration", "hours": 5.0}
]
)
# Total: $2,775.00 due in 30 days
Part 2: Payment tracking with escalating reminders
This is the part freelancers need most. Chasing money is emotionally draining. The system removes you from the loop entirely.
REMINDER_SCHEDULE = [
{"days_after_due": 3, "tone": "friendly",
"template": "Just a friendly reminder that invoice #{number} "
"was due on {due_date}. Happy to help if there are questions!"},
{"days_after_due": 10, "tone": "firm",
"template": "Following up on invoice #{number}, now 10 days past due. "
"Please let me know when payment will be processed."},
{"days_after_due": 21, "tone": "final",
"template": "Invoice #{number} is now 21 days overdue. Per our contract, "
"a late fee of {late_fee_pct}% applies after 30 days. "
"Please process at your earliest convenience."}
]
def check_overdue_invoices(invoices):
"""Check for overdue invoices and return needed reminders."""
reminders_to_send = []
today = datetime.now()
for inv in invoices:
if inv["status"] == "paid":
continue
days_overdue = (today - datetime.fromisoformat(inv["due_date"])).days
if days_overdue <= 0:
continue
for reminder in REMINDER_SCHEDULE:
if (days_overdue >= reminder["days_after_due"]
and reminder["days_after_due"] not in inv.get("reminders_sent", [])):
reminders_to_send.append({
"invoice": inv,
"reminder": reminder,
"days_overdue": days_overdue
})
break # Only send one reminder at a time
return reminders_to_send
The tone escalation handles the emotional labor. Day 3 is warm. Day 10 is direct. Day 21 mentions the late fee clause from your contract. You never write an awkward “hey, just checking on that payment” email again.
Data privacy: Client briefs and invoices contain sensitive business information. Never send raw client data through a third-party API without permission. Use local processing where possible. If using cloud APIs, strip client names and dollar amounts before sending. Store invoice data encrypted at rest.
The three reminder templates (friendly day-3, firm day-10, final day-21) are in the book along with 4 additional templates: initial invoice email, scope change notification, project completion summary, and quarterly retainer review.
What broke when I built this?
Problem 1: Proposals cited the wrong portfolio items. The keyword matching was too simple. A client asking about “API performance” matched a project about “social media content performance.”
The fix: add category tags to portfolio items (backend, mobile, frontend, consulting) and filter by category before keyword matching. Relevance went from 60% to 95%.
Problem 2: Invoice reminders went to the wrong person. One client had a billing department separate from the project contact. The reminder went to the project manager, who had no authority to approve payments.
The fix: add a billing_email field to project records, separate from client_email. The invoice system uses billing contacts. The status update system uses project contacts.
Problem 3: Time tracking overestimated hours. Calendar events include lunch meetings and internal calls that are not billable. Git commits at 2am distorted the “development hours” calculation.
The fix: tag calendar events as billable/non-billable. For git-based tracking, count distinct days with commits rather than trying to infer hours from commit timestamps. A day with commits equals the average daily rate from your calendar data.
What should you actually do?
- If you spend 5+ hours/week on proposals: build the portfolio database first. Match quality depends on good data. Add every past project with specific results and numbers. Then connect the proposal generator.
- If you hate chasing payments: implement the reminder system this week. It takes 30 minutes to set up and handles the worst part of freelancing automatically.
- If you bill hourly and lose track of time: start with the calendar-based tracker. Tag billable events for one week. That data becomes the baseline for passive tracking.
bottom_line
- Freelance admin eats 15+ hours per week for most solo operators. That is $117,000/year at $150/hour. Cutting it by 80% reclaims $93,600 in billable time.
- The proposal generator is only as good as your portfolio database. Put real numbers in, get real proposals out. “Reduced response times by 73%” wins contracts. “Extensive experience” does not.
- Automate the payment chase first. It costs nothing, saves the most emotional energy, and pays for itself the first time a day-3 reminder triggers a same-day payment.
Frequently Asked Questions
How much time can you save by automating freelance admin?+
A freelancer billing $150/hour who spends 15 hours/week on admin burns $117,000/year on non-billable work. Cutting that by 80% reclaims 12+ hours per week, worth $93,600 annually at that rate.
Can AI write proposals that actually win clients?+
AI generates the first draft in 2 minutes. You spend 10-15 minutes editing for voice and accuracy. The proposal pulls real results from your portfolio database, so the 'Why Me' section has specific numbers. Quality is high because the inputs are your actual work history.
How does the automated payment reminder system work?+
Three escalating emails: friendly at day 3, firm at day 10, final notice at day 21. The tone escalation is automatic. Most freelancers hate chasing payments. The system removes the emotional friction entirely.
More from this Book
How to Turn One Idea into 30 Posts with AI Agents
Build a content multiplication pipeline that takes a single idea and generates platform-optimized posts for Twitter, LinkedIn, and newsletters automatically.
from: OpenClaw: The Money-Making Guide to AI Agents
How to Run OpenClaw and Claude Code as a Two-Agent Team
Set up a practical two-agent workflow where OpenClaw handles operations and Claude Code handles development. Handoff pattern, morning routine, and real limits.
from: OpenClaw: The Money-Making Guide to AI Agents
How to Build a Prediction Market Signal Detector
Build an AI agent that cross-references Polymarket data with news feeds to find mispriced markets. Signal detection code, risk rules, and alert system.
from: OpenClaw: The Money-Making Guide to AI Agents
How to Sell AI Agent Setups for $3K-$5K Each
Package your OpenClaw skills into a consulting business. Exact delivery process, pricing models, and the client acquisition playbook for agent services.
from: OpenClaw: The Money-Making Guide to AI Agents