The pattern in your opening, a low monthly number at signup and an invoice double the estimate three months later, almost always has the same cause: the estimate priced the server and not the system. Managed Postgres, backups, logs, email, a NAT gateway, egress and a second environment each look small alone, and together they are often larger than the compute.
The habit that has saved us the most is writing the estimate as a list of every service the app touches, with a monthly cost and an owner, before choosing the host. It turns "how much will hosting cost" into a bounded question with a clear answer, and it makes the comparison between providers honest because you are comparing the same list.
I agree with the earlier response about tagging by feature from day one. One more addition: set a billing alert at a level that would surprise you, not one that would ruin you. By the time the ruinous number arrives, the decision that caused it is weeks old and hard to trace.