Skip to content

[Web] Quote send-failure tells the sender to share the accept link manually, but no copy-link control exists #3431

Description

@ToddHebebrand

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions