I went from 3k clicks/day to close to only a few hundred. I have 2 sites using the same canonical link generation code, only 1 has this problem (the other has a sitemap, any relevance?).
I examined my pages that previously had the most traffic and they have "Page is not indexed: Alternate page with proper canonical tag" error on the Google Search Console. However, the user declared canonical is properly selected in the page inspection report.
My implementation is adapted from 2022 blog post https://yoast.com/hreflang-ultimate-guide/#hreflang-canonical
Which has a desired output like this:
<link rel="canonical" href="https://www.example.com/">
<link rel="alternate" href="https://www.example.com/" hreflang="en" />
<link rel="alternate" href="https://www.example.com?hl=en-gb" hreflang="en-gb" />
<link rel="alternate" href="https://www.example.com?hl=en-au" hreflang="en-au" />
<!-- If we were on the en-gb page, only the canonical would change: -->
<link rel="canonical" href="https://www.example.com/en-gb/">
<link rel="alternate" href="https://www.example.com/" hreflang="en" />
<link rel="alternate" href="https://www.example.com?hl=en-gb" hreflang="en-gb" />
<link rel="alternate" href="https://www.example.com?hl=en-au" hreflang="en-au" />
Perhaps I should remove the alternate tagged "en" element? Or maybe the canonical tag is not meant to change between different pages? This old 2011 blog seems to indicate canonical should be entirely removed - https://developers.google.com/search/blog/2011/12/new-markup-for-multilingual-content#annotating-pages-as-substantially-similar-content