The second signal is that you are paying for a tier you crossed rather than chose. Growth pushes businesses into higher pricing bands quietly, and the moment to reconsider is when the price becomes noticeable rather than after another year of it. At that point the comparison is not against the entry price you remember but against what you are currently spending, which frequently changes the answer.
The third is that somebody else now needs to use it. Tools designed for a single operator often lack permissions, audit trails, or a concept of more than one user, and the first hire is where that becomes apparent. Sharing a login is the workaround, and it is the one that creates a security problem rather than merely an inconvenience.
Be careful to distinguish outgrowing a tool from never having learned it. A substantial share of frustration comes from using a capable product at a fraction of its capability, and switching resets that learning rather than solving anything. Before evaluating alternatives, spend an hour with the documentation for the specific thing that is annoying you, because the feature frequently exists.
When you do decide to move, check the exit before the entrance. Whether you can export your data in a usable format, what will not come across, and what the migration will actually involve. A tool you cannot leave cleanly is one where outgrowing it becomes considerably more expensive than the comparison suggested.
Then move once rather than gradually. Running two systems in parallel because the migration was incomplete is worse than either, and it is the usual outcome of a switch begun without deciding in advance what happens to the historical data.
Consider whether the tool is the problem before assuming it is. Frequently the frustration comes from a process built around the tool rather than from the tool itself, and changing software carries that process across unchanged. Describing what you are actually trying to accomplish, rather than what the current tool makes difficult, sometimes reveals that the workflow was the constraint and the replacement would have inherited it.