Client sites that build themselves.
Nobody on your team should be building websites by hand. An order, a form or a step in your CRM creates the client's site, and tells you when it's ready.
Pick how sites get made.
Most sellers use the first one and never think about it again. The others are for orders and clients that start somewhere else.
Your shop does it
Someone pays on your storefront and their site is built. When they cancel, it's backed up and taken offline. Nothing to connect.
Every seller, from day oneNo-code tools
A form, a signed proposal or a payment somewhere else starts a flow in n8n, Make or Zapier, and the flow creates the site.
Teams without a developerTold when it's ready
We call your flow the moment a site is ready, so the welcome email, the CRM update and the team message go out by themselves.
Anyone who onboards clientsYour own code
Create, change and remove sites from your own app with the API and SDKs. Resellers get one partner key for every storefront.
Developers and software teams
Your storefront already does it.
Every approved seller gets a storefront. Make a product for each kind of site you sell, and every paid order turns into a site with nobody pressing a button.
Order paid, site built
- Add a subscription product in your storefront, with its price.
- Turn on the website integration for it and pick the kind of site, the starting site and the size.
- That's it. A paid order builds the site and emails your client a link to sign in.
When a subscription is cancelled or runs out, the site is backed up and taken offline, then deleted after your grace period. If they pay again first, it comes back.
Your client pays
On your shop, at your price.
The site is built
From your starting site, in minutes.
They're emailed
With a one-click way in.
A web studio with dozens of clients.
The studio is a reseller with a few brands. Its owner never signs in to anything. One person on the team set this up once, in an afternoon, and now every new client gets a site without anyone touching WordPress.
1. A new client says yesthe trigger
They fill in the studio's intake form, or the deal is marked won in the CRM. That's the only thing a person does.
2. The flow asks AnyPress for a siteseconds
One step in n8n sends the client's business name and email, the studio's starting site and the size. The order number goes with it, so a retry can never make a second site.
3. AnyPress builds itminutes
Its own WordPress and database, copied from the studio's starting site, with the client's login made for them.
4. Everyone hears about itwhen it's ready
A signed message reaches the flow. It emails the client their address and login link, adds the site to the CRM and posts in the team chat.
5. The bill takes care of itselfon the 1st
Every live site, across all the studio's brands, is on one wholesale bill. Nobody counts sites by hand.
Made-up studio, real steps. The person who set it up still sees every site, its backups and its jobs at app.anypress.io.
Copy these flows.
Each one is a trigger and one call to AnyPress. They use n8n, Make and Zapier, but any tool that can send a web request works the same way. Full step-by-step guides are in the docs.
Intake form, new site
A client fills in your intake form, on your website or in n8n itself.
- Start the flow with an n8n Form Trigger, or a Webhook node your form posts to.
- Add an HTTP Request node: POST to
https://api.anypress.io/v1/tenants. - Authentication: Generic credential, Basic Auth. Your API key is the user and its secret the password.
- Send the JSON body shown here, filled from the form's answers.
Using Fluent Forms Pro on your own WordPress? Its Webhook feed can post each entry straight to the n8n Webhook node.
{
"name": "{{ $json.business }}",
"externalId": "form-{{ $execution.id }}",
"wordPressUserName": "{{ $json.email }}",
"wordPressUserEmail": "{{ $json.email }}",
"wordPressUserRole": "administrator",
"size": "small"
}
// The answer comes back at once, before the site is built:
// { "id": "…", "externalId": "form-…",
// "baseDomain": "kettle-and-crumb.anypress.site" }Paid somewhere else, site built
The client pays through Stripe, an invoice tool or a booking app instead of your storefront.
- Trigger: the new payment, or the invoice marked paid, in your payment app.
- Action: Webhooks by Zapier, Custom Request. Method POST, address
https://api.anypress.io/v1/tenants. - Basic Auth: your key and secret with a bar between them,
key|secret. - Header
Content-Type: application/json, and the body shown here, with the payment's id as the externalId.
Using the payment's own id means a Zap that runs twice still makes one site. Ids may only have letters, numbers and dashes, so swap any underscore for a dash.
{
"name": "Rose and Fern",
"externalId": "pay-3QxK81Lm",
"wordPressUserName": "owner",
"wordPressUserEmail": "owner@roseandfern.example",
"wordPressUserRole": "administrator",
"size": "medium"
}Deal won, site built
Your CRM already knows when a client signs. Let that step make the site.
- In Make, start a scenario with a Custom webhook and copy its address.
- In your CRM, send to that address when the deal is won. In FluentCRM Pro, that's an automation with the Outgoing Webhook action, run when a tag like "Signed" is added.
- Add Make's HTTP module with Basic auth (your key and secret), POST to
https://api.anypress.io/v1/tenants, with the contact's details as the body. - Use the contact's id as the externalId, so one client is always one site.
# Try it before you build the flow
curl -u "$KEY:$SECRET" \
-H 'Content-Type: application/json' \
-d '{"name":"Hill Street Dental",
"externalId":"crm-contact-482",
"wordPressUserName":"office",
"wordPressUserEmail":"office@hillst.example",
"wordPressUserRole":"administrator"}' \
https://api.anypress.io/v1/tenantsClient leaves, site goes offline
When billing happens outside your storefront, end the site from the same flow that ends the subscription.
- Trigger: the subscription is cancelled in your payment or CRM tool.
- POST to
/v1/tenants/suspend?externalId=…with the same externalId you created it with. A backup is taken first. - If they come back, POST to
/v1/tenants/resume?externalId=…and it's online again, exactly as it was.
curl -u "$KEY:$SECRET" -X POST \
"https://api.anypress.io/v1/tenants/suspend?externalId=pay-3QxK81Lm"
curl -u "$KEY:$SECRET" -X POST \
"https://api.anypress.io/v1/tenants/resume?externalId=pay-3QxK81Lm"Let the welcome email send itself.
A site takes a few minutes to build. Instead of checking, add a webhook and AnyPress calls your flow the moment it's ready.
Site ready, client told
- Make a new flow that starts with a webhook (n8n Webhook node, Make Custom webhook, or Catch Hook in Zapier). Copy its address.
- At app.anypress.io, open Webhooks, add that address and tick
tenant.ready. Keep the signing secret it shows you. - In the flow, look the site up again with GET
/v1/tenants?externalId=…and carry on only whenstatusCodeis 1. That way the flow trusts AnyPress, not whatever reached the address. - Email the client their address,
domainName, and a link tohttps://<domainName>/wp-login.php?action=lostpasswordto choose a password. Then update the CRM and tell the team.
Every request is signed the Standard Webhooks way, so a code step can check the webhook-signature header too. Each event can arrive more than once: use webhook-id to skip repeats.
{
"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"
}
}
}| Event | When it's sent |
|---|---|
tenant.ready | A new site is built and answering. Send the welcome email. |
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. |
One key per storefront, or one for all of them.
Every call signs in with a key and its secret, the same way in every tool.
| API key | Partner key | |
|---|---|---|
| Who has it | Every seller and reseller storefront | Resellers, for the whole account |
| Where you get it | API keys, at app.anypress.io | From us, when you ask |
| Works on | That one storefront's sites | Every storefront in the account |
| Each call says | Nothing extra | Which storefront, with ?productId= |
| Can also | Manage sites, domains, webhooks | Add storefronts, share starting sites, read usage |
Keys can be replaced with a grace period, so a flow keeps working while you paste in the new one. A wrong key or secret is answered with 403.
What a new site can be told.
| name | The site's name. Its free address is made from it, for example rose-and-fern.anypress.site. |
|---|---|
| externalId | Your own id for it: the order, deal or form entry number. Letters, numbers and dashes only. Sending the same create again answers with the site already made, so retries are safe. |
| wordPressUserName, wordPressUserEmail | The client's WordPress login. Send both or neither. |
| wordPressUserRole | Their WordPress role, usually administrator. |
| groupName | Which of your starting sites to copy, by its group name. Leave it out to use your current one. |
| size | small, medium or large. Small if you leave it out. |
| customDomainName | The client's own domain, if they already have one. You can add it later instead. |
| productId | Partner keys only: which storefront the site belongs to. Sent in the address, not the body. |
Every call, with examples, is in the API reference. The code behind it is open source.
Automation questions
Do I need a developer?
Where do I get an API key?
What if the flow runs twice?
How does the client get into their new site?
Can it put the client's own words and logo in too?
Do my clients see AnyPress?
Stop building sites by hand.
Apply to sell, and your storefront creates sites from the first order. Need a partner key or help with a flow? Email support@anypress.io.