I think this occurs because the cloudflare app injects the Google analytics script in the <head>.
This works well if you’re on a regular website where new html pages - and new <head> elements - are loaded on navigation, but it does not work well with apps like Discourse.
Discourse as a Single Page Application only loads the <head> once and swaps the <body> content on subsequent navigation.
This results in Google Analytics thinking that only 1 page has been viewed and the behavior you described
Discourse has it’s own method of letting Google Analytics know that the page has changed on user navigation, and has it’s own Google analytics fields in the admin to ensure proper implementation.