event field at the top of your handler.
Whether theStacc sends
blog.published or blog.updated is decided by whether your receiver has published this blog before: the first successful publish fires blog.published; any subsequent re-publish or content sync of the same blog fires blog.updated. Treat both the same way — upsert on blog_id.
A note on preview- prefixed blog_ids: when the user clicks Sample Payload in the dashboard, theStacc fires a real-shaped blog.published event but with blog_id: "preview-00000000-0000-0000-0000-000000000000". Your handler should detect the prefix and skip the actual database write so test runs don’t pollute production data.
test.ping payload
200 {"ok": true}. Do not require title, slug, or content for this event — there are none.
blog.published / blog.updated payload
idempotency_key and publish_attempt. See Idempotency & retries for exactly when they appear and how to use them.
blog.unpublished / blog.deleted payload
blog_id (which you should have stored when handling the original blog.published) and delete or hide it.
Author changes
blog.published and blog.updated may include an optional author object with name and type (Person or Organization), or author: null to clear an override. Map it on every upsert, including author-only updates. If absent, preserve the existing author. See Blog author.