Skip to content
ConduitConduit

QBR Prep

A worked example of an advanced workflow: a Claude-managed scheduled agent that, once a week, builds a value-conversation pack for one designated client’s quarterly business review. The account manager walks the owner through ease of doing business, then emotional value, then a transformational move. Ticket history from Autotask, device health from Datto RMM, identity and MFA coverage from CIPP, and configuration changes from Liongard still get pulled — they arm that conversation and land in an appendix. The pack is written to an IT Glue document, and a one-line summary goes 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.

The finished workflow runs unattended on a weekly cron. Each run it reads the last pack’s commitments and any stated goal from IT Glue, then pulls the designated client’s tickets, devices, users, and configuration changes. It writes an account-manager-to-owner pack:

  1. An executive narrative in owner language.
  2. Level 3 — ease of doing business, friction only.
  3. Level 4 — emotional value, trust, and reassurance.
  4. Level 5 — one transformational move, then the asks.
  5. An appendix for levels 1 and 2: volume, SLA% when the pull has it, device inventory, and raw security totals.

The same IT Glue document is updated in place, and Slack gets a pointer that names the value of the hour.

The hour follows the MSP Value Pyramid (Pisces Consulting, adapted from Bain & Company’s B2B Elements of Value). Most MSP QBRs talk only at the first two levels. This pack does not.

Level Name In this QBR
1 Table Stakes (1 point) Appendix, or if they challenge.
2 Functional Value (2 points) Appendix, or if they challenge. Closed tickets, SLA%, and a device list live here.
3 Ease of Doing Business (3 points) First movement. Where it was hard or easy to get work done with you: chasing, rework, handoffs, surprise changes.
4 Emotional Value (4 points) Second movement. Trust, a worry they did not have to carry, and a miss you say out loud.
5 Transformational Value (5 points) Third movement, then the ask. One business move tied to a goal they already stated.

Voice is the account manager talking to the owner: “you had to chase us,” “this is what you didn’t have to worry about,” “this is what the business can do next.”

A metric stays in the body only when the same sentence answers “so what for ease, emotion, or transformation?” The routine refuses four leads: ticket volume, an SLA% headline, a device inventory dump, and “we closed N tickets” as proof of value.

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 autotask__*, datto-rmm__*, cipp__*, liongard__* and itglue__* tools. See Connecting an AI Client.
Autotask, Datto RMM, CIPP, Liongard & IT Glue connected in Conduit The vendor connections must be able to read tickets, devices, users/MFA, detections, organizations, and documents — and to create, update, and publish IT Glue documents.
Slack connector The first-party Slack connector connected in claude.ai (https://mcp.slack.com/mcp). Provides slack_send_message.
Scheduled routines access Created via the /schedule capability; managed at claude.ai/code/routines.
A designated client present across those systems One client that can be matched in Autotask, Datto RMM, CIPP, Liongard and IT Glue, so all five IDs can be baked into the routine prompt.
A destination Slack channel e.g. #qbr-prep, plus its channel ID. The Slack connector must have access to it.

These are the things that cost real time the first time through. Account for them up front and the build genuinely takes minutes.

  • The cadence floor is hourly. Scheduled routines reject faster-than-hourly cron expressions. A QBR pack is a weekly artifact anyway — 0 14 * * 1 runs it every Monday morning.
  • 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 — no error, no output. List the exact tool names the routine needs, and only those.
  • QBRs are quarterly and staggered per client — a routine is a cron. Real QBRs land on a per-client cadence, not all at once. This POC sidesteps that by preparing a pack for one designated client every week. The production pattern is a “QBR radar” routine that scans the PSA for clients with a QBR due in roughly two weeks and preps a pack for each — but that needs a source of QBR dates to scan, which is out of scope here.
  • IT Glue search does not return the document body. itglue__search_documents returns metadata (name, folder, URL, timestamps). Reading last quarter’s commitments takes itglue__get_document, and itglue__list_document_sections when the body is not on that payload. Updating in place takes a section id from list_document_sections, then itglue__update_document_section, then itglue__publish_document — a section edit stays invisible until publish. Creating the pack passes skip_folder_prompt: true so the unattended run does not stop on IT Glue’s folder picker.
  • Liongard’s metric-evaluation endpoint is unavailable. The configuration section uses liongard__liongard_detections_list — recent change detections — instead. Window it to the last ~90 days with a small page size, read only the most recent ~15 detections’ metadata, and never read the large ChangeDetection field.
  • Ignore the Datto udf block. Each datto-rmm__datto_list_devices record carries a 300-field udf block that is almost entirely empty. For one client’s site that is a single call and manageable — just tell the routine to ignore the udf block.
  • A routine reaches only its attached connectors. The routine sandbox blocks arbitrary network egress, so notifications must go through the Slack connector’s tools. Attach every connector the workflow touches. This routine’s history of prior commitments is the client’s IT Glue QBR documents, which those connectors can read.

With the connectors above in place, paste this to Claude. It confirms the Conduit connector, discovers the designated client’s five IDs, and creates the routine.

Build me a scheduled QBR Prep agent. Do all of this end to end:
1. Confirm the Conduit connector works and the systems are reachable: it must
expose the autotask__*, datto-rmm__*, cipp__*, liongard__* and itglue__*
tools.
2. Pick ONE designated client to prepare the QBR pack for, and discover its
five IDs - these get baked into the routine prompt so the routine never runs
discovery itself:
- Autotask companyID via autotask__autotask_search_companies.
- Datto RMM site UID (the site the client's devices live in).
- CIPP tenant ID via cipp__cipp_list_tenants, matched by company name/domain.
- Liongard environment ID via liongard__liongard_environments_list, matched
by name.
- IT Glue organization ID via itglue__search_organizations.
If the client cannot be matched in one system, record that - the routine
degrades that section gracefully.
3. Confirm a Slack connector is connected. Note the destination channel name
and ID (e.g. #qbr-prep). 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 "QBR Prep":
- 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: autotask__autotask_search_tickets,
datto-rmm__datto_list_devices, cipp__cipp_list_users,
cipp__cipp_list_mfa_users, liongard__liongard_detections_list,
itglue__search_documents, itglue__get_document,
itglue__list_document_sections, itglue__create_document,
itglue__update_document_section, itglue__publish_document
* Slack: slack_send_message
An empty permitted_tools list = the routine runs with no tools.
- Routine prompt: every run, read prior QBR notes in IT Glue before any
PSA pull, then assemble a value-conversation pack (executive narrative,
level 3 ease, level 4 emotion, level 5 move and asks, appendix for
levels 1-2), write it to an IT Glue document, and post a one-line
value summary to Slack. Use the exact routine prompt below, with your
client's five IDs baked in.
5. Confirm the create response echoes both connectors with the correct
permitted_tools and the routine prompt verbatim. Do not trigger a run -
routine runs need a one-time approval handled separately.

This is the lean prompt the build process installs into the scheduled routine itself. Substitute your designated client’s five IDs and destination channel.

You are the QBR Prep routine. Once a week you build a value-conversation pack for one designated client's quarterly business review. Voice is an account manager talking to the business owner.
The MSP Value Pyramid (Pisces Consulting, adapted from Bain & Company's B2B Elements of Value) is the spine:
- Level 3 Ease of Doing Business - where it was hard or easy to get work done with us.
- Level 4 Emotional Value - trust, reassurance, and whether they worried less.
- Level 5 Transformational Value - one business move tied to a goal they already stated, then the ask.
Levels 1 and 2 (table stakes, functional value) are the appendix.
All IDs are baked in below. Do NOT call any list_*/search_* discovery tool to find company, site, tenant, environment, or organization IDs. The only IT Glue tools you may call are itglue__search_documents, itglue__get_document, itglue__list_document_sections, itglue__create_document, itglue__update_document_section, and itglue__publish_document.
Designated client: <client name>
- Autotask companyID: <autotask-company-id>
- Datto RMM site UID: <datto-site-uid>
- CIPP tenant: <cipp-tenant-id>
- Liongard environment ID: <liongard-environment-id>
- IT Glue organization ID: <itglue-org-id>
Refuse these as the lead, the Slack line, or proof of value: ticket volume, an SLA% headline, a device inventory dump, and "we closed N tickets." A number in the body has to answer "so what for ease, emotion, or transformation?" in the same breath. A number that only says how busy we were goes in the appendix, or you drop it.
1. Prior commitments and their goal, before any PSA, RMM, CIPP, or Liongard call. Call itglue__search_documents with organization_id <itglue-org-id> and name 'QBR' (partial match). For the document named 'QBR Pack - <client name>', and for any other hit whose name is clearly a prior QBR note, goal, or commitment list, call itglue__get_document with organization_id <itglue-org-id> and that document id. search_documents returns metadata only. If get_document does not include the body, call itglue__list_document_sections with document_id. Extract promises from the last pack and any goal they stated. If itglue__search_documents or itglue__get_document fails, or itglue__list_document_sections fails when get_document did not include the body, the goal is "IT Glue history unavailable." Use that label in the pack and in the Slack line. Do not call that a missing goal. If those calls succeed and nothing states a goal, the goal is "unknown - not found in QBR-named IT Glue documents." Do not invent a transformation. Do not search documents whose names do not match QBR.
2. Tickets, for the appendix and for friction only. Call autotask__autotask_search_tickets with companyID <autotask-company-id> and createdAfter set to 90 days ago. Do not call any other Autotask tool. From the records returned: opened count, still-open count, and priority mix go in the appendix. If those records include an SLA or first-response field, SLA% and resolution time also go in the appendix only. For level 3, keep only friction you can point at: a ticket still open long enough that they would have had to chase it, a reopen, a slow first response, or an escalation - each with the so-what for ease in the same sentence. If the records do not show that, say so. Do not substitute volume.
3. Devices. Call datto-rmm__datto_list_devices with siteUid <datto-site-uid>. Ignore the large udf block on each device. Device count and the inventory go in the appendix. Promote a single device fact into the body only when it is a reassurance (it never became their problem) or a felt miss (they would have noticed), with that so-what in the same breath. Do not narrate the inventory.
4. Identity. Call cipp__cipp_list_users and cipp__cipp_list_mfa_users with tenantFilter <cipp-tenant-id>. User count and MFA enabled vs not go in the appendix. One level 4 sentence may use MFA as a confidence signal ("you can trust this posture" or "this gap is the worry"). A percentage recital stays in the appendix.
5. Configuration changes. Call liongard__liongard_detections_list with a startDate 90 days ago, pageSize 5, and a filter for EnvironmentID <liongard-environment-id>. Read only the most recent ~15 detections and only their small metadata fields (ID, SystemName, Name, Date, SystemType). Never read the large ChangeDetection field. The short list goes in the appendix. Promote one change only when it removed friction, reduced a worry, or changed how they operate, with that so-what attached.
If any pull cannot be read, put 'data not available' in that appendix subsection. Do not fill the hole with a different busy metric, and do not omit the subsection.
6. Assemble the pack in this order, as HTML:
- Open. One or two sentences the account manager says first: this hour is whether we were easy to work with, whether they worried less, and what the business should do next. The operating numbers are in the back.
- Executive narrative. Four to six sentences in owner language, level 3 then level 4 then level 5. No SLA, no volume, no device count, no "we closed N."
- Level 3 - Ease of Doing Business. What to say (friction created, friction removed, what changes next quarter). Questions to ask: where did we create friction, where did we remove it, what would make next quarter easier for their team. Support metrics, each with "so what for ease." If you have none, say so.
- Level 4 - Emotional Value. What to say, including a miss if the history or a felt outage shows one. Questions: what kept you up at night, did we reduce that worry or add to it, which moment built trust and which burned it. Support metrics as reassurance or confidence, each with "so what for emotion." Raw MFA totals stay in the appendix.
- Level 5 - Transformational Value. Their goal, in their words. If search and the document reads succeeded and stated no goal, write "unknown - not found in QBR-named IT Glue documents." If the search or read failed, write "IT Glue history unavailable." Questions before any proposal: what business outcome should we enable next quarter, what would make this meeting change how you invest with us. One move only if the goal is known: the outcome for them, what we would change, what we need from them, the horizon, and what we will not do. Omit the move when the goal was not found or history is unavailable.
- Looking ahead / asks. What they should decide or tell you before the meeting ends. The next-quarter outcome. What would change how they invest.
- Appendix - levels 1 and 2, if challenged. Label it: do not lead with this and do not present it as the agenda. Then tickets opened and still open, priority mix, SLA% if the pull had it, device count, MFA totals, and the short Liongard change list.
- Gaps. A source that could not be read. If the goal label is history unavailable or not found, repeat that label here.
7. Deliver. If step 1 already found 'QBR Pack - <client name>', use that document id. Otherwise call itglue__search_documents with organization_id <itglue-org-id> and name 'QBR Pack - <client name>'. If found, call itglue__list_document_sections with document_id. Count text sections. A heading-only section is not a text section. If there is more than one text section, do not call itglue__update_document_section or itglue__publish_document: those tools cannot replace the other sections, so a publish would leave the previous pack in place. Fall back to Slack with the full pack and that document id, and say the IT Glue doc has multiple text sections so it was not partially overwritten. If there is exactly one text section, call itglue__update_document_section with document_id, that section_id, and the pack as HTML, then itglue__publish_document with document_id. If the document has no text section, do not call a create-section tool - it is not permitted - and fall back to Slack with the full pack and the document id, saying the IT Glue doc has no text section to replace. If not found, call itglue__create_document with organization_id <itglue-org-id>, name 'QBR Pack - <client name>', the pack as HTML content, and skip_folder_prompt true, then itglue__publish_document with the new document id. If itglue__create_document succeeds but a later IT Glue step fails, include the created document id and the full pack inline in the Slack message. Do not claim that itglue__search_documents returns that document before it is published. If any other IT Glue step fails, include the full pack inline in the Slack message. Then call slack_send_message to channel <channel-id> (#qbr-prep) with one value line, for example: 'QBR pack ready for <client name> - <where it was easier or where friction remains>, <the worry we took or still owe them>, <the move, or the goal label from step 1>. Operating numbers are in the appendix.' Use "IT Glue history unavailable" only when the search or read failed. Use "not found in QBR-named IT Glue documents" only when search and the document reads succeeded and stated no goal. Do not put ticket counts, SLA%, device counts, or MFA totals in that line.
Do not invent data. If a tool returns nothing or errors, say so in Gaps or in that appendix subsection.

The routine writes the document an account manager can run from: open, executive narrative, level 3, level 4, level 5, asks, then the appendix. Prior commitments and any stated goal are read from IT Glue before Autotask is called, because follow-through is the trust story and their goal is what level 5 is allowed to propose. All five client IDs are baked into the routine prompt, so the routine never spends a run discovering which company it is.

The pulls are the same four systems that normally need four separate logins — Autotask for tickets, Datto RMM for devices, CIPP for identity and MFA, Liongard for configuration changes. What changed is where the numbers sit. Volume, SLA% when the ticket records include it, the device inventory, and raw MFA totals go under “Appendix — levels 1 and 2, if challenged.” A body sentence may use one of those facts only with the so-what attached: an aging ticket is friction, an MFA gap is a worry, a config change is a business move when it changed how they operate.

Each run the routine searches the client’s IT Glue organization for a document named “QBR Pack - <client name>”. That search is also how it finds last quarter’s promises: itglue__search_documents with a QBR name filter, then itglue__get_document (and itglue__list_document_sections when the body is missing) before anything is overwritten. If the living document has one text section, the routine updates that section and calls itglue__publish_document. If it has more than one text section, the routine does not update or publish: the permitted tools can replace only one section, and publishing would leave the previous sections in place. Slack gets the full pack and the document id instead. If the document does not exist, the routine creates it with skip_folder_prompt: true and publishes. A later run updates that document when search returns it and it still has one text section. This guide does not claim that itglue__search_documents returns a document that was created but not published. If create succeeds and a later IT Glue step fails, Slack includes the new document id and the full pack. Any other IT Glue failure posts the full pack inline in Slack. See delivery adapters for other ways to surface a routine’s output.

The channel message is one sentence an account manager can forward: where work got easier or where friction remains, the worry that was lifted or is still owed, and the move. When the QBR documents could not be read, the line says “IT Glue history unavailable.” It says the goal was not found in QBR-named IT Glue documents only after a successful search and read that stated no goal. Ticket, device, and MFA counts stay in the document’s appendix.

If any one system can’t be read — a client unmatched in CIPP, a Liongard timeout — that appendix subsection carries a “data not available” note. The pack always has the same spine (narrative, levels 3–5, asks, appendix, gaps), so a reader can tell the difference between “nothing to report” and “we couldn’t check.” A missing pull is not backfilled with a different volume number.

The natural next step is the QBR radar: instead of one designated client on a fixed weekly cron, a routine that scans the PSA for clients with a QBR due in roughly two weeks and preps a pack for each one. That needs a source of QBR dates to scan against — a custom field, a calendar, a tracking sheet — which is why it is out of scope for this POC. The evidence pull is also easy to widen: permit the QuickBooks Online tools (qbo__*) from the same Conduit connector when a renewal or an invoice serves a goal already written in a QBR-named IT Glue document. That fact belongs in level 5. It does not become a financials section at the top of the pack.

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