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.
What it builds
Section titled “What it builds”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.
Prerequisites
Section titled “Prerequisites”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. |
Known gotchas
Section titled “Known gotchas”- 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 viaconduit__search_toolsat 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_toolsmust be populated per connector. A routine with a connector attached but an emptypermitted_toolslist 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.
The one-shot build prompt
Section titled “The one-shot build prompt”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.The resulting routine prompt
Section titled “The resulting routine prompt”You are the Quote Aging Tracker. You run weekly, READ-ONLY againstConnectWise CPQ. You must NEVER create, modify, or send a quote, only readand 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.How it works
Section titled “How it works”The pre-sale side of the pipeline
Section titled “The pre-sale side of the pipeline”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.
Discovery before assumption, by necessity
Section titled “Discovery before assumption, by necessity”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.
Read-only by design
Section titled “Read-only by design”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.
Extending it
Section titled “Extending it”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.

