WYRE-AI/msp-claude-plugins/msp-claude-plugins/connectwise/cpq/skills/quotes/SKILL.md
ConnectWise CPQ Quotes
The ConnectWise CPQ quote lifecycle over the real tool surface: searching quotes, the GUID-vs-quoteNumber dual addressing, versions, creating quotes by copying a template (the API's only create path), patching quote fields, the per-quote customer records and payment/financing terms, tabs as the section structure, and the deletes that cascade.
- Source repository stars
- 42
- Declared platforms
- 0
- Static risk flags
- 0
- Last source update
- 2026-08-28
- Source checked
- 2026-08-28
Decision brief
What it does: where it fits
The ConnectWise CPQ quote lifecycle over the real tool surface: searching quotes, the GUID-vs-quoteNumber dual addressing, versions, creating quotes by copying a template (the API's only create path), patching quote fields, the per-quote customer records and payment/financing terms, tabs as the section structure, and the deletes that cascade.
Not for
- Tasks that require unconfirmed production actions or broad system permissions.
- Environments where the pinned source and install steps cannot be inspected.
Compatibility matrix
Platform support, with evidence labels
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
Inspect first. Install second.
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/connectwise/cpq/skills/quotes"Inspect the Agent Skill "ConnectWise CPQ Quotes" from https://github.com/WYRE-AI/msp-claude-plugins/blob/5005f73ba2f52cd299f58aa6bb79f4e70ae87103/msp-claude-plugins/connectwise/cpq/skills/quotes/SKILL.md at commit 5005f73ba2f52cd299f58aa6bb79f4e70ae87103. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
What the source asks the agent to do
- 01
Anti-triggers
CPQ owns one stage of the quote funnel: composing and pricing the quote document. It does not source the SKUs that go into it, it cannot deliver it, and it is not the only tool in the stack that holds something called a quote.
The priced SKU master list rather than this deal's document — catalog items,"Send the customer the quote", e-signature, or signed-document status — CPQ's APIA quote that was built in a different quoting product — Kaseya Quote Manager and - 02
Key Concepts
Searches return both, so pull the id out of a search result before doing anything that needs a GUID. A quote number alone is not enough to patch or delete a quote.
omit version → list every versionversion: "latest" → the current versionversion: 3 → that specific version - 03
Two ways to address a quote
Searches return both, so pull the id out of a search result before doing anything that needs a GUID. A quote number alone is not enough to patch or delete a quote.
Searches return both, so pull the id out of a search result before doing anything that needs a GUID. A quote number alone is not enough to patch or delete a quote. - 04
Versions
cpqgetquoteversions takes a quoteNumber and behaves three ways:
omit version → list every versionversion: "latest" → the current versionversion: 3 → that specific version - 05
Quote status and flags
Status lives across several fields rather than one enum. The ones that decide what a quote means:
Status lives across several fields rather than one enum. The ones that decide what a quote means:See references/fields.md for the fuller QuoteView field reference.
Permission review
Static risk signals and limitations
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
Why each signal appears
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 42 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Provenance and original SKILL.md
- Repository
- WYRE-AI/msp-claude-plugins
- Skill path
- msp-claude-plugins/connectwise/cpq/skills/quotes/SKILL.md
- Commit
- 5005f73ba2f52cd299f58aa6bb79f4e70ae87103
- License
- Apache-2.0
- Collected
- 2026-08-28
- Default branch
- main
View the original SKILL.md
ConnectWise CPQ Quotes
Overview
A CPQ quote is the proposal an MSP sends a client: a header (account, status, dates, totals), one or more tabs that section the proposal, line items on those tabs, customer records synced from the attached CRM/PSA, and optional payment/financing terms. Quotes are versioned — a revision creates a new version under the same quote number rather than mutating the old one.
Everything an MSP does after the quote is built — publishing to Order Porter, e-signature, porting a won quote into the PSA as a sales order — happens in the CPQ web app. The API covers building and reading quotes, not delivering them.
Anti-triggers
CPQ owns one stage of the quote funnel: composing and pricing the quote document. It does not source the SKUs that go into it, it cannot deliver it, and it is not the only tool in the stack that holds something called a quote.
- The priced SKU master list rather than this deal's document — catalog items,
costs, categories and manufacturers live in ConnectWise PSA; use
connectwise-psa-product-catalog. - "Send the customer the quote", e-signature, or signed-document status — CPQ's API
has no publish, send or e-sign verb.
isSentand theorderPorter*fields are state you can read (and patch), not actions you can trigger. Delivery and signature tracking arepandadoc-documents. - A quote that was built in a different quoting product — Kaseya Quote Manager and
SalesBuildr each keep their own quotes, numbering and APIs; use
kaseya-quote-manager-quotesorsalesbuildr-quotes. Route on the product the quote lives in, not on the word "quote". - Adding, repricing or removing a line — the quote header and its line items are
separate tool sets; use
connectwise-cpq-quote-items.
Key Concepts
Two ways to address a quote
| Addressing | Used by | Notes |
|---|---|---|
GUID id (string) | cpq_get_quote, cpq_update_quote, cpq_delete_quote, cpq_create_quote_from_template | Unique to one version of one quote |
quoteNumber (int) + quoteVersion (int) | cpq_get_quote_versions, cpq_delete_quote_version | The human-facing number; identifies the quote across its versions |
Searches return both, so pull the id out of a search result before doing anything that
needs a GUID. A quote number alone is not enough to patch or delete a quote.
Versions
cpq_get_quote_versions takes a quoteNumber and behaves three ways:
- omit
version→ list every version version: "latest"→ the current versionversion: 3→ that specific version
Searches return latest versions only unless you pass showAllVersions: true. If a
search seems to be missing a quote a colleague is looking at, they are probably on a
superseded version.
Quote status and flags
Status lives across several fields rather than one enum. The ones that decide what a quote means:
| Field | Meaning |
|---|---|
quoteStatus | Tenant-configurable status text (values vary per install — read them from live data, do not assume) |
isSent | Delivered to the customer |
isAccepted | Customer accepted |
isLost | Marked lost |
isArchive | Archived; excluded from most working views |
requiresApproval / approvalStatus / approvedByUser | Internal approval workflow |
expirationDate / expectedCloseDate | Proposal validity and forecast date |
orderPorter* | Order Porter publishing state (passcode, template, signed date, upload state) |
See references/fields.md for the fuller QuoteView field reference.
Sub-resources
| Sub-resource | Tools | Notes |
|---|---|---|
| Tabs | cpq_search_quote_tabs | Read-only over the API. Sections of the proposal; every line item belongs to one. |
| Line items | see the quote-items skill | Full CRUD |
| Customers | cpq_list_quote_customers, cpq_update_quote_customer, cpq_delete_quote_customer | Exist only in the context of a quote — there is no global customer directory to search |
| Terms | cpq_list_quote_terms, cpq_create_quote_term, cpq_update_quote_term, cpq_delete_quote_term | Payment/financing options: periods, interestRate, downPayment, periodPaymentAmount, isSelected, leasing fields |
Common Workflows
Find a quote
cpq_search_quoteswithconditionsand a tightincludeFields, e.g.conditions: accountName contains "Acme" AND isArchive = False,includeFields: id,name,quoteNumber,quoteVersion,quoteStatus,quoteTotal,createDate- Page with
page/pageSizeuntil a page returns fewer rows thanpageSize. cpq_get_quotewith the GUID for the full record.
Called with no conditions the search asks for a created-since date, falling back to the
last 90 days and noting that in the result. Give it a condition when you know one — a
90-day window silently hides older quotes.
Create a quote
There is no create-from-scratch endpoint. Every new quote is a copy of a template or of an existing quote, then patched into shape.
cpq_list_templatesto see what is available (templates are themselves quotes).cpq_create_quote_from_templatewithtemplateId, or withtemplateNameto resolve by name — an ambiguous name prompts a selection, and with no way to prompt you get an error listing the candidates. PassnewNameto rename the copy in the same call.- The copy inherits the template's tabs, line items and terms. Patch the header with
cpq_update_quote(account, dates, custom fields). - Add or adjust lines with the quote-items tools.
To revise an existing deal, copy the existing quote instead of a template —
cpq_create_quote_from_template accepts any quote GUID as its source.
Update a quote
cpq_update_quote takes either fields (a partial object, turned into replace ops) or
patch (raw RFC 6902 ops) — never both.
cpq_update_quote id=<guid> fields={ "name": "Acme — Managed Services FY27",
"expectedCloseDate": "2026-09-30T00:00:00Z" }
This tool is flagged high-impact for a reason: patching quoteStatus, isArchive,
isLost, expirationDate, orderPorter* or the approval fields changes workflow state
and, for the Order Porter fields, what the customer sees. Confirm intent before touching
those; renaming or setting a forecast date is routine.
Work the customers and terms on a quote
cpq_list_quote_customerswith the quote GUID — the records are already there, synced from the CRM/PSA. Correct them withcpq_update_quote_customer.cpq_list_quote_termsfor financing options;cpq_create_quote_termto add one.isSelectedmarks the term the customer is being offered.
Delete
cpq_delete_quote removes the quote and every tab, line item and term on it.
Confirmation depends on how you are connected: an interactive client is prompted, while
a non-interactive one — the gateway included — is refused until the call is re-invoked
with confirm_destructive_action: true. cpq_delete_quote_version removes a single version by
quoteNumber + quoteVersion. Neither is recoverable — archive (isArchive: True) is
almost always the right move for a dead deal instead.
Gotchas
countin a tool result is the page length, not a total. CPQ returns bare arrays with no collection count. Keep paging until a short page arrives.- Searching by quote number needs a number, not a string:
quoteNumber = 1042, notquoteNumber = "1042". Dates go in square brackets and are date-only:createDate >= [2026-07-01]. - Every line item needs a tab. A freshly copied quote has the template's tabs; a quote with no tabs cannot take line items, and tabs cannot be created over the API.
- Deleting a quote version is not the same as deleting a quote. The version delete
targets
quoteNumber+quoteVersion; the quote delete targets a GUID and takes everything. crmOpportunityIdis a pointer, not a join. There are no opportunity endpoints in CPQ — resolve it against the PSA/CRM (theconnectwise-psaplugin) if you need the opportunity itself.- QuoteView is huge and mostly empty. 204 properties, 60+ of them unused
zCustom*slots. Always sendincludeFieldson searches or the results bury the useful fields.
Related Skills
- ConnectWise CPQ API Patterns — auth, conditions syntax, paging, JSON Patch
- ConnectWise CPQ Quote Items — line items, tabs, pricing and margin fields
Frequently asked questions
What to verify before installation and use
What does the ConnectWise CPQ Quotes source document cover?
The ConnectWise CPQ quote lifecycle over the real tool surface: searching quotes, the GUID-vs-quoteNumber dual addressing, versions, creating quotes by copying a template (the API's only create path), patching quote fields, the per-quote customer records and payment/financing terms, tabs as the section structure, and the deletes that cascade.
How do I install ConnectWise CPQ Quotes?
The source record exposes this install command: npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/connectwise/cpq/skills/quotes". Inspect the command and pinned source before running it.
Alternatives
Compare before choosing
coreyhaines31/marketingskills
ab-testing
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
garrytan/gbrain
bulk-ingestion
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
app-store-optimization
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
migrate-vstest-to-mtp
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing