The send-quote feature was failing silently. AWS SES InvalidClientTokenId — the environment variables for SES credentials were empty on the production server. Customers were accepting quotes and getting no confirmation email. The operator didn't know the email wasn't sending. The customer didn't know the quote was confirmed.

Rather than configure SES credentials on a system that was already trending away from AWS, the session migrated to Twilio SendGrid. The EmailService got rewritten from direct AWS SDK calls — SesClient::sendEmail() — to Laravel's Mail::to()->send() facade. One method call, transport-agnostic. Swap the SMTP credentials in the environment file and the same code sends through SendGrid, Mailgun, Postmark, or any other provider.

Seven notification classes had their toSesMail() methods renamed to toEmailChannel(). A new EmailChannel class replaced the SES-specific channel, using proper dependency injection through EmailServiceInterface. OrderMonitor and NotificationService switched from concrete EmailService to the interface. The SES webhook processor was deprecated with a TODO for SendGrid Event Webhooks.

Eighteen files changed. 146 lines added, 175 deleted. The net deletion is the point — the AWS SDK dependency disappeared, replaced by framework-native abstractions that don't tie the application to a specific provider.

The from-name fallback was still "SprayTool" from the product's first name. Changed to "The Lawn Tool." The kind of brand inconsistency that lives in config files and only surfaces when a customer looks at who sent the email.