Status pages

Custom domain for a status page

Publish a site or app status page on a hostname you control, such as status.client.com. The existing /status/<token> URL on RetainerProof keeps working.

DNS

  1. In the app, turn the public status page on, then add the hostname.
  2. Create a CNAME from that hostname to custom.retainerproof.com. Override the target with STATUS_CNAME_TARGET if this deploy uses a different name. The target must be a name that already points at the Coolify proxy (an A/AAAA record, or a name Coolify already routes). Do not CNAME to the apex retainerproof.com.
  3. Create a TXT record at _retainerproof-challenge.<hostname>. The value is the token shown next to the domain. Click Verify. An unverified hostname is reserved for 72 hours, then another account can claim it. A verified hostname stays with the account that verified it.

Verification is a DNS TXT lookup from the app. It does not require a certificate yet.

What still has to happen in Coolify

The Node app routes a request when the Host header matches a verified hostname. It does not issue TLS certificates. Coolify's Traefik only obtains a Let's Encrypt certificate for hostnames attached to the service.

  1. Make sure custom.retainerproof.com is a domain on the RetainerProof service (or a DNS record that lands on the same proxy).
  2. After the customer CNAME exists, add their hostname as another domain on that same service so Traefik can complete HTTP-01. Until you do, https://status.client.com will fail TLS even though the app would serve the page.
  3. Leave the container on port 80 behind the proxy. Do not put customer certificates in the image.

There is no Cloudflare for SaaS setup in this deploy, and Traefik is not configured for on-demand certificates for arbitrary names. Adding the hostname in Coolify is the remaining step for each verified domain.

Local check

On a non-production server, a hostname that ends in .test or .localhost verifies without DNS. Point it at 127.0.0.1 in /etc/hosts, then open http://status.client.test:3000/ (use the port in APP_URL). The same host on https://retainerproof.com/status/<token> still loads.

Apps

An app groups up to three services on one status page. Studio includes one app pack. Agency includes three. An extra pack is $5/month once STRIPE_PRICE_ID_APP_PACK is set to a real Stripe price. The app does not run a care digest, and it does not consume a site slot.