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:
- Run
dig CNAME yourdomain.comfrom a terminal (or use a DNS lookup tool). The result should match what the dashboard told you to set. - 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.
- 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.
- 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 forletsencrypt.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-contentwith yoursiteId. - "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, not0600000000). - 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 — seesupabase/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
sendBeaconto 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 flagged
is_preview = true. If you're seeing it on a real tenant, that flag is set incorrectly. Checkuser_sitesdirectly. - Default brand name still showing — the wizard sets
brand_namefrom 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.