Company phone (main/toll free) on a member's signature, with their extension

Featurekamo-internal
Shipped
August 27, 2026 at 7:58 PM UTC
Author
kamo
Commit
0d545ef

The Content tab of **************** gains two switches: Company Phone (Main) and Company Phone (Toll Free). Enabled, they print the organization's published line followed by the sending member's extension — "(555) 555-5555 x81234" — so a reply-by-phone reaches the person who wrote, not the switchboard. The numbers come from Contact Information on **************** The extension is the one the member is actually assigned: MemberVoipConfig, read from VOIPService and only when their VOIP is enabled, since a member with it switched off does not answer that extension. TeamMember.phoneWorkExtension is the fallback, and is all an organization running no phone server through Kamo will ever have. No extension means the number prints bare rather than with a dangling "x". Same preference QuoteAgentContactResolver already applies server-side. companyPhone becomes companyPhoneMain + companyPhoneTollFree, which fixes two things it was hiding: - applyFieldConfig gated both numbers behind one field with `if (!local && !tollFree)`, so an organization that enabled only its toll-free line still had its local one printed. - CampaignEditor was writing a companyPhone key into SignatureContent; with the field gone the compiler finds it, but the spread had been letting it through silently, so a campaign preview would have dropped the line. All 29 signature templates now render both lines. Three did before, so the equivalent department and company toggles were largely inert — enabling one did nothing on the other 26 layouts and read as a broken setting. The department and company toggles keep their stored keys and are relabelled to the same wording, so the three scopes no longer call the same number two different things. Four independent paths build signature content — the settings preview, the composer, campaigns and meeting invitations — and all four are updated. VOIPService is not reachable through forwardToApi (APIService routes no /api/voip prefix), so the invite route gets the base-URL helper the catch-all already had, lifted into **************** Needs EmailService and the KamoInitializerService migration to have landed: the two toggles are persisted org-wide.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing