Skip to content
ConduitConduit

Quote Aging Tracker

A worked example of an advanced workflow: a Claude-managed scheduled agent that, once a week, lists open quotes in ConnectWise CPQ, buckets them by how long they’ve been sitting since they were sent, flags anything approaching its expiry window, and posts an aging digest to Slack. There are no servers and no code to deploy: the agent is a saved prompt plus a schedule plus two MCP connectors, running in Claude’s cloud.

This is the pre-sale counterpart to Contract Renewal Tracker and Pax8 Renewal & License Optimizer: those track revenue at risk after the sale closes, this one tracks revenue still waiting to close in the first place.

The finished workflow runs unattended on a weekly cron. Each run it lists open quotes in ConnectWise CPQ, calculates days elapsed since each quote was sent, groups them into aging buckets, flags quotes nearing their expiration date, and publishes an aging report to Slack, turning a quote pipeline that otherwise ages silently into a standing weekly follow-up list.

Before building, your Claude account needs all of the following:

Requirement Notes
Conduit connector Connected in claude.ai (https://conduit.wyre.ai/v1/mcp). Provides the vendor tools. See Connecting an AI Client.
ConnectWise CPQ connected in Conduit The ConnectWise CPQ vendor connection must be able to read quotes. Verify the exact tool names with conduit__search_tools (query: “connectwise-cpq” or “cpq”) before building — this guide does not hardcode a confirmed literal tool name (see the gotcha below).
Slack connector The first-party Slack connector connected in claude.ai (https://mcp.slack.com/mcp). Provides slack_send_message and slack_create_canvas.
Scheduled routines access Created via the /schedule capability; managed at claude.ai/code/routines.
A destination Slack channel e.g. #sales, plus its channel ID. The Slack connector must have access to it.
  • This guide does not hardcode a confirmed literal ConnectWise CPQ tool name, unlike guides for connectors already used in a published workflow (Autotask, HubSpot, Datto RMM). No other advanced-workflow guide on this site uses ConnectWise CPQ yet, so there’s no prior confirmed reference to reuse. Conduit’s tool-naming convention is <vendor>__<tool> (confirmed pattern from every other guide, e.g. hubspot__hubspot_list_deals), so the CPQ quote-listing tool is expected to follow the same shape, but the exact string must be confirmed via conduit__search_tools at build time, not assumed from this guide.
  • Quote field names (status, sent date, expiry date) are described here in general, industry-standard CPQ terms, not confirmed exact field names. Every quoting system tracks some version of quote status, the date it was sent to the customer, and an expiration date, but the exact field names ConnectWise CPQ’s API returns aren’t confirmed independently of a live call. The build prompt below has the first step read one real quote record and use whatever field names actually come back, rather than assuming this guide’s terminology matches the live payload exactly.
  • ConnectWise CPQ’s underlying API (Quosal Sell) doesn’t expose a lightweight status-check endpoint — per Conduit’s own connector validation code, the cheapest authenticated ping available is a small lookup list (tax codes), not a dedicated health check. This doesn’t block the workflow, just don’t expect a fast “is CPQ reachable” call, use the actual quotes-list call itself as the reachability check.
  • permitted_tools must be populated per connector. A routine with a connector attached but an empty permitted_tools list runs with no tools and silently does nothing.
  • A routine reaches only its attached connectors. Notifications must go through the Slack connector’s tools, not an outbound webhook.
  • Faster-than-hourly cadences are rejected. A weekly cron is well within that limit.

Because the exact CPQ tool identifier and field names aren’t hardcoded here (see the gotchas above), the first two steps have Claude discover them from your live connection before building the routine.

Build me a scheduled Quote Aging Tracker agent. Do all of this end to end:
1. Confirm the Conduit connector works. List the available ConnectWise CPQ
tools (conduit__search_tools, query "connectwise-cpq" or "cpq") and
identify the tool that lists open/active quotes. Record its exact name,
use that exact name in the routine, not a guessed name.
2. Call that tool and inspect one real quote record. Identify: the field
that indicates quote status (open/presented/accepted/expired or
equivalent), the field for the date the quote was sent or presented to
the customer, and the field for the quote's expiration date if one
exists. Record the exact field names, they get used in the routine
prompt below instead of this guide's generic terms.
3. Confirm a Slack connector is connected. Note the destination channel name
and ID. If Slack does not show in the /schedule connector list, read its
connector_uuid and url from an existing routine that already uses Slack
(RemoteTrigger list -> get -> mcp_connections).
4. Create a Claude-managed scheduled routine named "Quote Aging Tracker":
- Schedule: weekly, cron "0 14 * * 1" (Monday 10:00 America/New_York =
14:00 UTC). Faster-than-hourly cadences are rejected.
- Attach TWO connectors, each with permitted_tools populated:
* Conduit: the confirmed CPQ quotes-list tool, READ only
* Slack: slack_send_message, slack_create_canvas
An empty permitted_tools list = the routine runs with no tools.
- Routine prompt: every run, list open quotes, calculate days since sent
using the confirmed date field, bucket by age, flag anything near its
confirmed expiry field, post the digest. Use the routine prompt below,
substituting the exact tool and field names from steps 1-2.
5. Trigger a manual run and verify: the digest lists real open quotes
(spot-check one against ConnectWise CPQ directly) with plausible age
buckets.
You are the Quote Aging Tracker. You run weekly, READ-ONLY against
ConnectWise CPQ. You must NEVER create, modify, or send a quote, only read
and report.
1. Call <confirmed CPQ quotes-list tool> to list open quotes (not yet
accepted, rejected, or expired). Use the confirmed status field to
filter.
2. For each open quote, calculate days elapsed since it was sent, using the
confirmed sent-date field and today's date at runtime.
3. Bucket quotes into aging groups: 0-14 days, 15-30 days, 31-60 days,
60+ days.
4. If the quote record has a confirmed expiry/expiration field, flag any
quote expiring within the next 14 days as a separate, prioritized
section regardless of its age bucket.
5. Build a digest: for each bucket, list quotes with customer/opportunity
name, quote value, days since sent, and expiry date if available. Sort
each bucket by days since sent, oldest first.
6. slack_send_message with the digest if it's short, or slack_create_canvas
with the full report plus a one-line Slack summary if the open-quote
count makes the list long. State the total number of open quotes and
total open quote value in the summary line.
7. If a quote is missing a sent date or the confirmed date field returns
nothing, list it in an "unable to age" section instead of guessing or
skipping it silently.

Contract Renewal Tracker and Pax8 Renewal & License Optimizer both watch revenue that’s already under contract and at risk of churning. This routine watches the earlier stage: revenue that hasn’t closed yet and risks going stale from simple neglect, a quote nobody followed up on.

Every other advanced-workflow guide on this site names its exact MCP tool identifiers and field names because each was built and verified against a live connection first. This one can’t, no other guide uses ConnectWise CPQ yet, so there’s no prior confirmed reference. The build prompt is written to have Claude read the live tool catalog and a real quote record before locking in any names, the same discovery discipline used in Project Time Visibility for the same underlying reason.

The routine only ever lists and reads quote data. It never creates, edits, or sends a quote through ConnectWise CPQ, the entire workflow is a read sweep followed by a Slack report.

Once the exact CPQ field set is confirmed against a live connection, this same pattern extends naturally to a win-rate or average-time-to-close report, the same aging data, summarized differently once accepted/rejected quote outcomes are folded in alongside the open ones tracked here.

Questions or a workflow you’d like documented? See Getting support.