Generally our webhooks are sent immediately upon payment receipt or ready_to_ship state change. Occasionally there can be network disruptions, etc. beyond our control, but by and large they are sent right away.
A ~30min delay will probably be typical latency between payment_received and ready_to_ship. Payment received means that we have seen the UNCONFIRMED transaction announced to the Bitcoin/crypto network. Transition into ready_to_ship means that the payment(s) on the invoice have been adequately confirmed in the blockchain.
The latency for confirming payments in blocks can vary significantly, but 30 minutes is very much within the norm.