# 5. Wait, async, and completed hooks

Timestamping is not always instant. Middleware publishes `verae.zapier.jobs.watch`; a poller waits on the chain; then `verae.zapier.jobs.events` fires. Zapier never sees those subjects.

## Choose a pattern

| Pattern | Use when |
|---------|----------|
| **Wait** | The next Zap step needs the certificate now (Slack message, PDF receipt). |
| **Async + Find Job Status** | You stored `jobId` and will poll later. |
| **Timestamp Completed trigger** | You want a second Zap to run when the seal exists (REST Hook). |

If **Wait** returns `status: pending`, the chain or NATS event did not finish inside `WAIT_TIMEOUT_MS`. Pair async creates with the **Timestamp Completed** trigger instead of raising the timeout blindly.

## Trigger setup

1. New Zap → Verae Time → **Timestamp Completed**.
2. Zapier registers a REST Hook URL with middleware (`/zapier/v1/webhooks/subscribe`).
3. When `jobs.events` says `timestamp.completed`, middleware HTTPS POSTs that URL.
4. Turning the Zap off unsubscribes the hook.

The hook payload is the same completed-job JSON as wait (seal receipt, optional attached metadata).
