Troubleshooting

The issues that actually show up in support, and what to check before opening a ticket.

Custom domain isn't verifying

Most cases are DNS propagation. Things to check, in order:

  1. Run dig CNAME yourdomain.com from a terminal (or use a DNS lookup tool). The result should match what the dashboard told you to set.
  2. If your DNS provider has aggressive caching, propagation can take 4–24 hours. Cloudflare and Route53 are usually under an hour. GoDaddy can take 24 hours.
  3. If your domain is on Cloudflare with the orange cloud (proxy) enabled, switch it to gray cloud (DNS only) — Cloudflare's proxying conflicts with Sitify's automatic TLS provisioning.
  4. Check that your domain doesn't have a CAA record blocking Let's Encrypt. dig CAA yourdomain.com; if there's a CAA for a different CA, add one for letsencrypt.org.

AI imagery hasn't generated

Per-tenant images generate lazily on first visit to the home page. Symptoms and fixes:

  • Still showing fallback library imagery 5+ minutes after first visit: the lazy trigger may have failed. Trigger manually from the dashboard's content settings or post to /api/admin/generate-tenant-content with your siteId.
  • "CLOUDFLARE_ACCOUNT_ID and/or CLOUDFLARE_API_TOKEN not set" error: the Sitify tenant project doesn't have Cloudflare credentials. Contact support — this is a platform-side issue, not your tenant.
  • Some images generated, others failed: Cloudflare Workers AI has occasional transient failures. Re-run the generator; failed prompts retry automatically.

WhatsApp button doesn't open WhatsApp

  • Check the WhatsApp number includes the country code (e.g., +212600000000, not 0600000000).
  • Test on a phone with WhatsApp installed. Desktop browsers without WhatsApp Web logged in will show a generic "open in WhatsApp Web" page — this is expected.
  • If the message template is empty, the link still works but customers see a blank message. Set per-language templates in your contact settings.

Pricing page shows €0 or wrong currency

  • Verify your pricing matrix has values for the customer's selected currency. If a customer switches to MAD and you only set EUR values, MAD shows €0.
  • Cleared cache after a pricing edit but still seeing old prices? The render layer is dynamic — there's no CDN cache to bust. Hard-refresh the browser. If it persists, check Supabase to confirm the row actually saved.

Analytics shows zero events

  • Your tenant uses tenant_analytics_events (Sitify multi-tenant). Verify migration 0045 has been applied to your Supabase project — see supabase/migrations/.
  • The tracker fires from /tenant-render/... routes via a client component. Bot traffic from headless crawlers is filtered out — if you're testing with Lighthouse, the views won't count.
  • Browser ad-blockers occasionally block sendBeacon to first-party endpoints; events still get through via the fetch fallback.

Site looks unbranded ("Sitify" appears on my live site)

Two places where Sitify branding might leak:

  • The preview banner — only renders on tenants flaggedis_preview = true. If you're seeing it on a real tenant, that flag is set incorrectly. Check user_sites directly.
  • Default brand name still showing — the wizard setsbrand_name from your input. If empty, the template falls back to a placeholder. Re-run the wizard or edit the field directly.

Wizard generation fails with "site_limit_reached"

Free tier allows 1 site. Paid tiers allow 3, 10, or unlimited. If you hit the limit:

  • Archive an unused site (changes status to "archived" without deleting data)
  • Upgrade your plan
  • Pay for an extra site (paid tiers only)

Payments aren't routing through

At the current phase, payment-link mode requires you to paste your own Stripe / PayPal / Coinbase Commerce links per plan. Gateway mode (full Stripe Connect checkout) is wired in Phase E and isn't live yet — picking it on the wizard saves the choice but customer clicks fall back to a placeholder route.

Still stuck?

Check the status page for ongoing platform incidents. Otherwise contact support — include your subdomain and a screenshot of what you're seeing.