docs(quote): a draft can be declined, and its reason is optional - #146
Merged
Conversation
The declineQuote pages said "Mark a sent quote as declined", which is now false: a draft can be declined too, for a deal that dies before the quote is ever sent. A draft never reached the customer, so the reason is optional there; a sent quote still requires one (400 CANNOT_DECLINE_QUOTE without it) and the 190-char cap still applies to both. All six language pages now state the rule and show a no-reason example in that language's own idiom. The JS lifecycle line gains the draft-to- declined path. Void and handleExpiredQuote are unchanged — both still require a reason. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The previous wording said the reason was "optional for a draft", which describes the API but hides the outcome: the reason is stored on the quote's linked signature document, and a draft has none, so anything passed for a draft is accepted and then silently dropped. Verified against live data — every declined draft has no reason stored, while declined SENT quotes do. Says so plainly now, on all six language pages, so nobody passes a reason expecting it to persist. The product side matches: the dialog no longer asks for one on a draft. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
amitsharma-turbodocx
force-pushed
the
feature/quote-draft-to-declined
branch
from
August 17, 2026 12:49
9125559 to
50871ab
Compare
amitsharma-turbodocx
marked this pull request as ready for review
August 17, 2026 12:57
…parity Adds a 'a draft cannot be voided' clause to each SDK quote reference page's void section, brings five intros to parity with the JS page (a draft can also be marked declined directly), and annotates canDecline as true for a draft where flags are annotated by status. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The
declineQuotereference said "Mark a sent quote as declined". That is now false — a draft can be declined too, for a deal that dies before the quote is ever sent.What changed in the product
POST /v1/quotes/{id}/declinenow accepts the request without a reason:reasondraftsent400 CANNOT_DECLINE_QUOTEwithout oneThe 190-character cap still applies to both.
What this PR fixes
All six language pages now state the rule and carry a no-reason example in that language’s own idiom (matching what actually shipped in the SDK, not one pattern copy-pasted six times):
declineQuote(id, {})decline_quote(id, {})&turbodocx.DeclineQuoteRequest{}(unsetReasonis omitted)new DeclineQuoteRequest()new DeclineQuoteRequest()(Gson omits the null)decline_quote(id, {})The JavaScript lifecycle line also gains the direct
draft→declinedpath, which it previously implied was impossible.Deliberately unchanged
voidQuote— still requires a reason; it is only reachable fromsent.handleExpiredQuote— itsreasonandnewValidUntilgenuinely are both still required.statusInfoprose lists the flag names without asserting per-status values, so it stayed accurate as written.🤖 Generated with Claude Code