The email said "Choose and Sign up." The customer was supposed to view their quote and confirm their services. Two different actions described by copy that was written during a different phase of the product, when the quote page did something else entirely.
Changed to "View Quote & Confirm." Four words that match what actually happens when you click the button.
The URL construction was inconsistent too. SMS built quote links using config('app.marketing_url'). The email hardcoded config('app.url'). Two channels, same destination, different paths to get there. The mailable now computes quote_url once in its constructor — using the marketing URL with the app URL as fallback — and the Blade template references that property instead of scattered config calls.
Two tests verify the fix: one asserts the quote URL is set correctly, one asserts it uses the marketing URL when available. The kind of tests that exist not because the fix is complex, but because URL construction is the kind of thing that silently breaks during a domain migration six months from now.