---
title: Email the client when their site is ready
description: Add a webhook so AnyPress calls your flow the moment a site is ready, and the welcome email sends itself.
url: "https://shop.anypress.io/docs/email-the-client-when-their-site-is-ready/"
updated: "2026-10-24"
category: Automation
---

# Email the client when their site is ready

A site takes a few minutes to build. Instead of checking, add a webhook, and AnyPress calls your flow the moment the site is ready.

## Steps

1. Make a new flow that starts with a webhook: an n8n **Webhook** node, a Make **Custom webhook**, or **Catch Hook** in Zapier. Copy its address.
2. At [app.anypress.io](https://app.anypress.io), open **Webhooks**, add that address and tick `tenant.ready`. Keep the signing secret it shows you. It's shown only once.
3. In the flow, look the site up again with `GET https://api.anypress.io/v1/tenants?externalId=…` and carry on only when `statusCode` is `1`. That way the flow trusts AnyPress, not whatever reached the address.
4. Email the client their address (`domainName`) and a link to choose a password: `https://<domainName>/wp-login.php?action=lostpassword`. Then update your CRM and tell your team.

## What your webhook receives

```
{
  "type": "tenant.ready",
  "timestamp": "2026-10-24T16:05:12Z",
  "data": {
    "tenant": {
      "externalId": "crm-contact-482",
      "name": "Hill Street Dental",
      "domainName": "hill-street-dental.anypress.site",
      "statusCode": 1,
      "statusName": "Done",
      "size": "small"
    }
  }
}
```

## Other events

| Event | When it's sent |
| --- | --- |
| `tenant.ready` | A new site is built and answering |
| `tenant.failed` | A change still failed after its retries. We're told too |
| `tenant.domains_changed` | The client's own domain is connected |
| `tenant.suspended`, `tenant.resumed` | Taken offline, or back online |
| `tenant.deleted`, `tenant.restored` | Gone, or back from its backup |
| `tenant.backup_completed` | A backup finished, nightly ones included |

## Delivery

- Any 2xx answer within 10 seconds counts as delivered. Failed deliveries are tried 10 more times over about seven hours, and you can send one again from the Webhooks page.
- An event can arrive more than once. Use the `webhook-id` header to skip repeats.
- Every request is signed the [Standard Webhooks](https://www.standardwebhooks.com) way, so a code step can check the `webhook-signature` header with your signing secret.
