Overview
Blockchains are probabilistic systems. A transaction may appear in a block and later be removed due to a chain reorganization (re-org). To handle this safely, Moralis Streams distinguishes between unconfirmed and confirmed events and delivers both to your backend. This page explains what confirmation and finality mean, and how they are exposed through Streams.What Is Confirmation?
When a transaction is included in a newly mined block, it is considered unconfirmed. At this stage:- The block may still be replaced
- Transactions may be reordered or dropped
- State changes are not final
What Is Finality?
A transaction becomes confirmed once enough blocks have been mined on top of it. At this point:- The risk of re-org is extremely low
- State can be safely persisted
- Balances and ownership can be finalized
Why Streams Sends Two Webhooks
Streams intentionally sends both states so you can:- React instantly (unconfirmed)
- Persist safely (confirmed)
- Poll block explorers
- Manually track confirmations
- Reconcile state after re-orgs
Ordering & Edge Cases
In rare cases:- A
confirmed: truewebhook may arrive beforeconfirmed: false
- Network latency
- Retry behavior
- Regional delivery differences
- Treat each webhook independently
- Use transaction hash + confirmation flag
- Be idempotent
Common Patterns
Real-time UX- Act on
confirmed: false - Update UI optimistically
- Only persist on
confirmed: true
- Use both, but deduplicate by transaction hash
Next Steps
- How re-orgs are handled internally → Explore Re-org Handling
- How delivery works end-to-end → Explore Webhook Delivery
- How to replay affected blocks → Explore Retries & Replays

