← Resources

Agency Client Pipeline Template

An 8-stage pipeline built for the actual shape of agency work - where the deal does not end at "won", scope creep is the silent margin killer, and the proposal stage is where follow-up discipline decides revenue. Ships as copy-paste JSON with guardrail fields and an automated follow-up cadence.

Who this is for

Marketing, design, dev and consulting agencies running retainer or project clients - anywhere from a solo operator to a 30-client shop. Use it when you are setting up a CRM for the first time, or when your current pipeline ends at "closed won" and every client relationship after signature lives in someone's head. If you sell one-off projects with no renewal motion, drop the Renewal stage and keep the rest.

The core opinion: an agency pipeline is a client lifecycle, not a sales funnel. Two-thirds of the stages here sit after the money is agreed, because that is where agencies actually win or lose - onboarding speed, scope discipline, and renewal timing.

The 8 stages

Each stage has one entry rule and one exit rule. If a deal cannot satisfy the exit rule, it does not move - no gut-feel promotions.

StageWhat it meansExit when
InboundA lead landed - referral, form, DM. Triage within 24 hours.Discovery call is booked on the calendar.
DiscoveryCall held. You are qualifying budget, scope and fit both ways.Proposal promised with a named send date.
ProposalProposal sent. The follow-up cadence below is running.Verbal yes, or a clear no.
ContractContract and first invoice are out.Countersigned and first payment received.
OnboardingKickoff held, access collected, comms channel opened.First deliverable shipped.
ActiveRetainer running. Monthly reporting, quarterly reviews.Renewal window opens - 60-90 days before contract end.
RenewalRenewal or expansion conversation in progress.Renewed (back to Active) or lost (Churned).
ChurnedTerminal. Record the reason - it is your best sales research.Never. Deals lost pre-contract land here too, with a loss reason.

Set the deal's value_cents to twelve times the monthly retainer (or the full project fee) so pipeline totals mean annualized revenue, not arbitrary numbers.

Scope-creep guardrails as fields

Scope creep is not a personality problem, it is a data problem: nobody wrote down the boundary, so nobody can point at a breach. Three fields fix that, and three more keep the lifecycle honest:

FieldTypeWhy it exists
retainer_centscurrencyThe monthly boundary in money terms. What the client pays for.
scopetextOne paragraph: deliverables, volumes, exclusions. If it is not here, it is out of scope.
account_ownertextThe one person allowed to say yes to extra work. Creep thrives on ambiguity about who decides.
out_of_scope_requestsnumberMonthly counter. At three, you open a repricing conversation - with evidence.
contract_enddateDrives the Active-to-Renewal move. No date, no renewal motion.
loss_reasontextFilled on every move to Churned. Free sales research.

The operating rule is simple: any request not covered by scope gets logged (increment the counter, add an activity note), then either declined, deferred, or priced. Never silently absorbed. For a full field kit beyond deals, see the agency CRM data model.

The proposal follow-up hook

Proposal is the leakiest stage in every agency pipeline, and the fix is boring: three follow-ups at day 2, day 5 and day 12, sent automatically, stopped automatically. The cadence enrolls the deal's primary contact when the deal enters Proposal, and exits the moment the stage changes - so a signature on day 3 kills the day-5 email before it sends. The copy in the artifact below is a starting point; more variants live in the follow-up sequence templates, and the stage moves themselves can fire playbooks via automation recipes.

The template

Everything above as one JSON document: the pipeline (valid POST /v1/pipelines body), the six deal fields (each a POST /v1/fields body), and the follow-up cadence (valid POST /v1/sequences body). Field names and shapes match the Relm API exactly; in any other CRM, recreate them by hand.

{
  "pipeline": {
    "key": "agency_clients",
    "name": "Agency Clients",
    "stages": [
      { "key": "inbound", "label": "Inbound" },
      { "key": "discovery", "label": "Discovery" },
      { "key": "proposal", "label": "Proposal" },
      { "key": "contract", "label": "Contract" },
      { "key": "onboarding", "label": "Onboarding" },
      { "key": "active", "label": "Active" },
      { "key": "renewal", "label": "Renewal" },
      { "key": "churned", "label": "Churned" }
    ]
  },
  "fields": [
    { "object": "deal", "key": "retainer_cents", "label": "Monthly retainer (cents)", "data_type": "currency" },
    { "object": "deal", "key": "scope", "label": "Scope of work", "data_type": "text" },
    { "object": "deal", "key": "account_owner", "label": "Account owner", "data_type": "text" },
    { "object": "deal", "key": "contract_end", "label": "Contract end date", "data_type": "date" },
    { "object": "deal", "key": "out_of_scope_requests", "label": "Out-of-scope requests this month", "data_type": "number" },
    { "object": "deal", "key": "loss_reason", "label": "Loss / churn reason", "data_type": "text" }
  ],
  "proposal_followup_sequence": {
    "name": "Proposal follow-up",
    "trigger": {
      "event": "deal.stage_changed",
      "filter": [{ "field": "stage", "op": "eq", "value": "proposal" }]
    },
    "exit_when": [{ "field": "stage", "op": "neq", "value": "proposal" }],
    "steps": [
      {
        "wait_days": 2,
        "subject": "Any first reactions to the proposal?",
        "body": "<p>Hi {{first_name}},</p><p>The proposal went out two days ago. Happy to walk through it on a 15-minute call, or answer questions right here. Anything unclear on scope or pricing?</p>"
      },
      {
        "wait_days": 3,
        "subject": "The clause most clients ask about",
        "body": "<p>Hi {{first_name}},</p><p>Most clients ask about the same section: what happens when scope grows mid-retainer. Short answer: we flag it, price it, and you approve before anything gets built. Want me to annotate that part of the proposal?</p>"
      },
      {
        "wait_days": 7,
        "subject": "Should I close this out?",
        "body": "<p>Hi {{first_name}},</p><p>If the timing is wrong, no problem - say the word and I will close the file and check back next quarter. If it is still live, what is the one blocker I can remove this week?</p>"
      }
    ],
    "enroll_existing": false
  }
}

Notes on the shapes: wait_days is the delay before that step, so the sends land on day 2, day 5 and day 12 cumulatively. Placeholders like {{first_name}} fill from the enrolled contact. For deal-triggered sequences the recipient is the deal's primary_contact_id, so set it on every deal. Email steps need a connected sending key first (POST /v1/connections); in test mode, sends are simulated and never delivered.

Apply it with your agent

If your CRM is operable by an LLM, you do not click any of this together. Point an MCP client at https://api.relmcrm.com/mcp with your key and paste:

Read my Relm schema. Then, in test mode first:
1. Create a pipeline with key "agency_clients" and the 8 stages from the
   JSON template I pasted below.
2. Register the six deal custom fields from the template via POST /v1/fields.
3. Create the "Proposal follow-up" sequence exactly as specified - trigger
   deal.stage_changed with filter stage eq "proposal", exit when stage
   changes, three email steps.
Show me everything you created, then repeat it in live mode.
[paste the JSON template here]

Or install just the pipeline over REST:

curl https://api.relmcrm.com/v1/pipelines \
  -H "Authorization: Bearer relm_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "key": "agency_clients", "name": "Agency Clients",
        "stages": ["inbound","discovery","proposal","contract",
                   "onboarding","active","renewal","churned"] }'

Full API reference in the docs. The shorthand string array works for stages; labels default to the key.

FAQ

Why not use a standard sales pipeline for agency clients?

A sales pipeline ends at won, and an agency relationship mostly happens after won: onboarding, delivery, renewal. If your pipeline stops at closed-won, the CRM goes dark exactly when scope creep and churn risk begin. This template keeps the deal alive through Active and Renewal so the record keeps earning its keep.

Should Renewal be its own stage or a separate pipeline?

One stage in one pipeline for most agencies under roughly 30 clients. A deal moves from Active to Renewal when the window opens (60-90 days before contract_end) and back to Active on signature. Split renewals into a dedicated pipeline only once a dedicated person owns them full-time.

How do the custom fields actually prevent scope creep?

They make it measurable and assignable. retainer_cents and scope define the boundary, account_owner names the person who enforces it, and out_of_scope_requests counts breaches per month. When the counter hits three in a month, you have a repricing conversation backed by data instead of a vague feeling.

Can I use this template without Relm?

Yes. The stages, fields and cadence are tool-agnostic - recreate them in HubSpot, Pipedrive or Attio by hand. The JSON artifact is shaped for Relm's API so an AI agent can install the whole thing in one pass, but the framework itself is the value.

When does the proposal follow-up cadence stop?

The instant the deal leaves the Proposal stage. Exit conditions are re-checked before every send and again the moment the deal changes, so a client who signs on day 3 never receives the day-5 email.

Install this pipeline in one agent turn

1,000 requests a month on the Free plan, no card. See pricing.

Start free →