Every plugin step is registered as either synchronous or asynchronous, and this choice has real consequences for both user experience and what’s technically possible at that stage.
Synchronous
Runs immediately, inside the same transaction, blocking the user’s operation until it completes. Pre-validation and Pre-operation stages are always synchronous — there’s no async option for them, because they need to potentially affect the data before it saves. Post-operation can be either sync or async.
Asynchronous
Queued and processed shortly after the triggering transaction has already committed, by the Dataverse async service — the user doesn’t wait for it. Only available at Post-operation. Good for anything that doesn’t need to block the user: sending notifications, calling a slow external API, or doing non-critical follow-up processing.
Monitoring async plugins
Failed or stuck async plugin executions show up in the System Jobs area, which is the first place to check when “my async plugin doesn’t seem to be running” — it may be running and failing silently from the user’s perspective rather than not running at all.