Reliable, replayable and verifiable Salesforce events for applications and AI agents.
Behavior referenceStaging release
No matching documentationTry a status, HTTP code, Salesforce object, or security term.
01 / Foundations
Product contract
BeaconRelay is a one-way transport layer from Salesforce Streaming API PushTopics to one HTTPS webhook receiver per connected Salesforce organization. It receives an event, persists it before outbound delivery, retries transient failures locally, records every attempt, and provides cryptographic evidence that the delivered body matches the event BeaconRelay stored.
ReliablePersist before delivery and recover due work.
ReplayableResume Salesforce streams and redrive Dead Letters.
VerifiableHash bodies, sign envelopes, and issue receipts.
One-way by design
BeaconRelay does not write records back to Salesforce. High activity on one record is observed and warned about, but transport does not perform CRUD operations or suppress valid Salesforce events.
Resource hierarchy
AccountCommercial owner and event allowance
StationOne authorized Salesforce org
ChannelOne Salesforce PushTopic subscription
EventOne durable Salesforce notification
ReceiverThe station's HTTPS destination
A station is the boundary for Salesforce identity, channels, listener health, replay cursors, monitoring, receiver routing, and events. Events never exist independently of a station and owner.
Event path
1
Salesforce publishes
The active listener receives a PushTopic message from the station's authorized org.
2
BeaconRelay deduplicates
The tuple station, channel, and Salesforce replay ID is unique. A repeated replay message reuses the existing event.
3
BeaconRelay persists
The canonical JSON payload is encrypted with authenticated encryption, fingerprinted with SHA-256, assigned pending, and committed before webhook work is queued.
4
The delivery worker validates
Entitlement, destination safety, payload authentication, fingerprint, and signing configuration are checked before transmission.
5
The receiver is called
The original canonical JSON body is sent with verification and delivery-cycle headers. Redirects are not followed.
6
The outcome is recorded
Status, latency, safe response headers, an encrypted bounded response body, signature receipt, retry schedule, and incident effects are persisted.
Delivery semantics
Durability
Database persistence precedes outbound webhook delivery. A broker failure leaves the event due for the local recovery worker.
Ordering
Events retain Salesforce replay identity and receive time, but strict receiver-side ordering is not promised across retries or concurrent channels.
Duplicates
BeaconRelay suppresses duplicate Salesforce replay IDs, but network ambiguity can still produce receiver duplicates. Consumers should deduplicate with X-BeaconRelay-Event-Id.
Acceptance
Any HTTP status from 200 through 299 is accepted. A response body is not required.
Exactly once
Not claimed. No webhook transport can prove that a receiver committed work when its successful response is lost.
Trust boundaries
Salesforce authenticates the connected user and emits the source event. BeaconRelay controls persistence, scheduling, encryption at rest, signatures, and the outbound request. The customer controls the receiver. A BeaconRelay receipt proves what BeaconRelay observed; it is not a Salesforce signature and not proof that the receiver committed a database transaction.
02 / Configure
Salesforce OAuth setup
Each station uses a customer-managed Salesforce External Client App and OAuth authorization code flow with PKCE S256. This gives every Salesforce organization an independent authorization boundary instead of sharing one global Consumer Secret. BeaconRelay never requests or stores a Salesforce password or security token. The requested scopes are api and refresh_token.
Credential storageConsumer Key, Consumer Secret and OAuth tokens encrypted at rest per station.
Protect your Salesforce connection
BeaconRelay supports production, Developer Edition, and sandbox organizations. Before changing a production connection, rehearse the lifecycle with a sandbox and a non-production HTTPS receiver when one is available. Copy the callback URL exactly, including its spelling and protocol. Your Consumer Secret is encrypted after submission; never share it in tickets, screenshots, logs, or source control.
Before you begin
You can create or administer a Local External Client App in the Salesforce organization.
The Salesforce user can use the API and can read the objects and fields needed by the channels.
If the app uses admin-preapproved access, the test user has the required profile or permission set assignment.
You have a public HTTPS receiver ready before testing event delivery.
Customer setupCreate the Salesforce app when you are ready to connect
The separate walkthrough covers every Salesforce screen in English and French, required OAuth settings, credential retrieval, access policies, and troubleshooting.
After creating the External Client App or changing its OAuth policies, wait up to 30 minutes before connecting. An immediate invalid_client_id response usually means Salesforce does not recognize the newly created key yet.
Access tokens are refreshed using that station's encrypted credentials. Salesforce identity supplies the organization and user IDs, and one Salesforce organization can belong to only one BeaconRelay account at a time. Connecting the same org from another BeaconRelay account is rejected until its existing station is fully deleted.
Use Replace OAuth credentials in Salesforce Orgs to rotate a Consumer Key or Consumer Secret. The replacement is atomic: cancellation, an OAuth error, or authorization of the wrong Salesforce org leaves the current credentials active. Every station requires credentials from the customer's own Salesforce External Client App.
Station setup
1
Connect and verify the org
In BeaconRelay, go to Salesforce Orgs, choose Connect Salesforce, enter a clear station name, select Production/Developer or Sandbox, and paste the Consumer Key and Consumer Secret. Continue to Salesforce, authorize the intended user, then verify the organization and integration-user identity shown by BeaconRelay. If the popup is blocked, use the same-page authorization fallback.
2
Set the receiver
Provide one public HTTPS webhook for the station. BeaconRelay validates the URL now and again before each delivery.
3
Create a named channel
Give the channel a meaningful name, choose a supported object, select payload fields and operations, then add optional validated filters.
4
Review the generated topic
Confirm the object, selected fields, operations, and generated query before submitting the PushTopic to Salesforce.
5
Start the listener
Start performs an OAuth refresh and topic-validation preflight before it queues the listener. The station is marked active only after the start request is accepted.
6
Send one controlled event
Create or update a matching test record in Salesforce, then correlate it through Event Inbox, Delivery, and Operational Log using its EVT- identifier.
Channel rules
The channel builder produces a constrained SOQL query and creates a Salesforce PushTopic. The server validates every selection against live Salesforce describe metadata rather than trusting browser values.
Id is always selected and is required.
At most 50 payload fields can be selected.
At least one of create, update, delete, or undelete must be enabled.
Filters are joined with AND and values are type-checked and escaped.
LIKE is limited to string-like fields; range comparisons require ordered types.
Salesforce receives NotifyForFields: Referenced.
Generated query shapeSELECT Id, Name, Status__c FROM Order__c WHERE Status__c = 'Ready'
Objects and fields
Custom objects ending in __c are accepted when Salesforce marks them queryable and not deprecated. Standard objects are intentionally allow-listed:
Address, base64, complex, and location fields cannot be selected. Calculated fields and address, base64, complex, location, and textarea types cannot be used as filters. Salesforce metadata remains authoritative and can reject a definition that violates org-specific capabilities.
Receiver rules
Each station currently has one receiver. A destination must use HTTPS, include a resolvable public hostname, and resolve only to global addresses. Localhost, private, loopback, link-local, reserved networks, embedded credentials, and URL fragments are rejected.
Revalidated for every delivery
DNS and URL safety are checked again immediately before sending. BeaconRelay does not follow redirects. Connect timeout is 5 seconds and read timeout is 30 seconds.
Updating the receiver reroutes pending, retrying, budget-blocked, and future eligible attempts to the new URL and records the old and new routes. A request already in flight may complete against the URL it started with.
03 / Delivery
Event state machine
StateMeaningExit
PendingDurably stored and due for first delivery or a redrive cycle.Claimed by a worker.
DeliveringProtected by a 60-second worker lease while one attempt runs.Delivered, Retry, or Dead Letter.
RetryA transient failure was recorded and a future attempt is scheduled.Automatically reclaimed when due.
BlockedTrial expired, allowance exhausted, or account unavailable.Entitlement restoration resumes processing.
DisconnectedSalesforce OAuth was revoked; the encrypted event remains durable and no delivery is attempted.Successful OAuth reconnection returns it to Pending.
DeliveredThe receiver returned HTTP 2xx. This is terminal for that event.No automatic delivery.
Dead LetterA permanent response, safety failure, or exhausted retry cycle stopped delivery.Owner-authorized manual Redrive when eligible.
The recovery worker scans due pending, retry, and blocked_budget events and stale delivering leases. It excludes blocked_connection events. Database claims prevent concurrent delivery of the same event.
HTTP and network classification
AcceptedHTTP 200-299
Event becomes Delivered and one event is consumed from the allowance.
Retryable408, 425, 429, 500-599
Includes connection errors, DNS/request errors, and connect/read timeouts.
PermanentOther non-2xx responses
3xx and non-retryable 4xx responses move directly to Dead Letter.
HTTP 500 is retryable. HTTP 408 is retryable. HTTP 429 and 503 may influence timing through a valid Retry-After header.
Automatic retry policy
Each delivery cycle permits 12 attempts. The first attempt is immediate. After failed attempts 1 through 11, the standard base delays are:
Each base delay receives random jitter of ±20% to prevent synchronized retry storms.
For HTTP 429 or 503, a valid seconds or HTTP-date Retry-After is honored when longer than the jittered delay, capped at 24 hours.
The recovery scan runs frequently, but it never intentionally sends before next_attempt_at.
Attempt history is append-only. Global attempt numbers continue across manual redrive cycles.
An optional accelerated profile exists for controlled testing only; staging and production behavior default to the standard profile.
Dead Letter recovery
Manual Redrive appears only for a Dead Letter in the event's Delivery tab. The dialog shows both the event's previously assigned destination and the current receiver when they differ; the new cycle always resolves and validates the current receiver on the server. Pending, Delivering, Retry, and Blocked events remain automatic and cannot be manually redriven.
1
Eligibility is checked again on the server
The event must belong to the signed-in owner and still be a Dead Letter.
2
Safety and entitlement are checked
The current receiver must be valid public HTTPS and the account must allow delivery. Payload-integrity failures cannot be redriven.
3
A new cycle begins
The cycle number and redrive count increment; cycle attempts reset to zero while global attempts remain intact.
4
Automatic delivery resumes
The current receiver is used with a fresh 12-attempt cycle and the standard retry policy.
5
Forgotten reroutes remain repairable
The webhook editor reports active undelivered events still assigned to an older destination. Apply current destination updates those routes without changing the URL. The operation is idempotent, audited, and does not alter Delivered events or Dead Letters.
Duplicate processing is possible
If a previous receiver committed the request but its response was lost, a redrive can deliver the same event again. Use the stable event ID for receiver-side idempotency.
Redrive is CSRF-protected, owner-scoped, row-locked, audited, and rate-limited to five requests per event and request identity in ten minutes.
Receiver responses and attempts
Every actual request records target URL, cycle, global and cycle attempt numbers, outcome, HTTP status, error class, duration, response headers, and response body. Authorization, Proxy-Authorization, and Set-Cookie response headers are redacted. Response bodies are encrypted and limited to 64 KiB; larger bodies are marked truncated.
04 / Verification
Encryption at rest
Event payloads and receiver response bodies are stored as authenticated AES-256-GCM envelopes. Each value receives a random data-encryption key and nonce. The data key is itself wrapped by the configured master key with separate nonce and authenticated context bound to the event or attempt identity.
Stored plaintext
The active gateway path stores payload and response plaintext columns as null.
Authentication
GCM authentication and context binding detect ciphertext, nonce, key, or identity mismatch.
Dashboard reveal
Owner-only POST, CSRF token, separate reveal token, ten reveals per minute per session, integrity recheck, no-store response, and an audit event.
Key boundary
The application worker can decrypt to deliver. This is encryption at rest, not zero-knowledge or receiver-only end-to-end encryption.
Payload integrity proof
At ingestion, BeaconRelay computes SHA-256 over the exact canonical JSON body it stores and later sends. Before every attempt and every dashboard reveal, it decrypts the payload and recomputes that fingerprint. A mismatch opens a critical integrity incident, prevents delivery, and makes the event ineligible for Redrive.
On first delivery, BeaconRelay creates a deterministic envelope containing version, event ID, station ID, channel, replay ID, received timestamp, and payload SHA-256. The envelope is canonicalized and signed with Ed25519. The event signature and envelope are retained and reused for later attempts and redrive cycles.
Webhook verification headers
HeaderPurpose
X-BeaconRelay-Event-IdStable event identity for idempotency.
X-BeaconRelay-Delivery-CycleZero for the original cycle; increments on each manual Redrive.
X-BeaconRelay-Cycle-AttemptAttempt number inside the current cycle.
Each signed attempt can produce a downloadable receipt containing receipt and event IDs, event signature, payload and response hashes, target URL hash, outcome, HTTP status, timestamps, global attempt number, delivery cycle, and cycle attempt number. BeaconRelay signs the canonical receipt with Ed25519.
What a receipt proves
It proves that the holder of the BeaconRelay signing key attested to this event and observed delivery result. It does not prove Salesforce signed the payload, and it cannot prove the receiver persisted the business transaction.
05 / Operations
Listener lifecycle
Each running station has a generation token and one Redis-backed listener lease. A listener must own the current generation to process messages. Starting a newer generation supersedes old work. An intentional user stop invalidates health state and is never automatically reversed by the watchdog.
OAuth access is refreshed from the encrypted refresh token as needed. Successful Salesforce /meta/connect responses update the connection heartbeat; task liveness is tracked separately.
Every manual start first validates or refreshes OAuth and then checks the configured Salesforce topics. Invalid authorization requests reconnection; an unavailable Salesforce API or invalid topic prevents startup with a visible warning. These failures do not mark the station active and must not produce an internal-server-error page.
Organization lifecycle
ActionPreservedChanged
StopOAuth access, encrypted credentials, channels, receiver, events, replay cursors, and org ownership.The listener stops intentionally. The watchdog does not restart it.
StartExisting configuration and durable delivery state.OAuth is refreshed and topics are validated before a new listener generation is queued.
Replace credentialsThe active credentials remain usable until the replacement OAuth flow succeeds for the same org.On success, the new encrypted key, secret, and tokens replace the previous set atomically.
DisconnectOrg ownership, channels, receiver, encrypted event history, replay cursors, monitoring, and delivery history.The listener stops; remote revocation is attempted; all local OAuth tokens, app credentials, legacy credentials, and pending OAuth attempts are erased. Eligible undelivered events become blocked_connection.
ReconnectThe existing station, ownership, configuration, history, and replay position.Fresh customer credentials are required. Only the same Salesforce org is accepted; successful authorization returns connection-blocked events to Pending.
DeleteNothing belonging to the station.After exact-name confirmation, local station data is irreversibly deleted and org ownership is released. Salesforce cleanup and token revocation are attempted first.
Remote cleanup failure cannot block secure local erasure. BeaconRelay reports that warning because it cannot prove Salesforce-side PushTopic removal or token revocation after access has already failed. In that case, an administrator should inspect the External Client App OAuth usage and PushTopics in Salesforce.
Lifecycle test runbook
Run this sequence with a test Salesforce org. Record the station name, Salesforce org ID, receiver URL, channel count, and a known EVT- identifier before each destructive step so every state transition can be checked.
1
Establish the baseline
Connect the org, configure one receiver and one named channel, start the listener, generate a matching Salesforce event, and verify one accepted delivery in Event Inbox and Operational Log.
2
Test intentional Stop and Start
Stop the station and wait beyond the watchdog interval; it must remain stopped. Start it again. The start preflight must complete without deleting configuration or changing the replay position.
3
Test failed credential replacement
Open Replace OAuth credentials and cancel it, then repeat with an invalid credential or the wrong Salesforce org. The original station authorization must remain active and usable.
4
Test successful credential replacement
Authorize replacement credentials for the same Salesforce org. Start the station and send another event. Delivery should continue through the same station, channel, receiver, and event history.
5
Test Disconnect
Disconnect the org. Confirm the listener is stopped, reconnect requires a fresh Consumer Key and Consumer Secret, preserved channels and history remain visible, and eligible pending deliveries show a connection-blocked state.
6
Test ownership isolation
While disconnected, try connecting the same Salesforce org from a second BeaconRelay account. It must be rejected because Disconnect preserves ownership.
7
Test Reconnect
From the original account, enter fresh credentials and authorize the same org. A different org must be rejected. After the correct authorization, confirm blocked events return to Pending, start the listener, and deliver a new event.
8
Test Delete last
Stop the station, choose Delete, and enter the exact station name. Confirm its receiver, channels, events, attempts, replay data, monitoring, incidents, credentials, and encrypted payloads disappear. The same Salesforce org should then be connectable by another BeaconRelay account.
Pass criteria
No lifecycle failure exposes a Consumer Key, Consumer Secret, access token, refresh token, or decrypted payload.
Stop never becomes an automatic watchdog restart; Disconnect never silently behaves like Delete.
Cancelled and failed credential replacement never overwrite the working authorization.
Reconnect accepts only the station's original Salesforce org and resumes connection-blocked events.
Only full Delete releases the Salesforce org for another BeaconRelay account.
Event Inbox and Operational Log correlate test deliveries with the same EVT- identifier.
Evidence to retain
Keep timestamps and event identifiers, not secrets. Expected operational evidence includes successful listener starts, OAuth revocation or reauthorization, connection-blocked delivery transitions, resumed delivery, and any explicit remote-cleanup warning.
Replay and deduplication
Replay markers are persisted in the database and mirrored in Redis. On reconnect, the durable database marker is preferred and repopulates Redis. Without a marker, the subscription begins with new events. Salesforce ultimately controls how long replay IDs remain available.
The database uniqueness rule on station, channel, and replay ID is the authoritative ingestion deduplication barrier. A short-lived Redis delivered marker supplements listener behavior but is not the source of truth.
Watchdog recovery
Task heartbeatUnhealthy after 120 seconds by default.
Connection heartbeatUnhealthy after 180 seconds by default.
Startup grace180 seconds by default for owner/connect establishment.
Restart lockOne coordinated restart per station at a time.
The watchdog evaluates stations marked alive and not intentionally stopped. Healthy recovery resolves listener incidents. Unhealthy listeners are restarted locally through generation invalidation, task revocation, and a fresh listener task. Dashboard-initiated successful restarts are informational; watchdog restarts are warnings because they indicate detected service degradation.
Monitoring and incident lifecycle
Monitoring events are an append-only operational timeline. Incidents are the actionable state derived from those events: Active, Acknowledged, or Resolved. Acknowledgement records human awareness but does not resolve the condition.
ConditionIncident keyResolution signal
Delivery failure or Dead LetterPer eventSuccessful delivery_recovered.
Listener or watchdog healthPer stationHealthy task and Salesforce connection heartbeat.
Trial or entitlementPer station/accountSubscription restoration.
Possible event loopPer recordManual resolution after examining Salesforce automation.
Possible-loop warnings are observational: by default, ten events for one record and channel within 60 seconds produce one warning, with a five-minute warning cooldown. Events are not discarded.
Application security controls
Owner-scoped database queries protect stations, events, receipts, and payload reveal.
Mutating browser operations use POST and CSRF protection.
Secure, HttpOnly, SameSite=Lax session cookies use a sliding 45-minute idle lifetime.
Login, verification, resend, password reset, payload reveal, and Redrive paths are rate-limited.
Stripe webhook events are persisted and processed idempotently; email delivery has its own durable retry path.
Key management remains an infrastructure responsibility
Payload, token, session, Stripe, Brevo, Salesforce client, and Ed25519 private keys must remain outside source control, be access-controlled, backed up where appropriate, and rotated through tested procedures.
06 / Plans & limits
Plan allowances
Capability
Trial
Startup
Growth
Business
Enterprise
Price
Free
19 EUR / month
49 EUR / month
199 EUR / month
Custom
Access period
14 days
Monthly
Monthly
Monthly
Contracted
Unique events
2,500 total
10,000 / month
100,000 / month
1,000,000 / month
5M+ baseline
Salesforce stations
1
1
2
5
Contracted
Channels
1 total
2 total
6 total
15 total
Contracted
HTTPS destinations
1 / station
1 / station
1 / station
1 / station
Contracted
Payload retention
7 days
7 days
14 days
30 days
90+ days
Monitoring and replay
Included
Included
Included
Included
Included
Automatic retries
Included
Included
Included
Included
Included
Dead Letter redrive
Included
Included
Included
Included
Included
Encryption at rest
Included
Included
Included
Included
Included
Delivery signatures
Included
Included
Included
Included
Included
Support
Documentation
Standard email
Email
Priority email
Dedicated + SLA
Enterprise limits are contracted rather than advertised as unlimited. The baseline shown above starts at 5 million unique events per month and 90 days of payload retention.
Capabilities included on every plan
Durable ingestion
The encrypted event is committed before the first webhook request is queued.
Delivery recovery
Every plan receives the 12-attempt retry cycle, local due-work recovery, receiver rerouting, and manual Dead Letter redrive.
Operational evidence
Event states, attempts, receiver responses, incidents, route history, replay identity, hashes, signatures, and signed receipts remain available according to their applicable retention rules.
Security
Salesforce OAuth, HTTPS destination validation, encrypted payloads and responses, CSRF protection, owner scoping, rate limits, and audited payload reveal are not premium add-ons.
Event accounting
Only a newly persisted unique Salesforce event consumes allowance. Duplicate replay messages, retries, and manual redrives do not consume another unit.
Event accounting
A unique Salesforce event consumes one unit when its encrypted payload and identity become durable in BeaconRelay. The station, channel and Salesforce replay ID form the deduplication key, so replayed copies do not consume a second unit. Automatic attempts, retries and manual Dead Letter redrives are free. When allowance reaches zero, newly received events remain durable as Blocked and are reconsidered after entitlement restoration instead of being silently discarded.
Trial lifecycle
The Trial lasts 14 days from account creation and includes 2,500 unique events. Lifecycle enforcement stops active listeners, invalidates listener health state, marks the station entitlement-blocked, and moves pending or retrying events to Blocked. It emits a persisted trial-expired monitoring event and incident.
Monthly renewal
Stripe webhook events are persisted before lifecycle application. A new paid invoice replenishes the plan allowance once, identified by invoice ID, updates the billing period, clears entitlement blocks, and queues the subscription email. Duplicate delivery of the same Stripe event or invoice does not reset the allowance twice.
An account owner can schedule cancellation from Account and plans. BeaconRelay verifies that the Stripe subscription belongs to the signed-in customer and requests cancellation at period end, so paid limits remain active through the displayed date. Stripe's signed subscription update confirms the schedule. When Stripe sends the final subscription-deleted event, the paid allowance becomes unavailable and the existing lifecycle worker stops listeners and blocks pending delivery. Operational evidence remains subject to its normal retention policy.
One active Stripe subscription per account
Checkout is rejected while an account already has a Stripe subscription. Plan changes are not implemented as a second Checkout subscription.
Payload retention
Retention applies to encrypted event payloads and encrypted receiver response bodies. Cleanup erases content only after an event reaches Delivered or Dead Letter; pending, retrying and blocked events keep the payload required for delivery. Expiry does not remove the event identity, SHA-256 fingerprint, signature, signed receipts, attempt metadata, route history or incident history. An expired Dead Letter cannot be redriven because its body no longer exists.
Operational limits and guarantees
Webhook request
HTTPS only, 5-second connect timeout, 30-second read timeout, no redirects.
Response capture
64 KiB maximum, encrypted at rest, with credential and cookie headers redacted.
Delivery cycle
12 attempts, including the immediate attempt; Dead Letter afterward.
Redrive
Dead Letter only, five requests per ten minutes per event/request identity, current receiver, new cycle.
Payload reveal
Owner only, ten requests per minute per browser session, fully audited.
Batch recovery
Up to 50 due gateway events per recovery task invocation.
Delivery model
Durable and at-least-once under ambiguous network outcomes; receiver idempotency is required.