One send path for every customer email and text

Every customer-facing email and text leaves through one façade that resolves the account's provider chain, logs the attempt and retries what is worth retrying.

What it is

The single module every customer send goes through — estimates, contracts, portal links, reminders, stage automations and the inbox composer. It resolves which providers this account uses in priority order, tries them until one accepts, records what happened with the true billable quantity, and queues a retryable failure instead of losing it.

Also called: how messages go out · email provider · sending engine · why didn't that send

See it
One send path for every customer email and text
CustomerBuildingAmountStatus
Ronan PetschHobby Shop$8,610Sent
Ivy BrubakerRiding Arena$15,260Draft
Ivy BrubakerEquipment Storage$2,340Draft
Gideon AltEquipment Storage$8,990Approved
Ivy BrubakerBarndominium$16,210Draft
Diagram: caller → gate → provider chain (GHL → Resend / Mailgun, Twilio) → send_log, with the outbox branch off a retryable failure. Sample data — no customer information appears here.
How it works
  1. 1caller → sendCustomerEmail / sendCustomerSms → provider registry → adapter chain, first 'sent' wins
  2. 2Every attempt writes a send_log row naming the provider, the outcome and the units
  3. 3A retryable failure (the request never reached the provider) is persisted to the outbox rather than lost
  4. 4A hard failure with no later fallback surfaces as a real error instead of collapsing into generic 'nothing configured' guidance
  5. 5Public signatures are unchanged from before the refactor, so none of the ~14 callers needed editing
Why we built it

Changing which provider an account sends through changed contracts, invites and notifications but not the conversation composer, which quietly carried on using the old one — so "which provider does this account send with" had two different answers depending on which part of the product you asked. That is the kind of split that surfaces as a customer not receiving something, weeks later. Every customer-facing email and text now leaves through one path that resolves the account's provider chain, logs the attempt and retries what is worth retrying.

The problem
  • Two different answers to 'which provider sends this'
  • Real provider errors masked as configuration guidance
  • Sends lost to a transient network failure
Sound familiar?
What you get
One switch changes where everything sends from
Every send is attributable to a provider and an outcome
Transient failures retry instead of vanishing
What's inside
A master safety switch on customer messaging
Per-account live / redirect / off modes that can stop or divert automated customer messaging, checked on every single send and failing closed.
Messages that fail on the network get retried, not lost
A retryable send failure is persisted with its original options and replayed on a backoff until it succeeds or is declared dead.
Texts are counted the way carriers charge for them
Every outbound text is measured in billable segments, accounting for the encoding cliff that a single emoji causes.
Texts go out from the rep's own line
When the sending rep holds a number, the text leaves from that number so the customer keeps talking to the same person and the reply comes back to them.
Reply addresses that route themselves
Outbound email carries a reply address that names the account, so a reply on a shared domain can be filed with certainty instead of guessed.

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 →