KamoCRM

Live Change Log

Every feature, fix and improvement, posted as it ships. Nothing is held back for a launch.

17,374
Total Changes
5,891
Features
5,258
Fixes
30
Projects
Filter by project
All Projects17,374AIService242APIService174BillingService157ConversionService110DaemonService137DocsService223ESigService91EmailService568InitializerService329KBService151KlusterServices738MCPGatewayService235MediaService592RAGService79SecurityService1,822TranslateService62VOIPService248VectorService11kamo-apps26kamo-asterisk-support27kamo-capcha17kamo-capcha-widget4kamo-internal8,321kamo-login335kamo-marketing641kamo-nowww20kamo-register213kamo-shared-library1,631kamo-signer-monorepo56kamolos114
Filter by type
All TypesBuild16CI523Chore773Docs3,252Feature5,891Fix5,258Other993Performance165Refactor278Revert23Style42Test159Upgrade1
October 23, 2026
FixBillingService

Invoice checkout sessions are unkeyed, like every checkout Session

A stable idempotency key would hand a returning customer the same, possibly expired, payment page ****************

KamoΒ·18h ago
FeatureBillingService

Pay a subscription invoice by card on a Stripe-hosted page

Internal POST **************** creates a payment-mode Checkout session for the amount owed. It saves the card for future automatic charges when the customer has...

KamoΒ·18h ago
FixBillingService

Cap only add-ons the organization holds

An add-on it does not hold is left to the existing entitlement gates, as before caps existed - paying organizations running a phone server without the add-on co...

KamoΒ·19h ago
FeatureBillingService

License usage and per-unit license checks for per-user add-ons

Owner rule 2026-10-22: every per-user add-on bills the licenses purchased, like seats; how many mailboxes or extensions may be in use is limited only by them. ...

KamoΒ·20h ago
October 22, 2026
FeatureBillingService

Internal card endpoints for subscription invoice auto-charge

GET **************** and POST /charge, guarded by the shared X-Internal-Auth secret (constant-time compare; 403 without it). A charge is an off-session PaymentI...

KamoΒ·21h ago
FixBillingService

Stripe bills add-on licenses held, not mailboxes or extensions in use

Every add-on now takes its quantity from AddOnLicenses, the rule the order calculator and subscription invoices share: licenses bought, defaulting to the seat c...

KamoΒ·22h ago
FeatureBillingService

Rebuild the Stripe mirror from Stripe nightly and on startup

Events older than 30 days cannot be fetched, so the September invoice and subscription events lost to the API-version mismatch are unrecoverable as events. Stri...

KamoΒ·23h ago
FixBillingService

Read Stripe events from any API version, and replay the ones that failed

The live webhook endpoint renders events at 2026-03-25.dahlia; stripe-java pins 2024-12-18.acacia, so every invoice, payment and subscription event since has fa...

KamoΒ·23h ago
October 19, 2026
FixBillingService

GodModeVerifier judges the god-mode window at its own clock (shared SessionPlatformFacts expiry)

**************** now also needs godModeExpiresAt ahead (kamo-shared-library 1.6.1). windowOpen(session, memberId, now) asked the shared reader at the system clo...

KamoΒ·4d ago
October 18, 2026
FixBillingService

Billing accounts answer to VIEW_ORG_BILLING / MANAGE_ORG_BILLING, and the listing shows a member only their own (SITP TP02)

BillingService authorized 'own account or organization owner' and never consulted a right, so the owner could not hand billing to an administrator or an SI. Acc...

KamoΒ·5d ago
FixBillingService

Stop logging the database password at startup

com.zaxxer.hikari at DEBUG makes HikariConfig print its whole configuration on every start, including dataSourceProperties {password=...} and password......; Pr...

KamoΒ·5d ago
October 14, 2026
FixBillingService

Seat the organization's existing staff when it starts paying

Turning PAID seated only the buyer; everyone else hit "This needs a licensed seat" on the product just bought until the owner assigned seats by hand. On the tra...

KamoΒ·1w ago
BuildBillingService

Rebuild onto kamo-shared-library 6fce139a

Picks up OrgStorageAggregator 3eda4b54: BULK_EXPORTS and EXCHANGE_DOCUMENTS read object_storage_days instead of 0.

KamoΒ·1w ago
FixBillingService

God mode comes from the caller's own session window, never a header

BillingService took X-God-Mode-Active plus users.is_god as god mode, and kamo-internal copied that header straight off the browser, so a god-eligible operator h...

KamoΒ·1w ago
September 28, 2026
FixBillingService

The Enterprise refusal names KamoUniverse

"The Enterprise plan is arranged directly with KamoCRM and cannot be selected here. Contact us and we will set it up for you." is echoed verbatim to the custome...

KamoΒ·3w ago
FeatureBillingService

The billing console sells an organization its own universe's plans

KamoUniverse adds Family, Community and Personal ladders beside the business one, and BillingService assumed a single catalog: "the Free plan" was the code FREE...

KamoΒ·3w ago
September 24, 2026
OtherBillingService

Own NATS login and Redis login

KamoΒ·4w ago
September 23, 2026
FixBillingService

Pin kamo-shared-library 1.6.1, the only version that exists

The library moved to 1.6.1 and this service still asked for 1.6.0. There is no window in which both resolve: the library is never published to a remote, so the ...

KamoΒ·4w ago
FixBillingService

Only an organization's owner may change who pays for mailboxes or extensions

**************** and **************** had no authorization check at all β€” any member of the organization, not only its owner, could move the whole organization'...

KamoΒ·4w ago
TestBillingService

Growth Hub files are reported on their own line

This pins the GROWTH_HUB domain kamo-shared-library gained today. Before it, no domain claimed the Growth Hub's two associations, and the imaging pass dropped t...

KamoΒ·4w ago
ChoreBillingService

Scrub copies of live credentials from config and dumps

A sweep of every repo for the values of the cluster's live Secrets (2026-09-23) found copies here: the JWT signing secret as a `${JWT_SECRET:<literal>}` default...

KamoΒ·4w ago
September 18, 2026
FeatureBillingService

A group seat's coverage carries its manager's member id

GET /api/billing/self/coverage named the billing group's manager (managerName) but not who they are, so the member's plan page could not open the manager's memb...

KamoΒ·1mo ago
September 16, 2026
OtherBillingService

Liveness probe on /actuator/health/liveness, not the DB-aware aggregate

The aggregate /actuator/health includes the DataSource indicator, so restarting the database failed liveness on every pod at once and restarted the whole platfo...

KamoΒ·1mo ago
OtherBillingService

Release idle Hikari connections now that YSQL pooling is shared

The connection manager no longer pins sessions **************** so idle app connections no longer each hold a database backend. Keep the pool maximum, but stop ...

KamoΒ·1mo ago
September 11, 2026
FeatureBillingService

Active and Void tabs in the platform org directory

The console's Organizations tab now splits into Active and Void sub-tabs. A voided organization is orgs.is_active = FALSE (set by SecurityService's void endpoin...

KamoΒ·1mo ago
September 10, 2026
FixBillingService

Rerun a webhook event whose first attempt died, and refuse one the SDK cannot read

A losing claim on an unprocessed row always answered 500, so an event whose first attempt failed (a unique-constraint race inside the invoice.created/finalized/...

KamoΒ·1mo ago
FixBillingService

Only a failed charge starts dunning, and Stripe must agree before dunning acts

invoice.finalized carries status=open with an amount due for every auto-charged invoice before the charge is attempted, and the invoice handler started the deli...

KamoΒ·1mo ago
September 9, 2026
FixBillingService

The same-commit-rebuild guard could never fire, and the digest check failed open

Both protections against a deploy that deploys nothing were inert, so the pipeline reported two green jobs while the pods stayed on the previous digest. That is...

KamoΒ·1mo ago
FixBillingService

A catalog row naming an app this build cannot resolve is not for sale

ServiceTypeConverter stopped throwing on an unknown app id and started resolving it to null, which is what a service must do β€” the enum ships inside each jar wh...

KamoΒ·1mo ago
September 7, 2026
FixBillingService

A price Stripe has never heard of is a fault, not a silence

The reconciler compared mapped prices against the catalogue and returned early whenever nothing was mapped at all. So a term the catalogue had gained since the ...

KamoΒ·1mo ago
September 6, 2026
FixBillingService

Charge what the screen says, and refuse rather than pretend

An audit of the Plans & Billing console against live Stripe keys found the seam between the screen and Stripe broken in every direction at once, and silent in a...

KamoΒ·1mo ago
FeatureBillingService

A plan's startup fee, and the live offer, on the wire

PlanDto carried only the recurring rate, so every surface quoting a plan quoted a price the customer would not be charged: KamoCRM's startup fee is $99 a seat, ...

KamoΒ·1mo ago
FeatureBillingService

One endpoint behind the customer's own plan page

GET /api/billing/self/plan answers everything /myplan renders: the plan, what the organization can actually use, the catalogue to compare against, seats and the...

KamoΒ·1mo ago
September 5, 2026
FixBillingService

Prove the deploy by digest, not by tag

The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...

KamoΒ·1mo ago
FixBillingService

A rebuild of the same commit deployed nothing and reported success

The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...

KamoΒ·1mo ago
FeatureBillingService

Bill the startup fee on both routes to a plan, and record negotiated terms

Two routes reach the same plan and only one of them was going to charge the new per-seat startup fee. A sales-written order bills through SubscriptionService, w...

KamoΒ·1mo ago
September 4, 2026
FeatureBillingService

Lock every money-moving sweep, and run two pods

BillingService ran one pod and its seven scheduled sweeps were correct only because of it. There is no ShedLock anywhere on this platform, so a second replica w...

KamoΒ·1mo ago
FixBillingService

Let a rollout finish what the old pod was doing

Deploys replaced the only pod of each service with nothing to catch the requests in flight. Three settings, applied across the fleet: - preStop sleeps 10s befo...

KamoΒ·1mo ago
August 31, 2026
FixBillingService

Stop offering the internal platform-owner plan for sale

listPlansForMarket filtered on isActive alone, and active is not the same as on the menu. OWNER_UNLIMITED ("Platform Owner β€” Internal") is active, carries no pr...

KamoΒ·1mo ago
FeatureBillingService

Serve the running offer, and say whether a seat is actually PAID for

Adds GET /markets/{id}/promotion. There was no way for an in-app buying surface to know an offer was running at all β€” the marketing site read promotions through...

KamoΒ·1mo ago
FeatureBillingService

Bill the three-year term, and quote its rate to the console

BillingCycles gains TRIENNIAL, expressed to Stripe as three YEARs rather than thirty-six MONTHs so the renewal tracks the signup anniversary β€” the same reason A...

KamoΒ·1mo ago
August 27, 2026
FeatureBillingService

Per-server lines on the extensions summary

The phone server's extensions tab showed the organization-wide figure and nothing else, so an empty KamoPBX server displayed "21 billable extensions β€” $63.00 / ...

KamoΒ·1mo ago
FixBillingService

The platform org is not gated by its own catalog

The platform org was told "Requires the KamoPBX Hosting add-on" on its own phone-server screen, for an add-on it publishes. It owns the plan catalog, the add-o...

KamoΒ·1mo ago
FeatureBillingService

Refuse a self-serve Enterprise subscription

Enterprise is negotiated. Hiding the price is presentation; this is the boundary. A request naming the Enterprise plan is refused unless the caller holds ******...

KamoΒ·1mo ago
FeatureBillingService

Bill phone service by the extension

PricingModel.PER_EXTENSION, its own reserved quantity key, an allocator, a nightly reconciler, a removal gate and the summary API - the phone twin of the per-ma...

KamoΒ·1mo ago
August 26, 2026
FixBillingService

Scan the shared-lib email.billing repository package

@EnableJpaRepositories lists packages explicitly, so MailboxBillingDayRepository was invisible and the service refused to start outright β€” caught by booting it,...

KamoΒ·1mo ago
ChoreBillingService

Rebuild against current kamo-shared-library

CI clones shared-lib at image build time. This service was last built before shared-lib gained GMAIL_PERSONAL and OUTLOOK_PERSONAL, so its deployed enum cannot ...

KamoΒ·1mo ago
FeatureBillingService

Expose mailbox counts, entitlement and cost mode

KamoΒ·1mo ago
FeatureBillingService

Bill e-mail per mailbox, reconciled nightly

Quantity is server-computed under a reserved key a request body cannot reach, and pushed through the existing amend path β€” so Stripe's CREATE_PRORATIONS charges...

KamoΒ·1mo ago
FixBillingService

Close the webhook idempotency gap BL0's final review found

Finding 1 (Critical): a losing claim on a redelivered Stripe event only proved a row existed, not that the prior attempt finished. A claimed row left behind by ...

KamoΒ·1mo ago

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