Sample values for the co-borrower request and its one-time code, so the admin preview renders them
Rebuilds EmailService onto the shared library that carries the MICRO_ACTION_REQUEST and MICRO_ACTION_CODE templates (an org seeds a missing template on first se...
Preview variables for the invoice and invoice receipt emails
commerce.invoice_sent and the new commerce.invoice_receipt (a paid work order or order invoice's receipt) get sample variables, so the template editor's preview...
Audience filters on every trigger, account and loan triggers, enroll by filter
TriggerConfig gains leadFilter, accountFilter, loanFilter, loanStatuses, audienceId and includeExisting; a drip saved with the flat market/vendor/ product/state...
Lead/account/loan audience filters, saved audiences and audience options
Extends LeadAudienceFilter with status/sub status (include or exclude), assignment, source, created/assigned/last-activity date rules, callback, birthday, loan ...
Send bulk mail from the domain itself, and extend SPF instead of replacing it
- A sending domain can now be the domain itself (acme.com), not only a name of its own (news.acme.com): create/lookup take root=true. Its records are SPF, D...
Targeted index backfill for removed-attachment counts; conversations carry the count
Listings served from email_metadata.search_index only showed antivirusRemoved for messages indexed after b05af4f. Only mail delivered after the Antivirus mail f...
Purchase requests are gated on the Procurement rights
PURCHASE_REQUEST_SUBMITTED (kamo-shared-library 6a765c18) asks for APPROVE_PURCHASE_REQUESTS, the right SecurityService chose its recipients by; PURCHASE_REQUES...
Message-list rows carry antivirusRemoved / hasBlockedAttachment
The IMAP envelope fetch now names X-Kamo-Antivirus beside Message-ID (same HEADER.FIELDS fetch, no body read), and toEnvelope sets the removed count from remove...
Antivirus for mail β read gate on every mailbox, milter placeholders, send screening, detections
- Read: every attachment/inline part from any mailbox (Kamo Mail, IMAP providers, Graph; personal and shared routes) is hashed in memory (temp file past 8 MiB...
Preview samples for the legal review letters
hr.package_needs_review / hr.package_returned / hr.package_approved (seeded from kamo-shared-library's canonical templates) now preview with realistic whole sen...
Members choose which details their signature prints (UPDATE_OWN_SIGNATURE)
/api/email/member-signature GET/PUT/DELETE; the composer narrows the org's USER-scope toggles with the sender's own choices (never the settings editor's explici...
Sales Floor notices are gated on the Leads right
SALES_FLOOR (kamo-shared-library 3ea204a5) is gated on VIEW_LEADS: every owner, floor worker and deal-role holder holds it today, where a floor right would sile...
Stream emails print the sender's and the org's NMLS and the equal housing mark
Saved and written stream emails alike, above the address and unsubscribe. Only for an org with an NMLS number.
Fill the one merge field list, so a saved email reads the same in a drip
A landed call, text or email tells open screens
The contact tracker now announces each communication on the floor's domains, so a call the phone system reports reaches the board at once instead of on the next...
A stream's email wears the org's email template, and can be a saved template
The same compose wrap a drip's email gets. A saved template's HTML goes as it stands, with the compliance lines a written email gets.
Write to an org's owner each week a domain is unfinished
Covers ownership, web addresses, alias-domain mail and what we need to send system mail as the domain. From the platform, one letter per owner, and it stops by ...
Stream emails on the drip road, and a lead's mail reply tells their streams
/api/internal/stream-email queues one edition per run and step through DripEditions, so the campaign path keeps the opt-out check, hosts, warm-up and unsubscrib...
A lead's Stop all outreach ends their drips, and an unsubscribe can set it
An unsubscribe is offered to the lead's Stop all outreach, which does nothing unless the organization turned it on. Mail to and from a lead now updates its last...
Alias domains sign with the org domain's own DKIM key
An alias domain is an organization domain, and SecurityService already gives every org domain one DKIM key (org_domains.dkim_*), the record the owner is told to...
Per-kind phone and voice channels, the voice mirror, and SI_ASSISTANT_REPLY
Voice Assistant program (2026-10-27) P3-5, P4-1, P4-2, P4-4. - GET/PUT /api/notifications/channels and PUT **************** per-kind PHONE/VOICE choices (BELL...
Alias domains receive and sign on their own; colleague and self defaults
The mail server now learns an org's alias domains from EmailService instead of hand-edited postfix config. KamoMailAliasDomains keeps an alias_domains table in ...
Manage the org's alias domains, and allow aliases on them
org_alias_domains only ever existed by hand-written SQL. New /api/email/alias-domains lists them (any member of the org) and adds, removes and sets the default ...
An alias works on every alias domain, like the primary mailbox
The org's alias domains (org_alias_domains) already mirrored the member's primary mailbox into the composer (erik@kamocrm.com also offered as erik@kamouniverse....
A member can send from an alias by default
PUT **************** chooses which alias stands in for the member's primary mailbox (null clears it). One alias per member at most carries is_default; the colum...
A message's sender facts for SI identity checks; SI_AUTH_REQUEST belongs to no app
The provenance answer now also says what the message itself claims about its sender: From, Reply-To, the server that handed it to ours, and the SPF/DKIM/DMARC r...
A plain-text version beside the HTML, and an SI's recap letter for a supervisor when the SI has no mailbox (TPRECAPS)
/api/email/send takes an optional textBody: the body is then multipart/alternative (text, then the HTML), inside mixed when there are attachments. POST ********...
Prove a teammate sent an SI's email, so an emailed request can count as their order
An internal endpoint answers whether a message in a member's own mailbox was sent by a teammate: its From reaches a member of the same org, and that member's ow...
Refuse a mailbox past the organization's email licenses
Owner rule 2026-10-22: per-user add-ons bill the licenses purchased; how many mailboxes may be in use is limited only by them. Before a mailbox is put into use,...
BILLING_INVOICE, gated on viewing subscription invoices
Raised by SecurityService to the selling organization's owners when a subscription invoice draft is waiting for review or a customer's invoice goes past due. Al...
An event names its organiser; an RSVP that cannot be taken says why (SITP TP12)
- EventDto carries organizerEmail, so the Tool Plane's calendar_rsvp names who the answer is mailed to (and classifies an outside organiser as an external mee...
IOT_ALARM phone push body and withdraw-with-update (SP10)
An IOT_ALARM event card (source **************** as iot-service's AlarmNotifier writes it, or <alarmUuid>:<seq>) is mirrored as an IOT_ALARM push: channel/colou...
Preview sample variables for the iot share letters
Rebuilt on the new shared library BEFORE IoTService sends (a missing template key 404s forever).
NoReplySubsystem.IOT, the preview sample and mirrorToPush
IoT Devices SP06: alarm letters (iot.alarm_notice) audit under IOT; the template preview has sample values; POST /api/internal/notifications takes an optional m...
An unsubscribe from one of the organization's own protected addresses is noted, not listed
Owner 2026-10-15: the do-not-block list beside the do-not-contact list. DoNotContactEmailBeans declares shared-lib's DoNotBlockList and hands it to the DoNotCon...
Gate the RPM_ALERT kind on REVIEW_CLINICAL_RESULTS and list it after LEAD_CALLBACK
Email unsubscribes reach the do-not-contact list, and campaigns, shares and an SI's mail check it
Owner 2026-10-15: one company-wide do-not-contact list per organization, scoped per channel; an email unsubscribe blocks email only. - Writer: MirroringEmailOp...
A meeting that arrives by email asks once, then keeps itself current
A new invitation in the mail reader now offers "Add to calendar". Once a member has added it, the organiser's follow-ups apply on their own: a moved time, a new...
Gate the eight IoT kinds on their rights with the owner rule, in one display order (IoT SP00)
Preview the new-lead-available letter
Adds the LEADS_AVAILABLE arm to sampleVariables, built through the same shared-lib LeadsAvailableEmail helper SecurityService sends with, so the admin preview s...
CALENDAR_EVENT labels and thread keys on mail rows β the labels endpoint serves every resolver, CalendarEventLabelResolver labels an event of the org (owner, member, department and job-title audiences through the org graph, member attendees; others EMAIL:), and search and conversation rows carry threadKey (KamoCollab CP07 Task 7)
CalendarEventLabelReads reads the event by primary key and organization (live only), its audience and attendees by the event-id indexes, and users to members by...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
