Both actions build the URL from the estimate link id via getSiteUrl. Copy uses the async clipboard API and falls back to a hidden textarea + execCommand when that's blocked, then shows a 'Copied' state for 1.8 seconds. Both are disabled with an explanatory tooltip when no customer link is bound to the contract.
Also called: customer contract link · see what the customer sees · copy signing link
- 1customerLinkId prefers the prop from the funnel checklist and falls back to the contract row's own estimate_link_id.
- 2Open launches /client/<linkId>/contract in a new tab with noopener.
- 3Copy writes the same URL to the clipboard, with the textarea fallback for contexts where the async API is blocked.
- 4Disabled state: 'No customer link bound to this contract'.
The footer comment sets the boundary: 'Customer-facing link actions: open the page the customer signs at, or copy that same link. The in-platform "view" IS this modal.' The copy path exists because the notification channels can fail — when nobody was notified, the error banner tells the builder to 'Copy their link and share it with them directly.'
- No manual route to the customer's document when automated delivery fails
- Builders unsure what the customer's screen actually looks like
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →