KamoCRM

The organization's do-not-contact list — VOIPService owns it, texts check it, STOP and START write it

FeatureVOIPService
Shipped
October 15, 2026 at 4:49 AM UTC
Author
Kamo
Commit
e653f74

Owner 2026-10-15: one company-wide do-not-contact list per organization, scoped per channel ("Only that channel"). - DDL **************** (DO_NOT_CONTACT, DO_NOT_CONTACT_EVENT append-only for kamo_app, DO_NOT_CONTACT_SETTINGS), applied 2026-10-15 04:35Z. - DoNotContactBeans declares shared-lib's DoNotContactList (repositories already inside the com.kamo.z.shared.comms scan; VoipRepositoryScanTest pins them). - /api/voip/do-not-contact (MANAGE_VOIP_SETTINGS): list/search, add, import (up to 1000 lines), POST /{id}/remove with a required reason, history, activity, settings (call mode WARN | BLOCK, default WARN). GET /check needs only the session: what the softphone and the mobile app ask before dialling ({listed, recordedAt, source, mode, message: "{number} asked not to be called on {date}."}). - Lookup for other services: GET **************** ?orgId=&channel=&address= (KAMOAI_INTERNAL_SECRET); a service with the shared-lib scan calls **************** channel, address). - Texts: SmsGateway refuses a number listed for SMS with OPTED_OUT (never retried) for every sender, a person's or an SI's sms_send; the HELP reply is exempt (Attempt.keywordReply). Bulk /send and /test-send refuse it with 409. Transactional template and internal sends keep their existing rules. - STOP lists the number for texts (source SMS_STOP); START/UNSTOP takes it off for texts only (SMS_START, reason "Texted START"). The STOP projection on AGENT_CONTACT_STATE now sets texts only: email, chat and social keep their own opt-outs (owner: a STOP text blocks texts only). Tests: DoNotContactControllerTest, SmsGatewayTest, SmsKeywordServiceTest, **************** VoipRepositoryScanTest (RED on origin/main, GREEN here), VoipMessageServiceKeywordTest, InternalAuthFilterKamoaiTest.

All changes

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.

Start Free ForeverView Pricing