Use casesWorkflow

AI Freelancer CRM Agent

An AI agent that manages your freelance client inbox — triaging messages by urgency, drafting context-aware replies, following up on overdue invoices, and keeping client relationships warm, so you can focus on the actual work.

The problem

Freelancers wear every hat. You are the designer, developer, project manager, accountant, and customer support team — all in one. Email is where client relationships live: project briefs arrive there, feedback comes in there, invoices are discussed there. But managing a client inbox takes real time. Triaging messages, deciding what's urgent, drafting thoughtful replies, following up on unpaid invoices — it adds up to hours every week that you're not spending on billable work.

CRM tools exist, but most are built for sales teams, not solo freelancers. They're complex, expensive, and require manual data entry. What you actually need is something that watches your client inbox, understands context, and handles the routine communication so you can focus on delivering great work.

How an agent solves this

An AI CRM agent operates from your professional email address — like hello@alexdesigns.com. When client emails arrive, the agent analyzes the message, checks the client's history (past projects, payment patterns, ongoing work), and takes the appropriate action: drafting a reply for your approval, sending an immediate acknowledgment, flagging something urgent, or following up on an overdue invoice.

  • Triage incoming messages by urgency and client importance
  • Draft context-aware replies that reference project history and ongoing work
  • Send automatic acknowledgments for time-sensitive requests
  • Follow up on overdue invoices with polite, professional reminders
  • Maintain client relationship context across all conversations

How it works with Robotomail

Robotomail provides the email infrastructure your CRM agent needs. Receive client emails via webhooks, access full conversation history through the API, and send replies — all programmatically, all from your professional domain.

Step 1: Create your professional mailbox

Create mailbox
curl -X POST https://api.robotomail.com/v1/mailboxes \
  -H "Authorization: Bearer rm_your_api_key" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
  "address": "hello",
  "domainId": "dom_yourfreelance",
  "displayName": "Alex — Your Design Studio"
}
JSON

Step 2: Receive and triage client messages

When a client emails your address, Robotomail delivers the message to your webhook. Your agent analyzes the content, checks the client's history, and determines urgency and the best response strategy.

Webhook payload
{
  "event": "message.received",
  "timestamp": "2026-03-22T11:20:00Z",
  "data": {
    "message_id": "11111111-1111-4111-8111-111111111111",
    "mailbox_id": "22222222-2222-4222-8222-222222222222",
    "mailbox_address": "hello@alexdesigns.com",
    "from": "lisa@startupxyz.com",
    "to": [
      "hello@alexdesigns.com"
    ],
    "cc": [],
    "subject": "Urgent — Landing page revisions needed by Friday",
    "body_text": "Hey Alex, the team reviewed the landing page mockups and we need a few changes before the launch on Monday. Can you turn around revisions by Friday EOD? Main changes: hero section copy, CTA button color, and mobile nav layout.",
    "thread_id": "33333333-3333-4333-8333-333333333333",
    "received_at": "2026-03-22T11:20:00Z",
    "attachments": []
  }
}

Step 3: Pull client history for context

Before drafting a reply, your agent can fetch all previous messages from this client to understand the relationship context — past projects, communication style, and any ongoing threads.

Fetch client history
curl https://api.robotomail.com/v1/mailboxes/mbx_hello/messages?from=lisa@startupxyz.com \
  -H "Authorization: Bearer rm_your_api_key"

Step 4: Draft replies and notify you

For urgent messages, the agent sends you a summary with a draft reply to your personal email. You can approve, edit, or let the agent send it automatically based on your confidence settings.

Notify freelancer
curl -X POST https://api.robotomail.com/v1/mailboxes/mbx_hello/messages \
  -H "Authorization: Bearer rm_your_api_key" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
  "to": [
    "alex@personal.com"
  ],
  "subject": "[CRM] Urgent client message — StartupXYZ",
  "bodyText": "Urgent message from Lisa at StartupXYZ:\n\nThey need landing page revisions by Friday EOD (3 days). Changes requested: hero copy, CTA color, mobile nav.\n\nPriority: HIGH (tight deadline + active project)\nClient history: 3 projects completed, $12,400 total revenue, always pays on time.\n\nDraft reply ready — reply SEND to deliver it, or EDIT with your changes.\n\nDraft:\n---\nHi Lisa, got it — I can have the revisions ready by Friday. I'll start with the hero section and mobile nav today and send a progress update tomorrow. Quick question: do you have specific copy for the hero, or should I draft options?\n---"
}
JSON
Send approved reply
# inReplyTo below stands for the fetched message.messageId; see the reply example below.
curl -X POST https://api.robotomail.com/v1/mailboxes/mbx_hello/messages \
  -H "Authorization: Bearer rm_your_api_key" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
  "to": [
    "lisa@startupxyz.com"
  ],
  "subject": "Re: Urgent — Landing page revisions needed by Friday",
  "bodyText": "Hi Lisa, got it — I can have the revisions ready by Friday. I'll start with the hero section and mobile nav today and send a progress update tomorrow.\n\nQuick question: do you have specific copy for the hero, or should I draft a few options?\n\nTalk soon,\nAlex",
  "inReplyTo": "<original-message@example.com>"
}
JSON

Step 5: Automated invoice follow-ups

The agent tracks invoice due dates and automatically sends polite follow-up reminders when payments are overdue. No more awkward manual chasing.

Invoice follow-up
curl -X POST https://api.robotomail.com/v1/mailboxes/mbx_hello/messages \
  -H "Authorization: Bearer rm_your_api_key" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
  "to": [
    "accounts@clientcorp.com"
  ],
  "subject": "Friendly reminder — Invoice #1047 (due March 15)",
  "bodyText": "Hi there,\n\nJust a friendly reminder that Invoice #1047 for $3,200 (Brand Identity Package) was due on March 15. If it's already been processed, please disregard this note.\n\nI've attached the original invoice for reference. Let me know if you need anything from my end to process the payment.\n\nBest,\nAlex"
}
JSON

Key benefits

  • More billable hours. Spend less time managing email and more time doing the work clients are paying you for. The agent handles the communication overhead.
  • Faster response times. Clients get acknowledged within minutes, even when you're deep in focused work. Responsiveness builds trust and retains clients.
  • Never miss a payment. Automated invoice follow-ups mean you get paid on time without the discomfort of manually chasing overdue payments.
  • Client context at your fingertips. The agent pulls full conversation history before drafting replies, so every response is informed by the complete client relationship.
  • You stay in control. The agent drafts and suggests — you approve and send. Set confidence thresholds for automatic sending on routine messages while keeping human review on important communications.

Read the API documentation to get started, or learn more about why we built Robotomail. Get started and set up your freelancer CRM agent in minutes — paid plans come with a 30-day money-back guarantee.

Connect the workflow to a real reply

The webhook's data.message_id is a database ID used to retrieve or deduplicate a message. Fetch it with the GET message endpoint, then use the response's message.messageId (the RFC Message-ID) as inReplyTo. Keep data.thread_id for your application's conversation state. Do not use a database ID or thread ID as a reply header. Stop and investigate if the fetched message has no Message-ID.

Examples use illustrative IDs. Replace them with IDs from your account; never construct an email Message-ID from a database ID. Exchange mail only between your agent and your verified email address. Upgrade to email anyone. See plans for higher limits.

Verify the webhook signature over the raw body, persist the event and deduplicate on the database message ID before acknowledging it. Run your application logic from a durable queue. The database, calendar, CRM and model functions shown above belong to your application.

This shell example fetches an incoming email and builds all required send fields. Set ROBOTOMAIL_API_KEY, ROBOTOMAIL_MAILBOX_ID and ROBOTOMAIL_MESSAGE_ID in your environment. Apply your recipient and approval rules before sending.

# Requires jq. Use mailbox_id and message_id from the verified webhook.
original=$(curl --fail --silent --show-error \
  "https://api.robotomail.com/v1/mailboxes/$ROBOTOMAIL_MAILBOX_ID/messages/$ROBOTOMAIL_MESSAGE_ID" \
  -H "Authorization: Bearer $ROBOTOMAIL_API_KEY") || exit 1

payload=$(printf '%s' "$original" | jq -e --arg body "Thanks, I received your message." '
  .message | if (.messageId | type == "string" and length > 0) then
    {to: [.fromAddress], subject: ("Re: " + .subject), bodyText: $body, inReplyTo: .messageId}
  else error("Original email has no Message-ID") end
') || exit 1

curl --fail --silent --show-error \
  "https://api.robotomail.com/v1/mailboxes/$ROBOTOMAIL_MAILBOX_ID/messages" \
  -H "Authorization: Bearer $ROBOTOMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary "$payload"

Read receive and reply and webhook verification for the full setup.

Ready to build this?

Create a mailbox

Create a mailbox and connect one useful workflow. Your application controls the agent and its actions.