Description
When sending a quote fails, the error message tells the sender to "share the accept link manually" — but there is no way to obtain that link anywhere in the UI.
The accept URL is returned as data.acceptUrl on POST /quotes/:id/send, and otherwise exists only in the email that just failed to send. There is no copy-link control on the quote, so the instruction is unfollowable: the user's only recourse is devtools.
Why it matters
This is the failure path for a revenue action. A quote that can't be emailed (bad recipient domain, mail provider hiccup, the 2breeze.app MX problem in #3363) is exactly when the sender most needs to get the link to the customer another way — and that is the moment the product tells them to do something it doesn't let them do.
Proposed fix
Add a Copy accept link control on the quote — visible on the sent/failed state at minimum, arguably always once the quote has a public token. Then the error message's advice becomes actionable, and the message can point at the control by name.
Worth deciding whether the link should be copyable before a send is attempted too: "send me the link, I'll forward it myself" is a normal MSP workflow, and it makes the accept flow usable when email is untrusted or the customer's filter eats it.
Affected files
apps/web/src/components/billing/quotes/QuoteActions.tsx (the message)
- Quote detail / send flow — wherever the control lands
Related: #3363 (the transactional-email domain has no MX, so replies hard-bounce — same "email is not a reliable channel" theme).
Reported By: internal Playwright UI QA sweep 2026-08-11, evidence in docs/testing/FEATURE_TEST_LOG.md.
Description
When sending a quote fails, the error message tells the sender to "share the accept link manually" — but there is no way to obtain that link anywhere in the UI.
The accept URL is returned as
data.acceptUrlonPOST /quotes/:id/send, and otherwise exists only in the email that just failed to send. There is no copy-link control on the quote, so the instruction is unfollowable: the user's only recourse is devtools.Why it matters
This is the failure path for a revenue action. A quote that can't be emailed (bad recipient domain, mail provider hiccup, the
2breeze.appMX problem in #3363) is exactly when the sender most needs to get the link to the customer another way — and that is the moment the product tells them to do something it doesn't let them do.Proposed fix
Add a Copy accept link control on the quote — visible on the sent/failed state at minimum, arguably always once the quote has a public token. Then the error message's advice becomes actionable, and the message can point at the control by name.
Worth deciding whether the link should be copyable before a send is attempted too: "send me the link, I'll forward it myself" is a normal MSP workflow, and it makes the accept flow usable when email is untrusted or the customer's filter eats it.
Affected files
apps/web/src/components/billing/quotes/QuoteActions.tsx(the message)Related: #3363 (the transactional-email domain has no MX, so replies hard-bounce — same "email is not a reliable channel" theme).
Reported By: internal Playwright UI QA sweep 2026-08-11, evidence in
docs/testing/FEATURE_TEST_LOG.md.