Platform Events are the Salesforce Pub/Sub mechanism. You define an event type as metadata (with __e suffix), publish events from Apex/Flow, and consume them from Apex triggers, Flows, or external clients.
Define the event (one-time setup): Setup -> Platform Events -> New. Add fields like Order_Id__c, Status__c, Timestamp__c. The event becomes Order_Created__e.
Publish from Apex:
`apex Order_Created__e evt = new Order_Created__e( Order_Id__c = '001xxx', Status__c = 'Pending', Timestamp__c = DateTime.now() );
Database.SaveResult sr = EventBus.publish(evt); if (!sr.isSuccess()) { for (Database.Error err : sr.getErrors()) { System.debug(err.getMessage()); } } `
Consume via Trigger (triggers are the most common subscriber):
apex trigger OrderCreatedTrigger on Order_Created__e (after insert) { for (Order_Created__e evt : Trigger.new) { // process } }
External subscribers: connect to the Pub/Sub API (or older Streaming API/CometD) to receive events in near-real-time.
Key behaviour:
- Asynchronous —
EventBus.publishqueues the event; subscribers run separately. - At-least-once delivery — events may be delivered more than once; subscribers must be idempotent.
- 72-hour retention — events available to subscribers for 72 hours via replay.
- Publishing in a transaction — by default, publish happens on commit-2 (after success). For "fire and forget regardless of outcome", use
publishImmediateDMLoperation type when defining the event.
Use cases:
- System-to-system signalling — "OrderApproved" event triggers downstream fulfilment.
- Decoupled architecture — module A publishes, modules B and C consume independently.
- Bridging Salesforce to external — external middleware subscribes via Pub/Sub API.
Limits: rate limits per org per hour; event size cap per event.
