# PageFork — full knowledge corpus This file concatenates every PageFork documentation page, blog post, and case study into a single plaintext document for language model ingestion. Canonical URLs are provided for each section. For the structured sitemap of the site, see https://pagefork.ai/llms.txt. Last generated: 2026-05-26T13:12:12.598Z --- ## Documentation # Analytics and tracking Source: https://pagefork.ai/docs/analytics-and-tracking/ Description: Add GA4, Plausible, Meta Pixel, and other analytics or conversion-tracking tools to your PageFork site. Group: Integrations PageFork supports any analytics or tracking script that works via client-side JavaScript — which is basically all of them. Below are the most common ones with ready-to-paste prompts. > Before you add tracking, consider whether you need a cookie-consent > banner. Most analytics beyond the privacy-first options (Plausible, > Fathom, Simple Analytics) require consent in the EU/UK. See > [Cookie consent and privacy](/docs/cookie-consent-and-privacy/). ## Google Analytics 4 (GA4) The most common setup. Get your **Measurement ID** from GA4 → Admin → Data Streams (format: `G-XXXXXXXXXX`). ``` Add Google Analytics 4 to the whole site. Measurement ID: G-ABC12345. ``` Verify in GA4 → **Realtime** report after publishing. ## Plausible Privacy-focused, no cookies, no consent banner required in most cases. ``` Add this to the of every page: ``` Verify in your Plausible dashboard within a minute or two of the first visit. ## Fathom Same category as Plausible — lightweight, cookieless. ``` Add Fathom Analytics to every page. Site ID: ABCDEFGH. ``` Or paste the snippet Fathom gives you: ``` ``` ## Simple Analytics ``` Add Simple Analytics to every page: ``` ## Microsoft Clarity Free heatmaps and session recordings. ``` Add Microsoft Clarity to the whole site. Project ID: abc123def. ``` Verify in the Clarity dashboard's **Live** section. ## PostHog Product analytics with session replay and feature flags. ``` Add PostHog to every page. API key: phc_abc123. Host: https://us.i.posthog.com. ``` ## Google Tag Manager (GTM) The "umbrella" option — load GTM once, then manage all your pixels from its UI without touching the site again. ``` Add Google Tag Manager to the whole site. Container ID: GTM-ABC1234. ``` GTM inserts two snippets (one in ``, one right after `` opens). The AI handles both. ## Meta (Facebook) Pixel For Facebook / Instagram ad conversion tracking. ``` Add the Meta Pixel to every page. Pixel ID: 1234567890123456. ``` Verify with the **Meta Pixel Helper** Chrome extension on the published site. ## LinkedIn Insight Tag ``` Add the LinkedIn Insight Tag to every page. Partner ID: 1234567. ``` ## TikTok Pixel ``` Add the TikTok Pixel to every page. Pixel ID: ABCDEFGHIJ. ``` ## Google Ads Conversion Tracking Paste the exact snippet from Google Ads → **Tools** → **Conversions** → your conversion → **Tag setup** → **Install the tag yourself**. ``` Add this Google Ads conversion tag to the thank-you page only: ``` Scope it to the thank-you page so the conversion only fires after a form submission. ## Segment Customer-data platform that fans events out to many downstream tools. ``` Add Segment to every page. Write key: abc123def456. ``` ## X (Twitter) Conversion Tracking ``` Add the X Pixel to every page. Pixel ID: abc12. ``` ## Reddit Pixel ``` Add the Reddit Pixel to every page. Pixel ID: t2_abcde. ``` ## Hotjar ``` Add Hotjar to the whole site. Site ID: 1234567. ``` ## Multiple trackers at once Totally fine — they don't conflict. If you're stacking several, use **Google Tag Manager** as the single container and configure individual tags inside GTM's UI. That way you only touch PageFork once. ## Firing events on specific actions For a form-submission or button-click event, ask the AI to wire it: ``` Fire a GA4 event called "signup" when the newsletter form is submitted. ``` ``` Fire the Meta Pixel "Lead" event when the "Book a call" button is clicked. ``` The AI will add the right event snippet at the right DOM hook. ## Troubleshooting - **No data in the dashboard** — confirm the site is **published** (not just saved), and you're visiting the live URL, not the editor preview. - **Script loads but no events** — check browser devtools → Network tab for calls to the vendor's endpoint. Most vendors also have a "diagnose" tool (Meta Pixel Helper, GA4 DebugView). - **Consent banner blocks everything** — if you've added a cookie banner, it may be gating scripts. Make sure analytics is allowed in the category the visitor accepted. ## Next - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) - [Integrations overview](/docs/integrations-overview/) - [Chat and support widgets](/docs/chat-and-support-widgets/) --- # Apex vs www Source: https://pagefork.ai/docs/apex-vs-www/ Description: Which domain should you connect — yourbrand.com or www.yourbrand.com? Group: Domains `yourbrand.com` and `www.yourbrand.com` are technically different domains, set up differently in DNS. When you connect a custom domain you pick which one is the primary — and whether the other should also reach your site. ## The short answer **Use both.** Connect `www.yourbrand.com` and choose **Include apex** so `yourbrand.com` redirects to `www`. Whichever one a visitor types, they end up on your site. ## Why it matters - **Apex** is the root domain: `yourbrand.com`. In standard DNS, an apex can't be a CNAME — it has to be an A record (or a provider-specific **ALIAS** / **CNAME flattening** record). - **Subdomain** (including `www`) is anything in front: `www.yourbrand.com`, `launch.yourbrand.com`. Subdomains can be CNAMEs freely. PageFork's edge accepts traffic via a CNAME to `sites.pagefork.ai`. An apex without CNAME flattening can't do that — so when your registrar doesn't support flattening, PageFork uses a small **redirect service** at the apex to bridge the gap. ## The three scenarios ### 1. Subdomain only (e.g. `launch.yourbrand.com`) One CNAME to `sites.pagefork.ai` at the subdomain. See [DNS records reference](/docs/dns-records-reference/) → Case A. ### 2. www + apex, and your DNS provider supports ALIAS / flattening Providers like **Cloudflare**, **DNSimple**, **Netlify DNS**, **Route 53**, and a few registrars. One record at the apex (ALIAS or flattened CNAME) is enough. See [DNS records reference](/docs/dns-records-reference/) → Case C. ### 3. www + apex, and your DNS provider doesn't support flattening / ALIAS Most traditional registrars (GoDaddy, Namecheap, most others). You'll add **two** records: - A **CNAME on `www`** → `sites.pagefork.ai`. This is where your site is actually served. - An **A record on the apex** → PageFork's redirect-service IP (shown in-app). This IP runs a tiny HTTP service that **301**-redirects every request from `yourbrand.com` to `www.yourbrand.com`. Visitors who type the apex hit the redirect service and are bounced to `www`, where your site lives. See [DNS records reference](/docs/dns-records-reference/) → Case D. ## There is no "A record direct to PageFork" If you've set up other hosts before, you might expect to point the apex at a PageFork edge IP via an A record. PageFork **doesn't** support that. The only valid A record is for the redirect service, and it's **only** valid alongside a CNAME on `www` pointing at `sites.pagefork.ai`. If you put an A record at the apex without a matching `www` CNAME, verification will fail. ## Apex-only, no www You can have a site reachable only at the apex (`yourbrand.com`, no `www`) — but it **requires** ALIAS / CNAME flattening support at your registrar. Without that, you can't have apex-only on PageFork; use the `www` + redirect pattern from scenario 3 instead. ## Which should I pick? - Both `www` and apex, registrar supports flattening → one ALIAS/CNAME at apex. - Both `www` and apex, registrar doesn't support flattening → CNAME on `www` + A record at apex (redirect service). - Only `www.yourbrand.com` → one CNAME on `www`; say **No, www only** when PageFork asks about apex. - Only a sub-brand subdomain (like `launch.yourbrand.com`) → one CNAME at that subdomain; nothing at the apex is touched. ## Next - [Connecting your domain](/docs/connecting-your-domain/) - [DNS records reference](/docs/dns-records-reference/) - [Cloudflare and proxies](/docs/cloudflare-and-proxies/) --- # Changing or removing a domain Source: https://pagefork.ai/docs/changing-or-removing-a-domain/ Description: Refresh, re-add, switch, or fully disconnect a custom domain. Group: Domains Domains aren't forever. Campaigns end, brands rename, and sometimes a domain needs to move between PageFork sites. Here's how to handle each scenario without downtime. ## Refresh a domain's status If DNS has changed or you've just added records, force a recheck: 1. In the editor, click **Domain** in the toolbar. 2. Find the domain in the list. 3. Click **Refresh status**. Refresh is safe to click repeatedly — it just polls DNS and, if DNS looks right, attempts SSL issuance again. ## Remove a domain from a site 1. Open **Domain** settings on the site. 2. Find the domain. 3. Click **Remove**. This detaches the domain from this PageFork site. Your DNS records still exist at your registrar — update or delete them separately if you no longer want them pointing at PageFork. > Note: removing a domain **does not** unpublish the site. The site > remains live on your subdomain and any other custom domains. ## Move a domain to a different site Because any given hostname can only be connected to **one** PageFork site at a time, moving a domain is a two-step process: 1. On the **current** site, open Domain settings and **Remove** the domain. 2. On the **new** site, open Domain settings and **Add** the domain. Because DNS doesn't change, propagation is immediate — the new site picks it up as soon as validation completes. > If you forget step 1, you'll see "Domain already connected" when you > try to add it on the new site. ## Change from www to apex (or vice versa) The cleanest way: remove the current domain in PageFork, then add the new one. DNS needs to match what PageFork shows for the new setup — update your records at your registrar before or just after adding. ## Disconnect everything (unpublishing with domain cleanup) If you're taking a site down entirely and don't want any of its custom domains pointing at PageFork: 1. Click **Unpublish** in the editor toolbar. 2. In the confirmation dialog, check **Remove custom domains**. 3. Confirm. All custom domains for this site are removed in one go. Then clean up the DNS records at your registrar. ## Next - [Connecting your domain](/docs/connecting-your-domain/) - [Unpublishing](/docs/unpublishing/) - [Domain not verifying](/docs/domain-not-verifying/) --- # Chat and support widgets Source: https://pagefork.ai/docs/chat-and-support-widgets/ Description: Add live chat, support inboxes, and feedback widgets from Intercom, Crisp, Tawk, and others. Group: Integrations Every mainstream chat / support tool ships a **single JavaScript snippet** you drop into your site. Paste it into PageFork and the AI places it at the end of `` where chat widgets normally live. > Chat widgets make sites heavier and trigger cookie-consent rules in > most regions. Only add one if you'll actually answer messages. ## The universal pattern Copy the vendor's snippet and paste: ``` Add this chat widget to every page: ``` Or, for the popular ones, just ask by name: ``` Add the Intercom chat widget to every page. App ID: abc123. ``` ## Intercom ``` Add Intercom to every page. App ID: abc123. ``` Intercom offers more advanced features (user identification, events) that need extra snippet configuration — ask the AI to wire them: ``` Add Intercom with user identification. App ID: abc123. Use the identity snippet with name and email from window.pagefork.visitor. ``` ## Crisp Chat Free tier available. ``` Add Crisp chat to every page. Website ID: abc12-3456-7890-ab. ``` ## Tawk.to Free. ``` Add Tawk.to chat to every page. Widget ID: https://embed.tawk.to/abc123/def456 ``` ## Drift ``` Add Drift chat to every page. App ID: abc12345. ``` ## HubSpot Chat Paste the tracking code from HubSpot → **Settings → Tracking code**. It bundles chat alongside HubSpot analytics. ``` Add HubSpot tracking + chat. Portal ID: 12345678. ``` ## LiveChat ``` Add LiveChat to every page. License ID: 12345678. ``` ## Chatwoot (self-hosted or cloud) ``` Add Chatwoot to every page. Base URL: https://app.chatwoot.com. Website token: abc123. ``` ## Front Chat ``` Add Front Chat to every page. Chat ID: abc123. ``` ## Feedback / user-input widgets Some tools are feedback widgets rather than live chat: - **Canny** — public product-feedback board; paste their embed to show it inline. - **Featurebase** — similar. - **Frill** — roadmap + feedback widget. - **Senja collect-testimonial widget** — public review form. ``` Add the Canny feedback widget to the Feedback page. App ID: abc123. Board token: def456. ``` ## Only show on certain pages By default, a chat widget appears everywhere — which is usually what you want. If not: ``` Show Intercom only on the Pricing and Contact pages. Remove it from everywhere else. ``` ``` Hide Tawk.to on the Thank You page. ``` ## Position and styling ``` Move the Intercom launcher to the bottom-left. Add 24px extra bottom offset on mobile so it doesn't cover the CTA button. ``` ``` Make the Crisp chat bubble use brand color #E85D4E. ``` Vendor-specific styling works when the vendor exposes configuration; the AI uses the correct API for each tool. ## Mobile considerations - Chat launcher icons **overlap the bottom CTAs** on many mobile layouts. Tell the AI to add a bottom offset, or hide the chat on mobile entirely. - On tiny screens, big chat widgets that auto-expand on page load can cover the fold. Keep them collapsed by default. ## Performance Chat widgets typically add 100–400 KB of JavaScript. To keep Lighthouse scores up: - Load them only after interaction — ask the AI to use the vendor's deferred-load option if one exists. - Don't stack multiple chat widgets. ``` Load Intercom only after the user scrolls or clicks anywhere on the page. ``` ## Troubleshooting - **Widget doesn't appear** — open devtools → Console. Most vendors log a clear error (wrong app ID, domain not whitelisted). - **Widget appears in editor but not on published site** — remember to publish. See [Preview not updating](/docs/preview-not-updating/). - **Domain mismatch** — some vendors (Intercom, Drift) require you to add your custom domain in their dashboard. - **Chat blocked by cookie consent** — make sure chat is categorized as essential or allowed by default in your consent manager. See [Cookie consent and privacy](/docs/cookie-consent-and-privacy/). ## Next - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) - [Analytics and tracking](/docs/analytics-and-tracking/) - [Integrations overview](/docs/integrations-overview/) --- # Cloudflare and proxies Source: https://pagefork.ai/docs/cloudflare-and-proxies/ Description: When a CDN proxy sits in front of your PageFork domain, things break. Here's what to do. Group: Domains PageFork already runs on its own edge CDN with automatic SSL. If your DNS provider has a proxy in front of your domain (Cloudflare's orange cloud, Fastly, StackPath, etc.), it intercepts traffic before it reaches us — which blocks SSL issuance and can break interactive features. ## What to do on Cloudflare Cloudflare is the most common case. Each DNS record has a **toggle** between a grey cloud (DNS only) and an orange cloud (proxied). **Set every PageFork-related record to grey cloud (DNS only):** - The **CNAME** at `www` (or at your subdomain) → `sites.pagefork.ai`. - If you used an ALIAS / flattened CNAME at apex, that record too. - If you used the Case D apex-redirect pattern, the **A record** at `@` → the redirect IP. On Cloudflare: 1. Go to the site's **DNS** tab. 2. Find each record. 3. Click the orange cloud so it turns grey. 4. Save. ## Why proxies are a problem - **SSL issuance** — Let's Encrypt needs to reach PageFork directly to validate the domain. A proxy intercepts that challenge. - **Cache layering** — a proxy cache in front of PageFork's cache doubles invalidation time and can serve stale content after a republish. - **WAF / rate limits** — proxies sometimes block API requests coming from your own site, breaking forms and any interactive feature. ## Can I re-enable the proxy later? Technically yes, once SSL is Active. But we don't recommend it. You'd need to: - Configure origin SSL matching on Cloudflare. - Manage the cache layering yourself. - Accept that form submissions and dynamic calls route through the proxy. Most customers leave records grey and let PageFork's edge do the job. ## The only valid CNAME target is `sites.pagefork.ai` PageFork routes custom domains through a SaaS-style custom-hostname pipeline keyed to `sites.pagefork.ai`. Don't CNAME to a different host (even another PageFork-looking subdomain) — it won't validate. Don't point an A record directly at the PageFork edge either. The only valid A record is the **redirect-service IP** shown in the app, and only when paired with a CNAME on `www`. See [DNS records reference](/docs/dns-records-reference/). ## Other proxies If you use Fastly, AWS CloudFront, StackPath, or similar in front of your domain for PageFork, the same advice applies: turn off proxying for the PageFork hosts. PageFork isn't designed to sit behind another CDN. ## How to tell if a proxy is in the way Run a DNS lookup from a terminal: ``` dig www.yourbrand.com +short ``` Expected result — a CNAME resolving to `sites.pagefork.ai.` and then PageFork-owned IPs: ``` sites.pagefork.ai. 104.21.x.x 172.67.x.x ``` If instead you see an IP range owned by Cloudflare without a `sites.pagefork.ai` line, Fastly, or another CDN in front of the record, the proxy is still in the way. ## Next - [Connecting your domain](/docs/connecting-your-domain/) - [DNS records reference](/docs/dns-records-reference/) - [Domain not verifying](/docs/domain-not-verifying/) --- # Connecting your domain Source: https://pagefork.ai/docs/connecting-your-domain/ Description: Attach your own domain to a PageFork site, with automatic SSL. Group: Domains **To connect a custom domain to PageFork, open your site's Domain sheet, add the domain, and create the two DNS records PageFork shows you. SSL is issued automatically once DNS resolves, usually within a few minutes.** Every PageFork site with an active hosting subscription supports custom domains with automatic SSL. The exact DNS records you need depend on whether you're pointing an apex (`yourbrand.com`), a subdomain (`www` or `launch`), or both. ## 1. Open the domain sheet In the editor, click **Domain** in the toolbar. The sheet shows: - Your free `*.pagefork.ai` subdomain. - A **Custom domain** section — this is where you add a domain you own. Custom domains require an **active hosting subscription** for this site. See [Hosting subscriptions](/docs/hosting-subscriptions/) if you haven't set one up yet. ## 2. Enter your domain Click **Add custom domain** and type the domain. You can enter: - A **subdomain**, e.g. `launch.yourbrand.com` or `app.yourbrand.com`. - The **www subdomain**, e.g. `www.yourbrand.com`. - An **apex**, e.g. `yourbrand.com` (no prefix). PageFork branches based on what you entered: - **Subdomain** that isn't `www` → skip to step 5 — you only need one record. - **`www.` subdomain** → PageFork asks whether the apex should also reach your site (step 3). - **Apex** → PageFork asks about your DNS provider's capabilities (step 4). ## 3. "Do you also want the apex to work?" (www only) When you type `www.yourbrand.com`, the UI asks whether `yourbrand.com` (the apex, no prefix) should also serve your site. - **No, www only** — one DNS record. Skip to step 5. - **Yes, include apex** — continue to step 4. ## 4. "Does your DNS provider support CNAME flattening or ALIAS records?" This step appears whenever an apex is involved (you entered an apex directly, or you said "include apex"). The answer depends on your registrar: - **Yes** — providers like **Cloudflare**, **DNSimple**, **Netlify DNS**, **Route 53**, and a few registrars support a CNAME or ALIAS at the apex. You'll add **one** record. - **No** — most traditional registrars (GoDaddy, Namecheap, many others). You'll add **two** records: a CNAME on `www` pointing at PageFork, plus an A record at the apex pointing at PageFork's **redirect service** (which 301-redirects the apex to `www`). If you're unsure, pick **No** — the two-record path works everywhere. ## 5. Copy the DNS records from PageFork After confirming your answers, PageFork shows the exact records to paste into your registrar. Each record has a copy button. What you'll see depends on the case: ### Case A — Subdomain (not www) One CNAME: | Type | Name | Target | |--|--|--| | `CNAME` | (your subdomain, e.g. `launch`) | `sites.pagefork.ai` | ### Case B — www only One CNAME: | Type | Name | Target | |--|--|--| | `CNAME` | `www` | `sites.pagefork.ai` | ### Case C — Apex with ALIAS / CNAME flattening One record at the apex: | Type | Name | Target | |--|--|--| | `CNAME` (flattened) *or* `ALIAS` | `@` (or blank) | `sites.pagefork.ai` | ### Case D — www + apex, without ALIAS / flattening Two records: | Type | Name | Target | |--|--|--| | `CNAME` | `www` | `sites.pagefork.ai` | | `A` | `@` | (redirect IP shown by PageFork) | The A record only routes traffic to PageFork's **redirect service** — all it does is 301-redirect the apex to `www`. It does not serve the site itself; the CNAME on `www` does. > The redirect IP shown in the app is authoritative — copy the value > from the UI, not from this page. ## 6. Wait for verification and SSL PageFork polls DNS automatically. Your domain moves through: - **Pending** — records haven't been seen yet. - **Validating** — records found; Let's Encrypt is issuing a certificate. - **Active** — HTTPS is live. - **Failed** — something went wrong; the error tells you what. Typical time: 1–10 minutes. Click **Refresh status** to poll immediately. ## Common issues - **"Domain already connected"** — the domain is attached to a different PageFork site. Remove it there first. See [Changing or removing a domain](/docs/changing-or-removing-a-domain/). - **Stuck on Pending for more than an hour** — see [Domain not verifying](/docs/domain-not-verifying/). - **Using Cloudflare?** — set the record's proxy toggle to the **grey cloud** (DNS only). See [Cloudflare and proxies](/docs/cloudflare-and-proxies/). ## Next - [Apex vs www](/docs/apex-vs-www/) - [DNS records reference](/docs/dns-records-reference/) - [SSL certificates](/docs/ssl-certificates/) --- # Cookie consent and privacy Source: https://pagefork.ai/docs/cookie-consent-and-privacy/ Description: Add a GDPR/CCPA-compliant cookie banner to your PageFork site and control how tracking scripts load. Group: Integrations If visitors from the EU, UK, or California can reach your site, most tracking scripts (GA4, Meta Pixel, chat widgets, session replay) need a **cookie-consent banner** before they run. PageFork doesn't ship a banner of its own — the right pattern is a small third-party consent manager. > This page is practical guidance, not legal advice. If compliance > matters for your business, consult a lawyer. ## Do I need a banner? **Probably yes**, if you add any of these: - Google Analytics, Hotjar, Clarity, PostHog (with session replay). - Meta Pixel, LinkedIn Insight, TikTok Pixel, Google Ads tags. - Chat widgets like Intercom, Drift, HubSpot Chat. - Embeds that load third-party cookies (YouTube default mode, many social embeds). **Probably no**, if your tracking is limited to: - Plausible, Fathom, Simple Analytics (cookieless by design). - Google Analytics with IP anonymization *and* regional restrictions (gray area — check current guidance for your region). - No tracking at all. ## Consent-manager options All of these ship as a **drop-in JavaScript snippet**. Paste into PageFork the same way as any other integration. ### CookieYes Free tier covers small sites. Supports GDPR, CCPA, LGPD. ``` Add CookieYes consent banner to every page. Site ID: abc123. ``` ### Cookiebot Enterprise-ready, auto-scans your site for cookies and classifies them. ``` Add Cookiebot to every page. CBID: abc-123-def. ``` ### Termly Good all-in-one (banner + privacy policy + terms generator). ``` Add Termly to every page. Website UUID: abc123. ``` ### Osano Mid-market, heavy on compliance features. ``` Add Osano consent banner. Site ID: abc-123. ``` ### Quantcast Choice IAB TCF 2 compliant; usually overkill for a small site. ### Klaro! Open-source, free, self-configured. ``` Add the Klaro! consent banner to every page. Manage these services: Google Analytics, Meta Pixel, Intercom. ``` ## How consent blocking works Most managers support two styles: - **Automatic blocking** — the manager's script is loaded first, and it intercepts and blocks other scripts until the visitor accepts. You mark your tracking scripts with a special `type` attribute (or add them via the manager's UI). - **Consent mode** — Google's standard. Scripts load but only send "allowed" pings. Works with GA4, Meta, Microsoft Clarity via their `consent` APIs. Tell the AI which one your manager uses: ``` Wire Cookiebot to automatically block GA4, Meta Pixel, and Intercom until the visitor accepts analytics and marketing cookies. ``` ``` Wire GA4 with Google Consent Mode v2, default denied, update when Cookiebot fires consent. ``` ## Categorization Consent managers group cookies into categories. A typical setup: - **Strictly necessary** — session, CSRF, consent state. Always on, no toggle. - **Functional** — language preference, theme. Optional. - **Analytics** — GA4, Plausible (if you treat it as analytics), Hotjar, Clarity. Gated. - **Marketing** — Meta Pixel, TikTok Pixel, ad retargeting. Gated. Your manager's dashboard is where you assign each script to a category. ## Privacy policy and terms A banner is only half the picture. You also need: - A **Privacy Policy** page describing what you collect and why. - A **Terms of Service** page (for most commercial sites). - A **Cookie Policy** (some jurisdictions require it separately from the Privacy Policy). Tools like **Termly**, **iubenda**, and **FreePrivacyPolicy.com** generate these. Paste the output into a PageFork page or link out to the vendor-hosted version. ``` Create a /privacy page with this policy text: (paste the generated policy here) ``` ## DNT (Do Not Track) and GPC Some regions require you to honor the **Global Privacy Control** signal (a browser-level header that says "I don't want to be tracked"). Most consent managers support GPC out of the box — enable it in their dashboard. ## Testing After adding a banner: 1. Open the published site in a **private/incognito** window so no existing consent is cached. 2. Verify the banner appears on first load. 3. Click **Reject all** — then check devtools → Network for pings to GA4, Meta, etc. There should be **none** (or only "default denied" consent pings). 4. Click **Accept all** — the pings should now fire. 5. Verify the consent persists across pages but resets after clearing cookies. ## Scripts the banner should never block Some things should always run — otherwise the site breaks: - **Your own form submission logic** (PageFork forms are first-party and essential). - **Payment-provider scripts on checkout pages** (Stripe, Paddle, etc.). - **Security / anti-abuse scripts** like reCAPTCHA when used for security rather than tracking. Put these in the "strictly necessary" category. ## Updating consent later Consent managers provide a small "cookie settings" link or floating icon that lets visitors change their mind. Add it to the footer: ``` Add a "Cookie settings" link in the footer that opens the Cookiebot preference center. ``` ## Related laws (very brief) - **GDPR** (EU/EEA, UK) — requires opt-in consent before non-essential cookies. Banners must offer an equally easy "reject" option. - **CCPA / CPRA** (California) — requires a "Do Not Sell or Share My Personal Information" link if you do any targeted advertising. - **LGPD** (Brazil) — similar to GDPR. - **ePrivacy Directive** — older EU law, still relevant, focused on cookies specifically. - **PECR** (UK) — similar to ePrivacy. When in doubt, pick the strictest applicable law and design for it. ## Next - [Analytics and tracking](/docs/analytics-and-tracking/) - [Chat and support widgets](/docs/chat-and-support-widgets/) - [Integrations overview](/docs/integrations-overview/) - [Launch checklist](/docs/launch-checklist/) --- # Core concepts Source: https://pagefork.ai/docs/core-concepts/ Description: The vocabulary of PageFork: sites, pages, versions, blocks, credits, and hosting. Group: Getting Started **PageFork's core concepts are sites (projects), pages (URLs), versions (snapshots of every edit), credits (the unit of AI work), and hosting subscriptions (per-site monthly or yearly plans). This page defines each one.** You don't have to memorise it — but if you read it once, every other doc will make more sense. ## Site A **site** is one project. It has its own editor, its own chat history, its own pages, and its own publish settings. You can have many sites under a single account. New sites show up in the sidebar under **Recent Sites**, and the full list lives under **All Sites**. ## Page A **page** is one URL within a site, e.g. `/`, `/pricing`, `/about`. A site can have one page or many. PageFork decides which pages to create based on your prompts — you can always add more by asking ("add a pricing page"). ## Version Every edit produces a new **version** of the site. Versions are what power [undo/redo](/docs/versions-undo-retry/) — you can roll back at any point without losing your chat history. The version shown in the preview is the current one; publishing freezes one specific version and serves it from the public URL. ## Block A **block** is any visible element on your page — a headline, a card, a button, a pricing row, a footer link. Blocks are what you point at when you want to change "this specific thing" instead of the whole section. See [Selecting blocks](/docs/selecting-blocks/) for how to reference them in chat. ## Chat message The editor has two kinds of messages: - **Edit** — PageFork generates a new version of the site. - **Discuss** — PageFork answers a question or brainstorms with you, but doesn't change the site. Both consume credits, but Discuss is usually cheaper. See [Edit vs Discuss](/docs/edit-vs-discuss/). ## Credit A **credit** is the unit of AI usage. Each generation, edit, retry, or discuss message consumes credits based on how much the AI has to think and write. You buy credits in packs. See [Credits explained](/docs/credits-explained/). ## Hosting subscription A **hosting subscription** is what puts a site on the internet. One subscription covers one site, billed monthly or yearly. Without an active subscription for a site, you can still edit and preview it — you just can't publish it to a live URL. See [Hosting subscriptions](/docs/hosting-subscriptions/). ## Subdomain Every site gets a free `*.pagefork.ai` **subdomain** as soon as it's published (e.g. `acme.pagefork.ai`). You can change the subdomain label at any time. See [Your PageFork subdomain](/docs/your-pagefork-subdomain/). ## Custom domain A **custom domain** is a domain you own (like `acme.com`) that you point at your PageFork site. It requires an active hosting subscription and a quick DNS setup. SSL is automatic. See [Connecting your domain](/docs/connecting-your-domain/). ## The lifecycle, visually ``` prompt/template │ ▼ version 1 ──edit──▶ version 2 ──edit──▶ version 3 … │ ▼ publish live at acme.pagefork.ai (or acme.com) ``` Every edit creates a new version. Publishing snapshots one version and serves it. Editing after publishing creates new versions without affecting the live site — until you publish again. --- # Credits explained Source: https://pagefork.ai/docs/credits-explained/ Description: How AI credits work in PageFork and what each action costs. Group: Billing A **credit** is the unit of AI usage in PageFork. Every time you ask the AI to do something, credits are deducted from your balance. Credits are separate from hosting — you can pile up credits without paying for hosting, and vice versa. ## What costs credits Anything that runs the AI: - **Generating a new site.** - **Editing an existing site** (each Edit message). - **Discussing** with PageFork about a site (each Discuss message — usually cheaper than Edit). - **Retrying** a failed generation. Things that **don't** cost credits: - Opening the editor. - Using Undo / Redo. - Switching preview devices or pages. - Publishing or unpublishing. - Viewing submissions, downloading CSVs, updating your profile. ## How pricing is calculated Cost is based on how much work the AI does — specifically, the number of tokens read and written. Tokens are a measure of text the AI processes. For reference: - A short discuss message might be under 1 credit. - A typical edit on a small site might be 1–3 credits. - A full site generation from a prompt might be 5–20 credits depending on complexity. - A large rewrite across many pages can be higher. A minimum charge of 1 credit applies to any action that runs the AI, even a trivial one. ## Seeing your balance Your credit balance is shown: - On the **Billing** page (→ Credits tab). - Inside the chat composer when balance runs low. When you hit 0 credits, you'll see an **Out of credits** banner in chat and a modal when generating from the homepage. ## Rolling over Credits **do not expire** and roll over month to month. Buy in advance with confidence. ## Refunds We don't offer refunds for used credits, but we do for failed generations that consumed credits — those are automatically credited back. ## Next - [Purchasing credits](/docs/purchasing-credits/) - [Saving credits](/docs/saving-credits/) - [Hosting subscriptions](/docs/hosting-subscriptions/) - [Insufficient credits](/docs/insufficient-credits/) --- # CSV export Source: https://pagefork.ai/docs/csv-export/ Description: Download all submissions for a form as a CSV. Group: Forms If you want to move submissions into a spreadsheet, a CRM, or an email tool, use **CSV export**. ## How to export 1. Go to **Submissions** in the sidebar. 2. Pick a **site** and a specific **form** in the filters. 3. Click **Export CSV** top-right. A `.csv` file downloads immediately containing every submission for that form, including historic ones. > Export requires both a site **and** a form to be selected. Without a > form filter, there's no single column shape to export. ## What's in the file - One row per submission. - One column per field defined in the form's schema (in schema order). - Any extra fields that showed up in submissions but aren't in the schema, appended after the known fields. - Metadata columns: submission timestamp, read state. Values are quoted where needed to preserve commas, newlines, and quotes. ## Using the CSV elsewhere - **Google Sheets** — `File → Import → Upload`. Pick "Comma" as the separator. - **Excel** — open directly, or use `Data → From Text/CSV` for better control over column types (especially dates). - **Airtable** — create a new table and import the CSV. - **CRMs** — most (HubSpot, Pipedrive, Close) accept CSV import with column mapping. ## Exporting repeatedly Each export is a **full** snapshot of all submissions for that form. If you export weekly, you'll get overlapping data each time. Downstream tools should dedupe by the submission ID column or by timestamp + email. ## Character encoding CSVs are UTF-8. If your tool opens the file with the wrong encoding (common in older Excel on Windows), re-import using `Data → From Text/CSV` and pick UTF-8. ## Next - [Submissions inbox](/docs/submissions-inbox/) - [Form field schemas](/docs/form-field-schemas/) --- # Dashboard tour Source: https://pagefork.ai/docs/dashboard-tour/ Description: Find your way around the sidebar, Recent Sites, and All Sites. Group: Getting Started Once you're signed in, the left sidebar is your home base. Here's what each section does. ## The sidebar - **PageFork logo (top)** — returns to the homepage where you create a new site. - **Recent Sites** — collapsible list of the sites you've worked on most recently. Click one to open its editor. - **All Sites** — a full, paginated view of every site in your account. - **Forms → Submissions** — the inbox for form submissions across all your sites. An unread count appears as a badge here when new submissions arrive. - **Account menu (bottom)** — your profile, billing, support email, theme switcher, and sign-out. ## All Sites The All Sites page has two tabs: - **Active** — sites you're currently working on. - **Archived** — sites you've put aside. Each card shows the site name, a thumbnail, and a **Published** indicator if the site is currently live. The **⋯ menu** on each card exposes: - **View Submissions** — jumps to the submissions inbox pre-filtered by this site (only visible if the site is published). - **Archive** — move this site to the Archived tab. Available only when the site is **not published** and has **no active hosting subscription**. - **Unarchive** — move an archived site back to Active. > Archiving doesn't delete the site or the chat history. It just tidies up > the Active list. ## Theme The theme switcher (inside the account menu) offers **Light**, **Dark**, or **System**. Your choice applies to the dashboard only — your published sites keep whatever styling you prompted for. ## Support Inside the account menu, clicking the support email copies it to your clipboard and opens a `mailto:` compose window. Always include the site URL (or subdomain) in your support email — it helps us respond faster. ## Next - [Editing with AI](/docs/editing-with-ai/) - [The editor interface](/docs/the-editor-interface/) --- # Deleting your account Source: https://pagefork.ai/docs/deleting-your-account/ Description: How to fully remove your PageFork account and everything in it. Group: Account If you're leaving PageFork for good, you can delete your account yourself — as long as you don't have any active subscriptions. ## Before you delete Deletion is permanent. We recommend doing each of these first: 1. **Export anything you need.** [Export form submissions to CSV](/docs/csv-export/) for each site you want to keep records of. 2. **Unpublish published sites.** See [Unpublishing](/docs/unpublishing/). This is strictly optional — deletion will take them down anyway — but it's cleaner. 3. **Cancel every active subscription.** See [Managing billing in Stripe](/docs/managing-billing-in-stripe/). Active subs block deletion. 4. **Remove DNS records** at your registrar for any custom domains that point at PageFork. Domains keep their DNS bindings until you clean them up. ## Where to delete 1. Open **Account** from the sidebar → user menu. 2. Scroll to the **Danger zone**. 3. Click **Delete account**. 4. Confirm in the dialog. 5. You're signed out immediately. If you have active subscriptions, the Delete button is disabled with an explanation. Cancel the subs first. ## What gets deleted - Your profile and authentication credentials. - All your sites (chat history, versions, drafts, published copies). - All form submissions you've received. - All files you've uploaded. ## What's kept - **Invoices and payment records** required by law for accounting (we retain them per legal requirements). - **Anonymised product analytics** (e.g. "a user generated a site" with no personal data). ## Timing - **Immediate.** Your account is unusable within seconds. - **Data purge**: your data is removed from primary storage right away and from backups within our normal backup retention window. ## If deletion fails Most commonly: an active subscription the system didn't expect. The error message names the blocker. Fix it, then retry. If you're stuck, contact support. ## Next - [Managing billing in Stripe](/docs/managing-billing-in-stripe/) - [Unpublishing](/docs/unpublishing/) - [CSV export](/docs/csv-export/) --- # Designing for conversion Source: https://pagefork.ai/docs/designing-for-conversion/ Description: Prompt patterns that produce sites that actually convert. Group: Best Practices A pretty site that nobody acts on is a failed site. These are prompt patterns that bias PageFork toward output that converts — landing pages that sign people up, portfolios that book calls, local sites that fill slots. ## 1. Make the hero earn its space The hero is the first thing visitors see and most of them won't scroll. Prompt for: - A **clear headline** — what, for whom, and why they should care. Under 10 words. - A **one-sentence sub-headline** — the concrete benefit. - **One primary CTA.** Not two. One. - A **visual** that matches the subject, not a stock abstraction. Example prompt: > "Rewrite the hero. Headline under 8 words, says exactly what we do for > whom. Sub-headline one sentence with a concrete benefit. One CTA, > label it 'Start free'. No secondary CTA." ## 2. One CTA per section, repeated Every major section should have **one** CTA, and they should mostly point to the same destination. Decision fatigue kills conversion. Prompt: "Every section should have one CTA. Use the same label and destination ('Start free' → /signup) everywhere except the pricing section, which uses 'Pick a plan'." ## 3. Social proof where decisions happen Place testimonials, logos, and case studies **just before** the conversion moment — near the CTA, not on a separate page: - Below the hero. - Next to the pricing table. - Inside the form section. Prompt: "Add a single-line row of three customer logos under the hero, and a two-column testimonial next to the pricing grid." ## 4. Short forms convert better Every field is a friction point. Ask PageFork for the minimum: - For a newsletter: **email only**. - For a demo request: **email, name, company** — three fields. - For a contact: **email, message** — two fields. If you need more data, collect it after conversion, not before. ## 5. Specific copy beats clever copy "Book a 15-minute call" converts better than "Let's chat". Prompt for specificity: > "Replace the abstract CTA copy with concrete commitments: how long, > what happens next, what the user gets." ## 6. Typography hierarchy A page with three font sizes feels amateurish. A page with seven looks like a random walk. Aim for **four**: - H1 (hero headline). - H2 (section headlines). - Body. - Small / metadata. Prompt: "Tighten the typography hierarchy to exactly four sizes. Aggressive contrast between H1 and body; H2 just slightly larger than body." ## 7. Remove, don't add Every extra section dilutes the one the user actually needs to read. Prompt: "Remove the features section and the 'how it works' diagram — the hero and pricing already cover them." ## Anti-patterns - Three CTAs in the hero ("Sign up", "Learn more", "Watch video"). - A 10-field contact form for a newsletter. - Stock photos of people pointing at laptops. - "Innovative, scalable, best-in-class" copy. - Testimonials with no names or photos. ## Next - [Writing great prompts](/docs/writing-great-prompts/) - [Launch checklist](/docs/launch-checklist/) --- # DNS records reference Source: https://pagefork.ai/docs/dns-records-reference/ Description: Copy-paste DNS records for connecting a custom domain to PageFork. Group: Domains When you connect a custom domain, PageFork shows the exact records to add — use those. This page is a reference for planning ahead or when your registrar's UI doesn't line up with the PageFork flow. > The values in the PageFork domain sheet are authoritative. If they > differ from this page, use what the app shows you (especially the > redirect IP in Case D). ## The target host Every CNAME record for PageFork points at the same host: ``` sites.pagefork.ai ``` That's the only valid CNAME target. PageFork's edge handles routing, caching, and SSL for every domain that CNAMEs here. ## Case A — Subdomain (not www) One CNAME on the subdomain: | Type | Name | Target | TTL | |--|--|--|--| | `CNAME` | (e.g. `launch`, `go`, `app`) | `sites.pagefork.ai` | Auto / 300 | The simplest setup and the one we recommend for campaign pages or sub-brands. ## Case B — www only (no apex) One CNAME on `www`: | Type | Name | Target | TTL | |--|--|--|--| | `CNAME` | `www` | `sites.pagefork.ai` | Auto / 300 | Visitors who type the bare apex (`yourbrand.com`) will hit whatever the apex currently serves — often a registrar parking page or another app. If you want both to work, see Case C or Case D. ## Case C — Apex with ALIAS / CNAME flattening Available on **Cloudflare**, **DNSimple**, **Netlify DNS**, **Route 53**, and a few registrars. One record at the apex does the whole job: | Type | Name | Target | TTL | |--|--|--|--| | `ALIAS` *or* `CNAME` (flattened) | `@` (or blank) | `sites.pagefork.ai` | Auto / 300 | The cleanest option when your provider supports it. ## Case D — www + apex, without ALIAS / flattening The fallback for registrars that only support classic A / CNAME. **Two** records, both required: | Type | Name | Target | TTL | |--|--|--|--| | `CNAME` | `www` | `sites.pagefork.ai` | Auto / 300 | | `A` | `@` | (redirect IP shown in the PageFork app) | Auto / 300 | Important details: - The A record **doesn't serve your site**. It points at PageFork's tiny redirect service, which 301-redirects the apex to `www`. Your site is served from the `www` CNAME. - The A record is only valid **paired with** the `www` CNAME. An A record without a matching `www` CNAME won't verify. > There is no A record that points directly at PageFork's site edge. > CNAME to `sites.pagefork.ai` is the only way for a record to serve > your site. ## What TTL should I use? Any low value works — 300 seconds (5 minutes) or your provider's **Auto** setting is fine. Avoid 24h+ TTLs while you're setting things up; long TTLs make DNS issues painful to debug. ## Verifying the records In PageFork, your domain moves through these states: - **Pending** — records haven't been seen yet. - **Validating** — records found; SSL is being provisioned. - **Active** — live over HTTPS. - **Failed** — the error message says what's wrong. Click **Refresh status** any time to force a recheck. ## Common gotchas - **Proxied records** (Cloudflare's orange cloud, other CDNs). Must be **off** for every PageFork record — the CNAME, the apex redirect A, the ALIAS. See [Cloudflare and proxies](/docs/cloudflare-and-proxies/). - **Existing A records at `@`** from a previous host. Remove them before adding PageFork's records; stale A records shadow the redirect setup. - **AAAA records at `@` or `www`** pointing elsewhere. Remove them, or they'll be preferred on IPv6 and skip PageFork entirely. - **Wildcard records** (`*` → something). You *don't* need to remove or change these. Two reasons: - In standard DNS, `*` **does not match the apex** (`@`). A `* A 1.2.3.4` record answers for `anything.yourbrand.com` but never for `yourbrand.com` itself, so it doesn't conflict with the Case D apex A record you add for the PageFork redirect. - Specific records always win over `*` anyway. Your `www` CNAME to `sites.pagefork.ai` takes precedence over a `* CNAME` pointing somewhere else. Just know that any subdomain you *haven't* explicitly configured will still fall through to the wildcard's target. - **TXT records for email** (SPF, DKIM, DMARC). Leave them alone — PageFork doesn't touch them. ## Next - [Connecting your domain](/docs/connecting-your-domain/) - [Apex vs www](/docs/apex-vs-www/) - [Domain not verifying](/docs/domain-not-verifying/) --- # Domain not verifying Source: https://pagefork.ai/docs/domain-not-verifying/ Description: Custom domain stuck on Pending or Validating? Here's what to check. Group: Troubleshooting If a custom domain hasn't reached the **Active** status after 30 minutes, something in DNS is off. Work down this list. ## 1. Confirm the records match what PageFork shows Open **Domain** settings and compare the records PageFork lists with what's actually in your DNS. The most common mistakes: - **Wrong target host.** CNAMEs must point at `sites.pagefork.ai` exactly. Anything else fails validation. - **Wrong record type.** Using a CNAME where you need an A record (the apex-redirect case) or vice versa. See [DNS records reference](/docs/dns-records-reference/). - **Wrong host name.** E.g. adding records on `www` when you only connected `launch`. - **Missing second record.** For the www + apex case without flattening, you need **both** the `www` CNAME and the apex A record. Either alone won't validate. ## 2. Check for proxies If you use **Cloudflare** (or another CDN in front of your DNS), the proxy toggle must be **off** — the **grey cloud**, not the orange cloud. See [Cloudflare and proxies](/docs/cloudflare-and-proxies/). ## 3. Check DNS propagation From a terminal: ``` dig www.yourbrand.com +short dig yourbrand.com +short ``` Expected, per case: - **Subdomain / www CNAME**: `sites.pagefork.ai.` followed by PageFork-owned IPs. - **Apex with ALIAS / flattened CNAME**: PageFork-owned IPs (flattening hides the `sites.pagefork.ai` line). - **Apex with redirect A record (Case D)**: the redirect-service IP shown in the PageFork UI. Nothing else. If instead you see: - **Empty result** — records not saved, or TTL still expiring on your resolver. Wait 5–10 minutes. - **A Cloudflare / Fastly / other proxy IP** — proxy is still enabled. - **A different IP** — wrong record value. Update it. - **Old hosting provider's IP** — stale A record at apex. Delete it before PageFork's records can take over. ## 4. "Domain already connected" You'll see this error when adding a domain that's already attached to a different PageFork site. 1. Find the other site (All Sites → search). 2. Open its Domain settings. 3. **Remove** the domain there. 4. Go back to the new site and add it again. See [Changing or removing a domain](/docs/changing-or-removing-a-domain/). ## 5. Wrong apex configuration If you're trying to connect an apex (`yourbrand.com` with no `www`) and your registrar **doesn't** support ALIAS / CNAME flattening, there's no apex-only path — PageFork uses the `www` + redirect pattern instead. When adding the domain, enter `www.yourbrand.com` and choose **Include apex**; then add both the `www` CNAME **and** the apex A record from the domain sheet. If your registrar supports flattening and you used the one-record path, make sure the apex record is genuinely an ALIAS or flattened CNAME and not a regular A record. See [Apex vs www](/docs/apex-vs-www/). ## 6. TTL is too high If you previously had a record with a 24h TTL, your resolver may still be caching it. Options: - Wait it out. - Flush your local DNS cache (`sudo dscacheutil -flushcache` on macOS). - Test from a different network / DNS resolver (e.g. switch to 1.1.1.1). ## 7. It's been an hour, still Pending Click **Refresh status** one more time. If it's still Pending, contact support with: - The domain. - A screenshot of your DNS records. - The output of `dig` on both the apex and `www`. ## Next - [Connecting your domain](/docs/connecting-your-domain/) - [DNS records reference](/docs/dns-records-reference/) - [Cloudflare and proxies](/docs/cloudflare-and-proxies/) - [SSL not issuing](/docs/ssl-not-issuing/) --- # Edit vs Discuss Source: https://pagefork.ai/docs/edit-vs-discuss/ Description: When to ask PageFork to change your site, and when to just talk. Group: Editing The composer has two modes: **Edit** (the default) and **Discuss**. They look the same, but they do very different things. ## Edit In **Edit** mode, PageFork treats your message as an instruction to change the site. It will: - Read the relevant pages of your site. - Plan the change. - Write updated code. - Produce a new version that appears in the preview. Every Edit message creates a new version. Undo rolls it back without losing your chat history. Use Edit when you know what you want changed: - "Make the hero darker." - "Add a three-column feature section below the hero." - "Rewrite the CTA on the pricing page." ## Discuss In **Discuss** mode, PageFork answers questions and brainstorms with you without touching the site. It can: - Explain what's on your site. - Suggest what to try next. - Help you decide between two approaches. - Rewrite copy in chat for you to review before committing. No version is created. The preview doesn't change. Use Discuss when you're thinking, not yet deciding: - "What sections does my homepage have?" - "Give me three headline options for the hero." - "Would a FAQ or a comparison table be better here?" ## Credits Both modes consume [credits](/docs/credits-explained/), but Discuss is usually cheaper because it doesn't rewrite your site — it just reads and responds. When you're exploring ideas, Discuss is the efficient mode. ## Switching modes Below the composer you'll see an **Edit / Discuss** toggle. It sticks for the current session, so if you switch to Discuss to brainstorm, remember to switch back to Edit when you're ready to make changes. ## Which should I use? | Situation | Use | |--|--| | Clear, specific change | **Edit** | | Generate options to choose from | **Discuss** | | "What should I do about X?" | **Discuss** | | Apply the option you just picked | **Edit** | | Fixing a small issue | **Edit** | | Exploring a big structural change | **Discuss** first, then **Edit** | ## Next - [Saving credits](/docs/saving-credits/) - [Writing great prompts](/docs/writing-great-prompts/) --- # Editing with AI Source: https://pagefork.ai/docs/editing-with-ai/ Description: Get the most out of PageFork by writing clear, targeted edit prompts. Group: Editing **To edit a PageFork site, type a plain-English instruction in the chat. The best edit prompts name three things: the target (which section), the change (what to do), and an optional constraint (tone, style, length). Smaller edits, one change at a time, produce the best results.** PageFork is conversational by design. The better your prompt, the better your result. Here are patterns that consistently produce great edits. ## Anatomy of a great edit A strong edit prompt usually names three things: 1. **Target** — which section or element you want changed. 2. **Change** — what you want to do to it. 3. **Constraint** — optional tone, style, length, or layout requirements. ### Examples - **Target + change + constraint**: "In the hero, replace the headline with something under 8 words and confident." - **Copy rewrite**: "Rewrite the 'About' section to feel more personal and first-person." - **Layout change**: "Move the pricing section directly after the hero." - **Style shift**: "Make the whole page darker and more editorial, keep the lime accent." ## Iteration mindset Don't try to fix everything in one prompt. Short, surgical edits work best: 1. Generate → review 2. Fix the single biggest thing wrong 3. Repeat This is both faster and gives you much better results than a giant "change everything" prompt. ## When to reference - **Brand reference**: "Match the tone of brand X" (include a URL if public). - **Structural reference**: "Use a hero similar to Stripe's docs landing." - **Image reference**: attach a screenshot of the look you want. --- # Email notifications Source: https://pagefork.ai/docs/email-notifications/ Description: Get an email for every form submission you receive. Group: Forms Every time someone submits a form on your PageFork site, you get an email. No configuration needed — it just works. ## Where the email goes To the **email address on your PageFork account**. If that's not the best address for lead notifications (e.g. you want them going to a shared sales inbox), update your account email — see [Your profile](/docs/your-profile/). ## What the email contains - Which site received the submission. - Which form was submitted. - Every field value submitted, in a clean table. - A link straight to that submission in the [Submissions inbox](/docs/submissions-inbox/). - The submitter's IP address, for spam/legitimacy checks. ## Not receiving emails? First, check your spam folder. Notification emails come from a PageFork domain; some strict filters will misroute the first few until your mail client learns they're legitimate. Add the sender to your contacts. If submissions are visible in the inbox but you never got the email, see [Forms not receiving](/docs/forms-not-receiving/) for more checks. ## Can I turn off emails per form? Not yet — every form notifies you. If you run a high-volume form and want to mute it, a common pattern is to set up a mail-client rule: auto-archive anything from PageFork that contains a specific form name. Your inbox stays tidy and the Submissions page still shows everything. ## Forwarding to a team If multiple people should see the same submissions, the simplest setup is to make your account email a mailing list (e.g. `leads@yourbrand.com`) that fans out. Alternatively, set up a mail-client rule to forward all PageFork emails to your team. ## Next - [Forms overview](/docs/forms-overview/) - [Submissions inbox](/docs/submissions-inbox/) - [Forms not receiving](/docs/forms-not-receiving/) --- # Embeds and iframes Source: https://pagefork.ai/docs/embeds-and-iframes/ Description: Embed videos, maps, calendars, forms, prototypes, and other widgets on your PageFork site. Group: Integrations Most third-party services give you an **embed code** — usually an ` ``` The AI handles responsive sizing, aspect ratios, and sensible fallbacks (title, loading="lazy", sandbox where needed). ## Video ### YouTube ``` Embed this YouTube video in the hero section: https://youtu.be/dQw4w9WgXcQ ``` Or use their share → embed snippet directly. Ask the AI for an autoplay muted loop for hero backgrounds: ``` Add this YouTube video as an autoplay, muted, looping background in the hero: https://youtu.be/dQw4w9WgXcQ ``` ### Vimeo Same pattern — paste the URL or the embed snippet. ``` Embed this Vimeo in the About section: https://vimeo.com/123456789 ``` ### Loom ``` Embed this Loom walkthrough in the Demo section: https://www.loom.com/share/abc123 ``` ### Wistia ``` Embed this Wistia video: https://yourbrand.wistia.com/medias/abc123 ``` ## Audio and podcasts ### Spotify ``` Embed this Spotify episode: https://open.spotify.com/episode/... ``` Works for tracks, albums, episodes, and shows. ### SoundCloud ``` Embed this SoundCloud track: https://soundcloud.com/artist/track ``` ### Apple Podcasts Use the Apple Podcasts "Share → Embed" snippet: ``` Embed this Apple Podcasts player in the Podcast section: ``` ## Maps ### Google Maps Maps → **Share** → **Embed a map** → copy the iframe. ``` Embed this Google Map in the Location section: ``` Ask for a specific address instead if you don't have the embed code: ``` Add a Google Map for "123 Main St, Berlin, Germany" in the Contact section. ``` ## Scheduling and booking ### Calendly ``` Embed my Calendly page in the Contact section: https://calendly.com/yourbrand/intro ``` Calendly offers inline, popup, and popup-button variants. Specify if you want something non-default: ``` Add Calendly as a popup-button labelled "Book a call" in the header: https://calendly.com/yourbrand/intro ``` ### Cal.com ``` Embed my Cal.com link inline in the Contact section: https://cal.com/yourbrand/30min ``` ### SavvyCal / other schedulers Same pattern — paste the vendor's embed snippet or their share URL. ## Forms (third-party) PageFork has [built-in forms](/docs/forms-overview/) that store submissions in your dashboard and email you. Use a third-party form instead when you need: - Advanced logic (branching questions, calculations). - Payment collection inside the form (Typeform / Tally paid tiers). - Submission data routed straight to another tool (Notion, Airtable, Sheets) without custom plumbing. ### Tally ``` Embed this Tally form in the signup section: https://tally.so/r/abc123 ``` ### Typeform ``` Embed this Typeform in the signup section: https://yourbrand.typeform.com/to/abc123 ``` Typeform supports inline, fullpage, and popup modes — say which one you want. ### Google Forms ``` Embed this Google Form on the Contact page: https://docs.google.com/forms/d/e/.../viewform ``` ### Jotform ``` Embed this Jotform: https://form.jotform.com/12345678 ``` ## Design and product embeds ### Figma ``` Embed this Figma prototype in the Design section: https://www.figma.com/file/abc123/Prototype ``` ### Airtable ``` Embed this Airtable view as an iframe in the Pricing section: https://airtable.com/embed/appABC/shrXYZ ``` ### Notion Use a service like **Super** or **Fruition** to expose a Notion page as an iframe, or paste the public Notion URL and ask the AI to use the standard Notion embed pattern. ## Social posts ### X (Twitter) ``` Embed this tweet in the Testimonials section: https://twitter.com/username/status/1234567890 ``` ### Instagram post ``` Embed this Instagram post: https://www.instagram.com/p/ABC123/ ``` Instagram embeds rely on Instagram's script — the AI adds the loader too. ### TikTok ``` Embed this TikTok video: https://www.tiktok.com/@user/video/1234567890 ``` ### LinkedIn post LinkedIn doesn't ship a great native embed. Two common workarounds: - Take a screenshot and use it as a testimonial image. - Use [Embedsocial](https://embedsocial.com/) or a similar aggregator. ## Reviews and social proof - **Trustpilot widget** — paste the script from their embed generator. - **Senja widget** — testimonial carousel / wall of love. - **G2 / Capterra badges** — usually plain image links; the AI can wire them as regular images. - **Google Reviews** — use a widget like Elfsight or Trustmary; paste their script. ## Responsive iframe tips PageFork wraps iframes in a responsive container by default (16:9 for video, sensible aspect ratios elsewhere). If something looks wrong on mobile: ``` Make the Calendly embed in the Contact section responsive — full width on mobile with a min height of 600px. ``` ## Gotchas - **`X-Frame-Options` / CSP blocks** — a few vendors (notably some banks, Google account pages) refuse to be iframed. There's no workaround; find a different embed option or link out. - **Autoplay restrictions** — browsers block autoplay with sound. Loop videos in hero sections must be muted. - **Cookie consent** — some embeds set tracking cookies (YouTube, social). If you target EU users, consider a consent-gated variant (e.g. YouTube `nocookie` URLs, or loading the embed only after consent). - **Performance** — many heavy embeds on one page will slow it down. Use `loading="lazy"` (the AI sets this by default) and keep the fold light. ## Next - [Chat and support widgets](/docs/chat-and-support-widgets/) - [Forms overview](/docs/forms-overview/) - [Payment links and checkout](/docs/payment-links-and-checkout/) - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) --- # Form field schemas Source: https://pagefork.ai/docs/form-field-schemas/ Description: How PageFork knows which columns to show for each form. Group: Forms Each form on your site has a **schema** — the list of fields it expects. PageFork uses that schema to render dynamic columns in the submissions inbox, to order fields in the detail sheet, and to decide CSV columns. ## How a schema is built The first time a form is submitted, PageFork records every field name it saw. On later submissions, any new field names are added to the schema. The schema grows automatically with the form. You don't manage the schema by hand. It's a reflection of what the form actually sends. ## When the schema gets messy Occasionally you'll see junk fields — typically after: - **Renaming a field in the form** — old submissions used the old name; new ones use the new name. Both appear as columns. - **Adding bot/spam entries with random field names** — rare, but possible if spam rate-limiting is bypassed. - **Pasting a form into a new place** and forgetting a stale `name=…` attribute. ## Cleaning up If you want the schema to look consistent going forward: 1. **Edit the form in PageFork** so the field names match what you want. Ask in chat: "rename the 'email_address' field to 'email' on the contact form". 2. **Republish** the site so visitors start submitting the new names. 3. Old submissions keep their original fields. They show in the CSV as extra columns. You can ignore or delete them in your downstream tool. There's no "drop field" button in the inbox on purpose — old data is preserved by default. If you need historical fields removed from the inbox, contact support. ## Field ordering The detail sheet and CSV show fields in the **order they were first seen**. If you want a particular order: - Edit the form in PageFork so fields appear in the right order in the HTML. Most browsers submit fields in DOM order. - New schemas reflect the new order from the next submission onwards. ## Next - [Forms overview](/docs/forms-overview/) - [CSV export](/docs/csv-export/) - [Submissions inbox](/docs/submissions-inbox/) --- # Forms not receiving Source: https://pagefork.ai/docs/forms-not-receiving/ Description: Submitted a test and nothing arrived? Here's where submissions usually get lost. Group: Troubleshooting If you submit a test entry and it doesn't show up in the [Submissions inbox](/docs/submissions-inbox/) (or the email notification never arrives), work through this list. ## Is the site actually published? Forms only accept submissions on a **published** site. If you submitted the form from inside the editor preview (in Interact mode), the preview isn't a submission endpoint — it's a render sandbox. To test forms, **publish first**, then submit from the real live URL. ## Is the form on the current published version? You added the form, but did you republish? Edits are not live until you click **Publish** / **Republish**. 1. Confirm the form is visible in the editor preview. 2. Click **Republish**. 3. Open the live URL in an incognito window. 4. Submit again. ## Check the inbox filters On the Submissions page, make sure: - No **site filter** is hiding the submission (e.g. you filtered to a different site). - No **form filter** is limiting the view. - You're on **page 1** of the table. Click **Clear filters** if available, or manually set "All sites" and "All forms". ## Check email spam / filters Email notifications can end up in spam, especially for the first few submissions on a new account. Check: - Spam / Junk folder. - Promotions tab (Gmail). - Any custom rule that might auto-archive PageFork emails. Add the PageFork notification sender to your contacts / safe senders so future notifications arrive reliably. ## Is the "notification email" the right address? Notifications go to the email on your PageFork account. If that's not the inbox you check: - Update your account email — see [Your profile](/docs/your-profile/). - Or set up forwarding from your account email to where you actually read mail. ## Is the form using a third-party embed? If you asked PageFork to embed a third-party form (Typeform, Tally, Mailchimp, HubSpot…), submissions go to that provider, **not** to PageFork's inbox. Check the provider's dashboard. ## Is rate-limiting blocking submissions? Anonymous form submissions are rate-limited to prevent abuse. If you're submitting many test entries from the same IP in a short window, some may be rejected. Wait a minute and retry. ## Still nothing arriving Contact support with: - The live URL. - The form name / page. - Approximate time of a test submission. - What you submitted. ## Next - [Forms overview](/docs/forms-overview/) - [Submissions inbox](/docs/submissions-inbox/) - [Email notifications](/docs/email-notifications/) --- # Forms overview Source: https://pagefork.ai/docs/forms-overview/ Description: Add forms to your site by asking. Submissions flow into PageFork automatically. Group: Forms Forms are first-class in PageFork. You don't install a third-party widget, paste embed codes, or configure webhooks — you just ask, and submissions appear in your inbox. ## Adding a form Open the editor and say what you want: - "Add a contact form with name, email, and message." - "Put a newsletter signup form (just email) in the footer." - "Add a waitlist form with name, email, and company — make email required." PageFork: - Generates the form UI in the right section. - Connects it to PageFork's form backend for this site. - Sends you an [email notification](/docs/email-notifications/) on each submission. - Stores each submission in the [Submissions inbox](/docs/submissions-inbox/). ## Forms vs third-party tools If you already use Mailchimp, HubSpot, ConvertKit, Typeform, Tally, or similar, you can embed them instead — see [Embeds and iframes](/docs/embeds-and-iframes/) for the patterns. Reach for a third-party form when you need features PageFork's built-in forms don't cover: branching logic, calculations, payment fields, or direct routing into another tool (Notion, Airtable, Sheets) without custom plumbing. For everything else, PageFork's built-in forms are the simpler default — one less service to manage. ## Required vs optional fields Tell PageFork which fields are required: - "Make email required, everything else optional." - "Require all fields." Client-side validation is automatic: empty required fields block submission. ## Privacy PageFork stores: - The values submitted. - The submission timestamp. - The submitter's IP address (for anti-spam / legitimacy checks). - The `Origin` header of the page that submitted. That's it. If you need to comply with a privacy policy (GDPR, CCPA), add a clear disclosure to your form ("By submitting, you agree to our privacy policy") and publish a matching policy page. ## Limits - No artificial cap on submissions per form. - Anonymous submissions are rate-limited to prevent abuse. - For extremely high-volume lead capture, contact support. ## Next - [Submissions inbox](/docs/submissions-inbox/) - [Email notifications](/docs/email-notifications/) - [CSV export](/docs/csv-export/) - [Form field schemas](/docs/form-field-schemas/) --- # Starting from a template Source: https://pagefork.ai/docs/from-a-template/ Description: Skip the blank page. Pick a template and customise it with AI. Group: Getting Started If you'd rather not start from a prompt, pick one of PageFork's prebuilt templates and customise it from there. Templates are full, opinionated websites designed for a specific use case — you swap the copy, images, and style via chat, exactly the same way you'd edit a generated site. ## Browsing templates 1. On the [homepage](/), click **Browse templates**. 2. Filter by category — **Marketing Agencies**, **Local Businesses**, **Fitness**, and more. 3. Click any template to see a full-page preview. 4. Click **Use this template** to create a new site from it. Each template has a short description and a preview image. Filters make it easy to narrow to your use case, but a "restaurant" template works just as well as a starting point for a bakery, studio, or café — once generated, the site is yours to reshape. ## Customising your template A site created from a template behaves identically to one created from a prompt: - You can edit any section via chat. - You get the same [versions, undo, and retry](/docs/versions-undo-retry/). - You can add and remove pages. - You publish exactly the same way. Good first prompts after picking a template: - "Change the brand name to Acme and replace the hero copy to focus on AI coaching." - "Swap the testimonials for real ones — I'll paste them." - "Tighten the colour palette to navy and cream, keep the lime accent." ## Template vs. prompt: which should I choose? | Pick a template when | Start from a prompt when | |--|--| | You want a fully-populated site right away | You have a very specific vision | | You're unsure what sections you need | You want something unusual or off-pattern | | You want a known-good layout baseline | You want PageFork to invent the structure | Both paths give you the same editable result. The template route just starts you closer to "done". ## Next - [Editing with AI](/docs/editing-with-ai/) — write prompts that actually work. - [Core concepts](/docs/core-concepts/) — understand sites, pages, versions. --- # Generation failed Source: https://pagefork.ai/docs/generation-failed/ Description: Your edit or generation failed. What to try next. Group: Troubleshooting Occasionally a site generation or edit doesn't complete. The chat shows a **Generation failed** banner and offers a **Retry** button. Here's how to recover. ## Try Retry first In most cases, retrying works. The AI gets a fresh attempt with the same message, and common transient issues (timeouts, hiccups) resolve. - Click **Retry** in the chat. - Wait for the generation to complete. - If it succeeds, you're done. Failed generations that consumed credits are automatically refunded when the refund policy applies — so Retry is usually a safe first move. ## If Retry fails Try a different angle. One of these usually helps: ### Simplify the prompt If the original prompt tried to do several things at once, break it up: - Undo the failed state (if any partial version was produced). - Send a smaller, more focused Edit. See [Iterate in small steps](/docs/iterate-in-small-steps/). ### Switch to Discuss to diagnose Switch to **Discuss** and ask PageFork what went wrong: > "The last edit failed — why might that be?" Discuss can often explain: the request was ambiguous, an element didn't exist, or a pattern was ambiguous. > Note: once you send a Discuss message after a failed generation, the > Retry button disappears. You can still re-send the original Edit > manually. ### Rewrite the prompt After understanding the issue, send a cleaner Edit prompt with more specifics — see [Writing great prompts](/docs/writing-great-prompts/). ## Common causes - **Too much scope in one prompt.** Fix: smaller prompts. - **Ambiguous references** (e.g. "change the button" on a page with many buttons). Fix: use [Select mode](/docs/selecting-blocks/) to reference the specific element. - **Conflicting instructions** (e.g. "keep this exactly" + "make it completely different"). Fix: pick one. - **Network blip.** Fix: Retry. ## When to contact support If the same prompt fails three times in a row and you can't tell why, send support: - The site URL. - The approximate time of the failure. - The prompt you were trying. ## Next - [Insufficient credits](/docs/insufficient-credits/) - [Writing great prompts](/docs/writing-great-prompts/) - [Iterate in small steps](/docs/iterate-in-small-steps/) --- # Getting started Source: https://pagefork.ai/docs/getting-started/ Description: Generate your first PageFork site in under a minute. Group: Getting Started **To generate your first PageFork site: go to [pagefork.ai](https://pagefork.ai), describe your site in one sentence, click Generate, then iterate with natural-language prompts and click Publish when you're ready.** This guide walks you through generating, editing, and publishing your first landing page — from zero to live domain in about five minutes. ## 1. Describe your site On the [homepage](/), type a sentence describing what you want to build. Try to include: - **Who it's for** — "a launch page for my AI fitness app" - **What it should highlight** — "with pricing, testimonials, and a booking form" - **Any tone or style cues** — "bold and minimal, dark mode" Hit **Generate** and PageFork will produce your first version in under a minute. > Tip: you can also paste a URL to reference a brand or attach an image for > inspiration. ## 2. Iterate in plain English You don't have to get it right the first time. Just tell PageFork what you want changed. Examples: - "Make the hero darker." - "Replace the pricing table with a comparison grid." - "Add a testimonials section above the FAQ." - "Shorten the hero headline — make it punchier." Every change is instant and non-destructive. Undo, redo, and branch experiments freely. ## 3. Publish to your domain When you're happy, hit **Publish**. PageFork will: 1. Generate a static, CDN-hosted version of your site. 2. Walk you through connecting a custom domain (DNS, SSL — all automatic). 3. Register your site with search engines and expose a sitemap. That's it — your page is live. Read [Connecting your domain](/docs/connecting-your-domain/) for the domain setup details. --- # Glossary Source: https://pagefork.ai/docs/glossary/ Description: Plain-English definitions for every PageFork term — sites, versions, credits, forks, hosting subscriptions, and more. Group: Reference Published: 2026-04-22 Updated: 2026-04-22 **Need a definition?** This glossary explains every PageFork concept in one sentence, with a link to the full article when one exists. ## Core concepts ### Site A **site** is one PageFork project — one set of pages, one style, one domain. Every site has its own version history, submissions inbox, and hosting subscription. ### Page A **page** is a single URL inside a site (for example, the home page, an about page, or a pricing page). PageFork sites can be single-page or multi-page; you control this with prompts. ### Generation A **generation** is the first-time creation of a site from your prompt. Generation uses generation credits and typically finishes in under a minute. ### Edit An **edit** is any change you make to an existing site by typing an instruction in plain English. Edits use edit credits. ### Prompt A **prompt** is the natural-language instruction you type to generate or edit a site (for example, "Create a landing page for a dog-training business in Austin"). ### Version A **version** is a saved snapshot of your site at a point in time. Every generation and every edit creates a new version. You can preview any version, revert to it, or fork from it. ### Fork A **fork** is a branch of your version history. Forking lets you explore an alternative direction without losing the current one — useful when you want to try a redesign or test a different hero. ### Fork tree The **fork tree** is the full graph of versions and forks for a site. It's how you navigate and compare directions. ## AI & editing ### Edit vs Discuss **Edit mode** applies your instruction to the site. **Discuss mode** answers questions about the site or brainstorms changes without modifying anything. See [Edit vs Discuss](/docs/edit-vs-discuss/). ### Block selection **Block selection** lets you click a specific section of the preview (hero, pricing card, FAQ) and scope an edit to just that block — the fastest way to iterate on one piece without disturbing the rest. See [Selecting blocks](/docs/selecting-blocks/). ### Reference image A **reference image** is an image you attach to a prompt so PageFork can match its style, layout, or mood. See [Reference images](/docs/reference-images/). ## Credits & billing ### Credit A **credit** is PageFork's unit of AI work. Credits are consumed by generations and edits. Credits never expire. ### Generation credit A **generation credit** is spent the first time you turn a prompt into a site. ### Edit credit An **edit credit** is spent each time you change an existing site with a prompt. ### Hosting subscription A **hosting subscription** is the per-site monthly or yearly plan that keeps a site live on PageFork's CDN with SSL. One subscription per published site. ### Apex domain An **apex** (or root) domain is the bare domain without a subdomain — for example, `pagefork.ai`. The opposite is `www.pagefork.ai`. See [Apex vs WWW](/docs/apex-vs-www/). ## Publishing & domains ### Publish To **publish** a site is to make its current version live at its connected URL (either `*.pagefork.ai` or a custom domain). ### Unpublish To **unpublish** a site is to take it offline while keeping all its versions and submissions intact. ### PageFork subdomain Every site gets a free `*.pagefork.ai` subdomain automatically. See [Your PageFork subdomain](/docs/your-pagefork-subdomain/). ### Custom domain A **custom domain** is any domain you own, connected to a PageFork site via two DNS records. See [Connecting your domain](/docs/connecting-your-domain/). ### SSL certificate PageFork automatically issues and renews a free **SSL certificate** (via Let's Encrypt) for every custom domain once DNS verification succeeds. ## Forms & submissions ### Form A **form** is a lead-capture block on a page (contact, waitlist, booking). PageFork generates forms from your prompt and stores submissions in the inbox. ### Submission A **submission** is one entry someone made by filling out a form on your site. Submissions live in the site's inbox and can be exported to CSV. ### Field schema A **field schema** is the set of fields and validation rules for a form (name, email, message, custom fields). See [Form field schemas](/docs/form-field-schemas/). --- Missing a term? Email [support@pagefork.ai](mailto:support@pagefork.ai) and we'll add it. --- # Going live checklist Source: https://pagefork.ai/docs/going-live-checklist/ Description: What to verify before you publish to the public. Group: Publishing Once something is live, the bar for quality jumps. Run this checklist before your first real publish — it takes five minutes and prevents almost every "I should have caught that" moment. ## Content - [ ] Every page's **copy is proofread**. Ask PageFork to proofread if you want a second pass. - [ ] **Placeholders are replaced** — no "Lorem ipsum", "Your name here", or `#` buttons. - [ ] **Images are final** — no stock-photo watermarks, no unlicensed photography, no low-resolution hero images. - [ ] **Contact details are correct** — phone numbers, addresses, email addresses, social links all work. ## Layout and responsive - [ ] **Desktop preview** looks balanced at wide widths. - [ ] **Tablet preview** (768 px) has no broken layouts. - [ ] **Mobile preview** (375 px) has readable copy, tappable buttons, and a working nav. See [Preview devices](/docs/preview-devices/). - [ ] **Long content** doesn't overflow on mobile (tables, code blocks, long headlines). ## Forms - [ ] Every form has the fields you actually want. - [ ] You've **submitted a test entry** to every form after publishing, and checked it arrived in the [Submissions inbox](/docs/submissions-inbox/). - [ ] You've **received the email notification** (check spam). See [Email notifications](/docs/email-notifications/). ## Domain and SSL - [ ] Your free `*.pagefork.ai` subdomain is the one you want. See [Your PageFork subdomain](/docs/your-pagefork-subdomain/). - [ ] Your **custom domain** (if any) shows status **Active**. See [Connecting your domain](/docs/connecting-your-domain/). - [ ] The site loads over **HTTPS** (padlock in the browser). - [ ] Both `yourbrand.com` and `www.yourbrand.com` resolve if you want both. See [Apex vs www](/docs/apex-vs-www/). ## Links and navigation - [ ] All nav links go where you expect. - [ ] All CTAs lead to a real destination (form, booking tool, pricing page). - [ ] No accidental links to `/draft`, `/internal`, or similar. ## Analytics and SEO - [ ] **Page titles and descriptions** are meaningful on every page. Ask PageFork to "set a great title and meta description on every page" if you haven't already. - [ ] **Analytics** is installed (if you want it). - [ ] **Favicon** is yours. ## Test on a real phone The in-editor preview is good, but real phones catch issues the preview can't (touch scrolling, viewport quirks, font rendering). Publish first, then test on your phone. ## Next - [Publishing overview](/docs/publishing-overview/) - [Connecting your domain](/docs/connecting-your-domain/) --- # Hosting subscriptions Source: https://pagefork.ai/docs/hosting-subscriptions/ Description: One subscription per site puts it on the public internet. Group: Billing A **hosting subscription** is what makes a PageFork site publicly reachable. You subscribe once per site and pay monthly or yearly while the site is live. ## Why per-site? Because it makes the pricing predictable and lets you keep unlimited unpublished drafts without paying for them. Pay for what's live; experiment for free. ## Monthly vs yearly When you subscribe, you pick a billing cycle: - **Monthly** — the flexible choice. Cancel any time; your site stays live until the end of the current period. - **Yearly** — discounted total. Cancel any time; your site stays live until the end of the year. You can change the cycle later via the Stripe customer portal — see [Managing billing in Stripe](/docs/managing-billing-in-stripe/). ## What the subscription includes - **Custom domain support** — connect any domain you own. See [Connecting your domain](/docs/connecting-your-domain/). - **Automatic SSL** — Let's Encrypt on every domain, auto-renewed. - **CDN hosting** — global edge caching, fast everywhere. - **Form submissions** — unlimited, with email notifications. - **Your `*.pagefork.ai` subdomain** — stays active while the subscription is. ## What it doesn't include - **AI credits.** Credits are separate — see [Credits explained](/docs/credits-explained/). - **Email hosting** for your domain. PageFork hosts websites, not mailboxes. ## Starting a subscription 1. Open a site in the editor. 2. Click **Subscribe** in the toolbar (replaces Publish when you have no active sub). 3. Pick monthly or yearly. 4. Complete Stripe checkout. 5. Back in the app, click **Publish**. ## Managing subscriptions The **Subscriptions** tab on the Billing page lists every subscription: - Status (**active**, **cancelled at period end**, etc.). - Renew / end date. - Per-subscription payment history. - A **⋯ menu** for cancel, payment history, and portal access. A **Manage All in Stripe** link takes you to the portal to manage everything at once (payment method, invoices, cycle). ## Cancelling Cancel via the portal. The site stays live until the end of the current period, then stops serving — both the custom domain and the `*.pagefork.ai` subdomain return a "not found". Uncancel at any point before the period ends to keep the site live. ## Multiple sites Each site has its own subscription. You can have many active at once; the portal shows all of them and the "Manage All" view groups invoices for convenient accounting. ## Next - [Publishing overview](/docs/publishing-overview/) - [Managing billing in Stripe](/docs/managing-billing-in-stripe/) - [Invoices and payments](/docs/invoices-and-payments/) --- # Insufficient credits Source: https://pagefork.ai/docs/insufficient-credits/ Description: Out of credits mid-edit, or hitting an "Insufficient Credits" modal. Group: Troubleshooting If you see the **Out of credits** banner in chat or an **Insufficient Credits** modal on the homepage, you're at 0 credits — the AI won't run until you top up. ## Immediate fix 1. Click **Get credits** on the banner or modal. 2. You're sent to **Billing → Credits**. 3. Pick a pack and complete checkout. See [Purchasing credits](/docs/purchasing-credits/). 4. Credits arrive instantly after Stripe confirms payment. 5. Return to the editor. The banner clears and you can continue. ## What's safe to do with 0 credits - Open any site and view the preview. - Undo and redo through versions. - Publish or republish a site (publishing doesn't consume credits). - Read chat history. - Manage domains, view submissions, download CSVs. The only thing that's blocked is **running the AI** — new edits, new discuss messages, retries, and new site generations. ## I just bought credits, why am I still blocked? - **Payment still processing.** If Stripe is verifying the payment method (especially on SCA / 3D Secure), the top-up can lag the return to PageFork by up to a minute. Refresh the editor. - **Browser tab cached the old balance.** Refresh. - **Bought on a different account.** Check the account email on the Billing page matches the one you expect. ## I want to avoid running out - **Set up a bigger pack** so you're not topping up often. Bigger packs are discounted per-credit anyway — see [Purchasing credits](/docs/purchasing-credits/). - **Use Discuss** to explore before committing to Edit runs — see [Saving credits](/docs/saving-credits/). - **Keep an eye on the Credits tab** — it shows balance and recent usage. ## Refunds Credits consumed by **failed generations** are automatically refunded where our policy applies. Credits consumed by successful generations aren't refundable even if you don't like the result — prefer Undo and a better prompt over Retry in that case. ## Next - [Credits explained](/docs/credits-explained/) - [Purchasing credits](/docs/purchasing-credits/) - [Saving credits](/docs/saving-credits/) --- # Integrations overview Source: https://pagefork.ai/docs/integrations-overview/ Description: How to add analytics, pixels, embeds, chat widgets, and other third-party tools to a PageFork site. Group: Integrations A PageFork site is a regular static HTML site, so almost anything a normal website can do with client-side code — analytics, pixels, iframe embeds, chat widgets, external payment links — drops in cleanly. This group walks through the most common integrations. If the one you need isn't listed, the same pattern works for anything that ships with an HTML snippet. ## What you can integrate Anything that runs **client-side in the browser**: - JavaScript snippets (analytics, pixels, tag managers, heatmaps). - `