AutoBlocks keeps you informed through notification steps inside AutoBlocks, email alerts (via Resend), in-app inbox items, and the Activity dashboard at /activity.
API: apps/api/src/modules/notifications/routes.ts, apps/api/src/modules/executions/routes.ts. UI: apps/product-web/src/features/notifications/, apps/product-web/src/app/(dashboard)/activity/page.tsx.
Notification channels
| Channel | Trigger | Configure at |
|---|---|---|
| In-app inbox | Run events, failures | /settings — in-app toggle |
| Email on failure | Failed execution | /settings — default on |
| Email on complete | Successful run | /settings — default off |
| Notification step | AutoBlock step config | Wizard — per AutoBlock |
Production email sender: RESEND_FROM_EMAIL — AutoBlocks <notifications@autoblocks.pro> (render.yaml).
Settings preferences
| Preference | API field | Default |
|---|---|---|
| Email when run fails | emailOnFailure | true |
| Email when run completes | emailOnRoutineComplete | false |
| In-app notifications | inAppEnabled | true |
| Method | Path |
|---|---|
| GET | /tenants/:tenantId/notification-preferences |
| PATCH | /tenants/:tenantId/notification-preferences |
UI: apps/product-web/src/features/settings/settings-panel.tsx + InAppInbox component.
In-app inbox
flowchart TB
Run["Execution completes or fails"]
API["API writes in-app notification"]
Inbox["Settings — In-app inbox"]
You["You read + mark read"]
Run --> API --> Inbox --> You
| Method | Path | Purpose |
|---|---|---|
| GET | /tenants/:tenantId/notifications | List inbox items |
| PATCH | /tenants/:tenantId/notifications/:id/read | Mark as read |
Activity dashboard (/activity)
Every execution run appears in Activity with a status badge:
| Status | Meaning |
|---|---|
| pending | Queued — worker has not finished |
| running | In progress |
| succeeded | All steps completed |
| failed | Error — see plain-language explanation |
| Method | Path | Purpose |
|---|---|---|
| GET | /executions | List runs for your tenant |
| GET | /executions/:id/logs | Step-level logs for a run |
Activity use cases
| Goal | What to check |
|---|---|
| Verify schedule works | Filter recent runs — look for triggerKind: schedule |
| Debug webhook | Find run after POST — inspect input payload in logs |
| Confirm notification sent | succeeded run + notification step log |
| Understand failure | failed badge → open logs → read explanation |
flowchart LR
Trigger["Trigger fires"]
Run["Execution run"]
Steps["Steps execute"]
Activity["/activity"]
Notify["Email / in-app"]
Trigger --> Run --> Steps
Steps --> Activity
Steps --> Notify
Notification step (inside AutoBlock)
When you add a notification step in the wizard:
| Config area | Typical fields |
|---|---|
| Message | Title + body text |
| Channel | In-app, email, or both per step design |
Notification steps are actions, not account-wide preferences. Account preferences control automatic failure/completion emails.
Failure visibility
Phase 1 principle: trust over magic. Failed runs expose:
| Element | Location |
|---|---|
| Status badge | Activity list |
| Plain-language summary | Run detail |
| Step logs | GET /executions/:id/logs |
| Email alert | If emailOnFailure enabled |
Use Activity as the first stop when something "did not fire."