Enforce member rights on all nav items
Every nav item now requires both org feature flag AND member right. 7 new access rights added: ACCESS_COMMERCE, VIEW_CALENDAR, ACCESS_CHAT, ACCESS_MAIL, ACCESS_...
Prevent double-wrapping of full-document bodyHtml in block designer
When bodyBlocks is null and bodyHtml is a full <!DOCTYPE html> document (e.g. canonical seeded templates), importing it as a single block caused serializeFullEm...
Serialize full email HTML with outer frame on template save
- serializeFullEmailHtml wraps inner blocks in the branded outer frame (header logo, title/subtitle, content area, footer logo + org name) using absolute UR...
Compact editor header — remove large title/tabs, move actions to nav row
Removes the sticky header card (title, subtitle, Save/Cancel/Preview buttons, Edit/Preview tab bar) from EmailTemplateEdit to reclaim ~200px of vertical space a...
Add account settings pages for phone + security questions (SP3)
Adds **************** with API wiring to SecurityService /api/account/*. Syncs nav across all 3 locations.
Route preview through Browser's backend-rendered modal (part of SP2)
The EmailTemplateBrowser now owns the Preview modal directly, so the Manager no longer needs to intercept row-level preview requests and redirect to edit mode.
Wire EmailTemplateEdit to real API
Hydrates from templateApi.get, saves via templateApi.update. Category dropdown is API-driven with inline category-create affordance. Variables picker reads from...
Wire EmailTemplateBrowser to real API + add System Defaults tab
Replaces ~140 lines of mock data with templateApi.list() calls. Conditional fifth tab 'System Defaults' appears only for top-level-org admins and renders from r...
Add EmailTemplatePreview modal
Opens on row-action Preview. Backend-rendered via templateApi.preview(); result displayed in a sandboxed iframe for style isolation. Matches the exact code path...
Delete unused EmailGeneralManager.tsx (~560 lines of dead code)
Component was never imported anywhere. Its toggles (bounce handling, unsubscribe, delivery tracking, default from email) had no backend and were purely cosmetic...
Add templateApi + categoryApi + variableContracts client modules
Wraps SP1's /api/email/templates/* and **************** endpoints with typed TypeScript helpers. variableContracts mirrors SP1's TemplateKeys Javadoc so the edi...
Add analytics icon to navtop with OTK-authenticated iframe
Adds a BarChart icon to NavTop gated to Team Members of the top-level org (no parent). Clicking navigates to /analytics which generates an OTK and loads analyti...
Replace separate call/text icons in navtop with unified VoipButton dropdown
Show TXT domain ownership record in DNS setup UI
- DomainData/DnsStatus: add verificationToken, ownershipVerified, type fields - AliasStatusTable: show TxtOwnershipCard above CNAME table with copy button, in...
Sticky header, updated aliases, always-visible plain-English DNS guide
Populate DNS statuses when already confirmed; show org name prominently throughout
Prominently warn that www record is optional and can break existing sites
Add /setup/dns page and domain setup flow to /network
- New /setup/dns page with two-phase flow: domain entry then DNS verification with 60-second auto-polling and SSL confirmation - ManualDnsGuide: collapsible s...
Handle empty API responses and graceful degradation on billing tab
- billingApi get/put helpers now safely handle empty response bodies instead of crashing on res.json() with empty input - PlansBillingTab loadData wraps every...
Resolve org/member context from *** session for billing proxy
BillingService controllers require X-Org-Id and X-Member-Id headers. When calling directly (bypassing APIService), these weren't being set. Now the Next.js prox...
Use string type for org/member IDs in network page to handle CockroachDB unique_rowid() precision
Call BillingService directly via k8s DNS instead of through APIService
Next.js server-side proxy now calls BillingService at **************** directly, skipping the unnecessary hop through APIService. Uses BILLING_SERVICE_URL env v...
Add Next.js API proxy route for /api/billing/*
The billing API client was calling /api/billing/* as a relative URL, which hit the Next.js server instead of the APIService gateway. Added a catch-all proxy rou...
Replace storage add-on toggle with quantity slider
Additional Storage is usage-based ($4/25GB block), not a simple on/off add-on. Replaced the toggle switch with a slider (0-1000GB in 25GB steps) plus a numeric ...
Add parentId and parent to OrgProviderProps type
The Organization props interface was missing parentId and parent fields, causing them to be dropped during TypeScript compilation even though the backend sends ...
Wire BillingManager and RelationshipManager to real backends
BillingManager (account billing tab): - Replaced 100% local-state mock with real Stripe-backed payment method management via billingApi - Loads payment method...
Replace mock stats page with live KamoCRM subscription dashboard
Rebuilt /settings/account?tab=stats into a fully wired, read-only insight dashboard. Replaces all mock data with parallel calls to BillingService via the existi...
Complete Choose a Plan flow end-to-end
- Wire PlanCalculator into PlansBillingTab dialog (replaces placeholder) - Fetch available plans from billing API on page load - Handle plan submission: creates...
Hide Plans & Billing tab for root KamoCRM org
KamoCRM org owners have everything enabled at no cost — they should never see the billing tab. The tab is now conditionally rendered only for child organization...
Integrate Stripe billing system across the platform
- New billingApi.ts client with full TypeScript types for all billing endpoints (subscriptions, payment methods, invoices, credits, usage, config, admin) - ...
Add concurrency group to prevent duplicate workflow runs
When a push triggers a workflow and workflow_dispatch is also fired (or two pushes arrive in quick succession), both runs would execute simultaneously. Adding a...
Add Open in Docs button for editing documents, spreadsheets, presentations
- New "Open in Docs" button (EditNote icon) in doc manager Actions column for .docx, .xlsx, .pptx, .odg, .doc, .xls, .ppt files - Opens document in Docs edito...
Build integrated auto lead imports UI with full endpoint management
Complete rewrite of LeadAutoImportManager with production-ready features: - Endpoint CRUD with unique webhook URLs for 3rd-party lead vendors - Copy-to-clipboar...
Show uploader name, widen date column, merge extension icon into file name
- Uploaded By: was always empty — field name was correct but backend never set createdByName; now resolved on the backend side - File Name column: prepend fil...
Add stored size tooltip to Size cell in doc manager
Tooltip shows the breakdown of actual storage used per document: original file, thumbnails (original + converted combined), and converted doc — plus a total. Th...
Skip loading screen for file downloads in NavigationInterceptor
Blob URLs and links with the download attribute never cause page navigation, so the global click handler now returns early for these — preventing the "Loading K...
Surface save errors and revert optimistic update in email provider selector
When saving a non-configurable provider (KamoMail, ParentOrg, NotConfigured) failed, the error was set in state but never displayed in the list view, and the op...
Move doc manager action buttons to toolbar search row
- Removed Create Document, Upload Document, Bulk Upload, and Refresh from the gradient hero header - Hero header is now title/description only - Create Document...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.