The platform-pricing loaders find the platform org as the top-level org, not by its short title
KamoCRMMarketBackfillLoader and KamoCRMPricingLoader looked the platform org up by titleShort = "KamoCRM". That stopped matching when the brand moved to KamoUni...
Delete the org-domain ownership backfill; it finished, and it verified second claims
**************** was a one-off (2026-08-28) that marked live org_domains roots ownership_verified when host routing started to require it. It ran again on every...
The Family, Community and Personal catalogs beside KamoCRM's business ladder
KamoUniverse sells four catalogs out of the platform org's one plan table. This lands the schema and the data for the three new ones. - UniverseColumnsMigratio...
Delete the lead contact-point backfill; it finished and no code scans every lead
The KamoInitializer run that ended at 18:51 PDT today logged LeadContactPointSeedRunner: complete — 795983 leads scanned, 1552381 contact points opened, 0 faile...
No shared provider key in the seed; every app, AI Workforce included, has a catalog row
Pin kamo-shared-library 1.6.1, the version the library stays at
1bb9801 pinned 1.6.2 together with the library bump in db737a54. That bump is reverted, because about thirty services pin 1.6.1 and each build can only resolve ...
Migration for org_alias_domains, seeding the platform org's two
Creates **************** and seeds the platform org (is_top_level) with kamouniverse.com (default, carrying forward the old hardcoded platform.mail.domain) and ...
The columns and activity log the Arive integration maps
**************** (unique), the Arive link fields on lead_los_links (kind, GUID, deep link, stage, pending-since, last error) and los_sync_events. All nullable, ...
The Notes plan feature is "Notes & Checklists"
The Notes app holds checklists as well since 2026-09-23 and is called "Notes & Checklists" everywhere it is named. The pricing page's comparison chart takes its...
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...
No live credentials in application.yml defaults
The local-development defaults carried the database OWNER's password (${DB_PASSWORD:<literal>}), and apiservice/securityservice also the live changelog webhook ...
Put the app in the entitlement catalog, add-on only
**************** asserts every sold app is categorised and sits somewhere on the tier ladder, because an app the catalog does not describe lands nowhere on the ...
Leave unique keys to the entities instead of duplicating them
Eight migration statements created unique indexes on exactly the columns their entities already declare unique (BillingGroupMember, BillingGroup, MailboxBilling...
Stop creating a plain index shadowed by the unique one
member_notification_preferences (member_id) got both a plain and a unique index from the same statement list; the unique index serves every lookup. The plain on...
Webinar_notify_member, the team members copied on presenter emails
One row per (organization, team member): the Additionally Notified list on the Scheduled Webinars settings tab. MediaService blind-copies these addresses on eve...
Page_transition_overrides, an organization's and a member's own page transition
One row per owner (ORG with the org id, MEMBER with the member id): a catalogue token or NULL to follow the level above, and properties for only the transitions...
**************** beside the transition
A TEXT column holding each transition's properties as JSON keyed by transition id. No backfill: null means every transition's defaults, like page_transition bes...
**************** ahead of every reader
A catalogue token, NULL meaning the shipped TILE_DISSOLVE, so nothing is backfilled. Order 0 because the entity maps the column from this build on, and an earli...
The unique (campaign, address) index, for a fresh environment
EmailService used to create **************** on every startup; DDL on this cluster belongs here instead. Idempotent, auto-committed (YugabyteDB builds indexes o...
The repeat-sound columns, for a fresh environment
EmailService runs ddl-auto: none, so neither column can appear on its own — the entity declares them and Hibernate reads the table happily without them, then fa...
Drop the frozen type_id CHECK that blocked every bug thread
`media_sessions` is created by Hibernate's ddl-auto, not by a migration, so it carries the constraint ddl-auto writes for an `@Enumerated(ORDINAL)` column — fro...
System_bug.media_session_guid, and its lookup index
The column behind a report's comment thread, matching **************** — VARCHAR(36), because MEDIA_SESSIONS.GUID is itself a 36-character string column and a t...
Add denial_reason, and sweep the three retired status names
status_name holds a NAME read back through @Enumerated(STRING), so a row still saying TRIAGED after the constant is gone does not read as a default — it throws ...
Stop the operator seed re-granting revoked platform rights
Rights taken away from a platform administrator on Platform Admins came back on their own days later, which read from the console as a save that would not stick...
Seed the $99 per-seat startup fee on every paid tier
The loader passed null for setupFee on all four plans, so a freshly seeded environment priced onboarding at nothing while production charges $99 a seat — the ki...
System_bug.published, defaulting to TRUE
The column behind the Publish flag: a god-mode operator can now file a report that stays with god mode until somebody releases it. DEFAULT TRUE is the whole re...
Make hr_job_application.member_id nullable
ddl-auto adds columns; it never relaxes constraints. Flipping optional=false to true on the entity changes what the ORM believes and nothing about what the data...
Email_signature_badges, and the columns that order them
The footer badge library plus footer_badges / footer_badge_spacing / footer_badge_height on email_signature_templates. A runner and not just ddl-auto for the u...
Scan hr.careers, and drop the frozen work-location CHECK
Two changes, both required before the careers entities can reach the database. The @EnableJpaRepositories list is an explicit array while @EntityScan is wildca...
Commerce_quotes.setup_fee
A one-off setup fee on a quote that presents a single price. The fee already existed on QuoteOption, where each alternative carries its own; a flat sheet had no...
Reprice stored quote totals through the pricing engine
Quote money columns are written, not computed on read, so the two corrections that landed on 2026-09-02 — a unit price is a per-month rate the term multiplies, ...
The columns that let an event invite its guests
Three on calendar_events, because whether a meeting invites people belongs to the meeting rather than to the moment it was saved — an edit six weeks later that ...
Commerce_quotes.billing_basis
The per-quote snapshot of the org's quoteConversionBilling choice, so a quote keeps the terms it was raised under after an administrator changes the setting. Nu...
Scan the Report Studio's repositories
**************** holds the saved views, shares, favorites, recents, schedules and schedule runs. The reports themselves are code rather than rows — only a membe...
Columns for a market's quote contact and the per-quote snapshot
A market names its answer in QUOTE_CONTACT_MODE (+ QUOTE_CONTACT_MEMBER_ID when that answer is one explicit person), and each quote keeps the contact it was rai...
Migration for KB_ARTICLE_RELATIONS
Mirrors KbArticleRelation in kamo-shared-library. Written explicitly rather than left to ddl-auto so the UID and DATE_CREATED defaults live in the database, whi...
Keep every live domain routing once verification becomes mandatory
Host to organization resolution is about to require ownership_verified on the top-level domain row, so that a domain several organizations have merely named rou...
The three per-member-type home-screen columns on a security model
CHILD_ORG_SECURITY_MODELS gains DEFAULT_MEMBER_HOME_SCREEN, DEFAULT_TEAM_MEMBER_HOME_SCREEN and DEFAULT_ORG_OWNER_HOME_SCREEN. Each holds HOME_SCREEN_DEFAULT (t...
Let a seeded org omit its year established
createOrg took the year as a primitive int, so every seed had to supply one even though YEAR_EST is nullable and the field is optional platform-wide. Integer, s...
The invoice takes REVOKE DELETE, not REVOKE UPDATE
attachPdf writes PDF_BLOB_ID after the finalize transaction commits, on purpose: rendering inside it would hold the document-counter row lock across a MinIO rou...
The REVOKEs three entity javadocs already claimed existed
BillingWormGuard, BillingDispatch and BillingSyncIssue each cite "a REVOKE UPDATE, DELETE in the KamoInitializer migration". No such migration existed — the sta...
State the company phone column defaults where IF NOT EXISTS cannot swallow them
The 2026-08-27 run proved the ADD COLUMN ... DEFAULT FALSE never applied: ddl-auto builds the SessionFactory before any CommandLineRunner, so Hibernate had alre...
System_bug_view — who has read which report
Per VIEWER, not per bug, and that is the whole reason it is a table rather than a first_viewed_at column on system_bug: triage is worked by several people at on...
Land the company phone toggle columns before EmailService reads them
ADD COLUMN IF NOT EXISTS on **************** for user_company_phone_main and user_company_phone_toll_free. This service's ddl-auto: update would add both from ...
Volume bands stop pricing seats the plan does not sell
Starter admits 5 seats and Business 25, but the bands ran to 25 and 100 — four of the six priced seat counts nobody could reach. Starter's 10%-off-at-11 tier wa...
KI would not compile against the shared library on main
VendorDTO.uid became a String — a Long in the database, a string on the wire — and this call site still handed it to **************** which is a server-side req...
4 GB per seat on every plan, and seats rather than users
Storage stops being a tier differentiator. The 2/4/5 ladder put one gigabyte between Starter and Business on a page that then had to explain what "pooled" meant...
Drop the CountryType frozen ordinal checks
CountryType has 196 constants, AFGHANISTAN(0) through ZIMBABWE(195), and every check written over it froze at 0..195. They are not one value away from failing -...
Per-seat storage, and a flat Enterprise pool
2 GB per seat on Free, 4 on Starter, 5 on Business. Enterprise stops scaling with seats entirely - a flat 150 GB for the organization - which "N GB per seat" ca...
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.
