Let a reader send the seat-fee article to someone they know
A "pass it on" form at the foot of **************** reached from a chip at the top and a line after the seven questions. The reader names up to three people and...
Put every page in /sitemap.xml itself, and list pages only in the languages they have
/sitemap.xml was an index, so opening it showed 79 file names rather than the site's pages. - /sitemap.xml is now one <urlset> with every page: 18,700 of them,...
Public service announcement on who keeps software seat fees
New page at **************** explaining, for non-technical owners, how resold white-label platforms work: a flat agency license, per-seat fees the agency keeps,...
List every page in every language it exists in, and make each page agree
/sitemap.xml listed each page once, as its English URL. The 17,843 changelog entries had no language alternates at all, and every page's own hreflang named all ...
Order sitemap <url> children as the schema does, and give each chunk one address
The sitemap XSD is a sequence: loc, lastmod, changefreq, priority, then extension elements. The hreflang links were written straight after <loc>, which Google t...
Generate the sitemaps per request, and give every change its own page
/sitemap.xml was a metadata file prerendered at build time, in a container that cannot reach KBService or SecurityService, so every deploy shipped a sitemap wit...
Drop the remaining third-party plan and cost wording
- zoho-mail, ecwid: the FAQ answering which of the vendor's plans, free or paid, the integration needs is removed. Both items take i18nKey "<slug>-r2" so no...
Quote only our own price, never another company's
The comparison pages set each competitor's list prices, add-on prices, "a typical team pays" estimates, TCO and implementation figures, and "N% cheaper" verdict...
List the phone number on the English pages only
showsPhone(locale) in app/lib/phone.ts is the single rule, currently locale === "en". PhoneLink returns nothing elsewhere, which covers the header, mobile menu ...
Let the logo lead home, and list the phone number where visitors decide
The header's Home entry duplicated the logo, which already links to /. It is gone from the desktop and mobile menus; in its place the logo carries a hover/focus...
Draw the search icon down from the full-size mark instead of doubling the small one
The 192px icon Google lists was the 96px export with every pixel doubled. It is now downscaled from the 820px master, so its edges are drawn rather than stepped...
Give Google a canonical it can read, and stop redirects outvoting it
Search Console began excluding pages as "Duplicate without user-selected canonical", "Duplicate, Google chose different canonical than user" and "Alternate page...
Publish prices search engines accept, and the ones the page actually shows
Search Console's product snippet report flagged "Invalid price format" on both `price` and `priceSpecification.price`. The cause was Enterprise going out as "pr...
Hand Google the green-tile mark, because it lists the largest icon we declare
Search shows one icon per site and takes the largest one declared, apple-touch-icon included, so the 180px touch icons (ours and the theme's) outranked everythi...
The offer countdown could not hydrate, so React threw the banner away on every load
The homepage has been throwing React #418 β "the server rendered text didn't match the client" β on every load, in production as well as locally. The mismatch i...
Give the film a watch page, because Google will not index it from the homepage
Search Console reports the one video on this site as "video is not on a watch page". That is not a bug in the hero β it is Google saying the homepage is about t...
Let a local build reach the catalogue it already has the key for
`npm run build` on a laptop died prerendering /en/alternatives/gohighlevel with "Kamo seat prices unavailable", and `npm run dev` served a homepage with no pric...
The Labor Day crane is fifteen lines, not nine
The cost note counted the crane before it grew a two-leg lattice mast and a triangular jib section, which is the shape it needed to stop reading as a wobbling r...
Labor Day β a working skyline clocking off
The nineteenth scene, and the first Monday in September with the Saturday and Sunday before it. It is the one window on this calendar that cannot collide with a...
One source of truth, and a build that can actually reach it
Every price on this site had a second copy in the repo, and the second copy was the one being served. kamo-prices.ts said so in its own comment: the fallback t...
Stop every scene re-rasterising its sprite bank on resize
An audit of all eighteen scenes found the same defect in twelve of them, and it is the shape that degrades a tab over a minute or two and then stalls it in garb...
Remove the footer picker, keep the ?holiday= parameter
The dropdown was a temporary control for the initial review of the eighteen scenes and it has served its purpose. The query parameter stays β it is the only way...
Stop the page-rotation easter egg re-firing on every trip to the footer
The reported lockup was never the holiday scenes. It is `HiddenAnimations`, which has been in this repo the whole time, and the report described it exactly: "so...
Stop the scenes hanging the tab
Reported: "after about a minute or two the page looks to animate away then animate back and its completely locked up. Browser wants to close the tab." Reproduce...
Dress the site for eighteen days of the year
On ~84 days a year the marketing site now decorates itself, automatically, from the reader's own calendar. Snow falls through December and settles on the cards ...
Carry the no-credit-card mark on the nav Start Free too
The hero CTA changed but the nav button kept a Rocket, so the same action wore two different marks on the same screen β and the nav one is the button a reader s...
Swap the Start Free arrow for a no-credit-card mark
The hero CTA carried a generic ArrowRight, which told a reader nothing they did not already know from the button being a button. The objection it has to answer ...
Stop losing referral attribution on the marketing site
Two ways a member's referral was being dropped, both silent. 1. Every register/login CTA was the string literal `https://register.kamocrm.com`, while this s...
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...
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...
Say what the Free plan does not charge, beside what the paid ones do
Now that Starter and Business each carry a one-time charge on the card, a Free card that says nothing about it invites exactly the wrong inference β the reader ...
Make the startup fee findable β discreet is not the same as hidden
The note shipped at #8c8c8c with no spacing, wedged between the bright green term line and the plan description. That is DARKER than the body copy beneath it, s...
Remove the last "$0 setup" claim, and quote the fee only where it is fixed
Rendering the calculator turned up a claim the first pass missed: its "Included Free!" panel led with "Setup & Implementation β $0", struck through against a co...
State the startup fee, and stop claiming there isn't one
The site said "$0 setup fees" three times in the pricing page's metadata and listed "No mandatory onboarding fees" as an advantage over HubSpot. All of it is no...
Rebuild β the previous run never produced an image
f0edd01 was pushed with the rest of the fleet-wide rollout-safety work and is the only one of that batch whose image never appeared: the deployment is still run...
Drain on SIGTERM, and run two pods
Next handles SIGTERM with a bare process.exit(143), so every deploy severed whatever this pod had in flight β a form post, a server action, a streamed RSC paylo...
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...
25 pages titled themselves KamoCRM twice
Every page's <title> read `X | KamoCRM | KamoCRM`. The root layout sets `title.template: "%s | KamoCRM"`, and each page's own `title` already ended in the same ...
A product gallery at /screenshots
A page for showing the product as it actually looks. It is built around a data module rather than markup, because more screenshots are coming and adding one sho...
The summary line double-counted sections
A section page is itself one of the articles, so "291 articles, 16 areas, 29 sections" invited the reader to add up three numbers that do not add up. One number...
Rebuild the index as a map of the product
It was one recursive list of all three hundred articles, indented by depth. Everything was on the page and nothing was findable, and the page weighed 3.9 MB. T...
Keep made-up article paths out of the index
The canonical check already stops a wrong path rendering the article -- it serves the not-found page instead. What it cannot do is change the status code: this ...
Point at the real org, keep the tree in the URL, show related articles
KB_ORG_ID was "1". The help center lives in org 1168485648209608710, so every KB read on this site missed -- /help-center rendered its empty state no matter wha...
Starter base up $10 on every term
69 / 59 / 49, from 59 / 49 / 39. The commitment ladder is untouched by design β still exactly $10 off for a year and $20 for three β which is the standard every...
Set "/seat/month" to the right of its own line
The price keeps the left edge and the unit takes the right, so the two bracket the card's width instead of stacking flush left β which left the number looking l...
The offer reaches the hero and the pricing strip
The hero had a countdown ribbon already, and it had been rendering NOTHING since the catalog moved to a percentage: `pickHeroOffer` filtered on FLAT_PER_SEAT be...
Put "/seat/month" under the price, not beside it
Three-figure rates and "/seat/month" do not share a line on a four-across card. Inline at 1rem the label either wrapped mid-text or squeezed the number it was d...
A promotion that fails to resolve must not widen to every plan
An EMPTY applicablePlanIds means "no restriction" downstream, so a restriction that fails to TRANSLATE must not be allowed to become an empty list. A Business-o...
A promo code works on its own last day
The end date is the LAST day a code works, not the first day it does not β SubscriptionPromotions.check reads it that way on the server, and the offer band's co...
A three-term commitment rail, and a promotion the page can prove
New prices: Starter $59/$49/$39 and Business $119/$109/$99 per seat per month on monthly, yearly and three-year terms. The rail replaces the monthly/annual pair...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.