This is one of those things that feels confusing because the test strip says everything’s fine, yet the tub clearly disagrees. Foam almost never comes from bad chlorine or pH numbers by themselves. It shows up when there’s stuff dissolved in the water that sanitizer hasn’t fully removed yet, then the jets add air and whip it into bubbles.
In my case it started right around the 2–3 month mark too. Water was balanced, sanitizer held overnight, but the second the air kicked on I’d get that cappuccino layer. What was actually happening was organics building up slowly from normal use. Sweat, detergent residue from swimsuits, even body oils you don’t notice. None of that shows up on a basic test, but it raises the chlorine demand and messes with surface tension. If alkalinity is a little soft, the problem shows up faster because pH drifts under aeration and sanitizer efficiency drops even though it still reads “in range”.
Shocking helps temporarily because it burns off some of that load, but it doesn’t remove what’s already dissolved or hiding in the plumbing. What finally stopped it for me was treating it as a cleanup problem, not a balance problem. I did a deeper filter clean, shocked once properly with the cover open so it could off-gas, then followed up with an enzyme to slowly break down what was left instead of just masking it. I keep aquadoc spa defoamer around now, but only for guests. Once the enzymes did their job and the bather load settled, the foam stopped coming back.
If it were “just normal,” it wouldn’t keep returning this consistently. Foam is basically the tub telling you there’s leftover gunk in the water, not that your numbers are wrong. Once that hidden stuff is gone, the jets can run full blast and the surface stays calm again.