BeginPlay VS Constructor?

The order goes:

Constructor
PostInitializeProperties
BeginPlay

It’s safe to gameplay relevant code in BeginPlay. Constructor/PostInitializeProperties might be called when there is no world and are called on the default object. You definitely do not want to be spawning things that the CDO owns (Class Default Object), since the CDO exists outside of any world.

Generally, I use PostInitializeProperties for things that need extra fixup: calculations based off of defaults, range validation, etc.