# 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-07-31T13:22:44.980Z --- ## Documentation # AI image generation Source: https://pagefork.ai/docs/ai-image-generation/ Description: Generate custom images — standalone in the Images workspace or inline while editing a site. Group: Media PageFork can generate custom images when stock photos aren't enough — illustrations, product mockups, brand-specific art, or hero visuals that match your prompt. Generated images are saved to your [media library](/docs/media-library/) and cost credits based on quality and output size. ## The Images workspace Open **Media → Images** in the sidebar. The page has three parts: - **Thread list** — each thread is a separate conversation. Click **+** next to **Threads** to start a new one, switch between threads, or delete old ones. - **Message history** — your prompts and the images PageFork generated. - **Composer** — describe what you want and click **Generate**. Before generating, choose **Quality** and **Ratio** in the controls at the top: | Setting | Options | | --- | --- | | **Quality** | Low, Medium (default), High | | **Ratio** | 1:1 (square), 3:2 (landscape), 2:3 (portrait) | Each completed image shows its quality, ratio, and **credits used**. Click an image to open the full-size file in a new tab. Your credit balance appears below the composer. When you're out of credits, generation is blocked until you [purchase more](/docs/purchasing-credits/). ## Credit cost Image generation uses the same credit balance as site edits. Cost depends on how much the model produces — higher quality and larger aspect ratios use more credits. Typical ranges (actual cost is shown on each generated image): - **Low quality** — about 1 credit. - **Medium quality** — about 2 credits. - **High quality** — about 7 credits. A minimum charge of 1 credit applies to every generation. Failed generations that consumed credits are refunded automatically, same as site edits. See [Credits explained](/docs/credits-explained/). ## Generate images while editing a site You can also enable image generation inside the site editor so PageFork can create custom visuals during an edit — for example, "add a hero image of a minimalist coffee shop interior." 1. Open a site in the editor. 2. Click **+** below the chat composer. 3. Toggle **Create Image** on. The setting is remembered per site (stored in your browser). While enabled, PageFork can call its image tool when your prompt needs a custom visual. It still prefers stock photos from Pexels for generic photography; custom generation is for visuals stock libraries can't provide. Each image the agent generates during an edit costs credits separately and is saved to your media library. ## When to use Images vs. chat uploads | Goal | Best approach | | --- | --- | | Explore several image ideas in one session | **Images** workspace (threaded history) | | Generate and place an image in one edit | Enable **Create Image** in the site editor | | Use your own logo, photo, or PDF | [Upload or pick from library](/docs/reference-images/) | | Generic stock photography | Ask PageFork in chat — it searches Pexels automatically | ## Tips for better results - Be specific: subject, style, composition, lighting, and mood. - Match ratio to placement — 3:2 for hero banners, 1:1 for icons or cards, 2:3 for mobile-first portraits. - Start with **Medium** quality while iterating; switch to **High** for the final asset. - After generating, attach the image URL in a site edit: "Use this as the hero background" with the file from your library. ## Next - [Media library](/docs/media-library/) - [File uploads](/docs/reference-images/) - [Saving credits](/docs/saving-credits/) --- # 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 Updated: 2026-07-31 > Every published site already has [built-in > analytics](/docs/built-in-analytics/) — pageviews, form conversions, > and top pages, with no account and usually no consent banner. Add a > tool below when you need something it doesn't cover, such as funnels, > demographics, or ad-platform conversion tracking. 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. > Most analytics beyond the privacy-first options (Plausible, Fathom, > Simple Analytics) require consent in the EU/UK. When you add those > tools, PageFork enables its [built-in cookie consent > modal](/docs/cookie-consent-and-privacy/) and gates the scripts until > the visitor accepts. ## 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** — the built-in cookie modal (or a third-party banner) gates analytics until the visitor accepts. Test in an incognito window: reject should block, accept should fire. See [Cookie consent and privacy](/docs/cookie-consent-and-privacy/). ## 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/) --- # Built-in analytics Source: https://pagefork.ai/docs/built-in-analytics/ Description: Traffic and form conversion numbers for every published PageFork site, with no third-party account and usually no cookie banner. Group: Integrations Updated: 2026-07-31 Every published PageFork site collects its own traffic and conversion numbers. There's nothing to install, no account to create, and no tracking script to paste — it's on by default once the site is live. Open **Analytics** in the sidebar and pick a site. ## What you get - **Pageviews** — how many pages were viewed. - **Conversions** — form submissions counted as conversions. - **Submits / pageviews** — your conversion rate. - **Pageviews by day** — the trend over the selected window. - **Top pages** — which paths get traffic, and how many submits each produced. Choose a window of **7, 30, or 90 days**. ## What counts as a conversion A form submission. Any form PageFork generated counts automatically, so "views → leads" is meaningful from the first day without configuring a goal. Conversions attribute to the page the form was on, not the page a visitor lands on afterwards — so a form that redirects to a thank-you page still credits the page that did the work. ## What isn't counted - **Preview traffic.** Views inside the editor preview and shared preview links are excluded, so your own work doesn't inflate the numbers. - **Unpublished sites.** Collection starts when a site is live. If a number looks lower than another tool reports, this is usually why — along with ad blockers, which affect every analytics tool including this one. ## Privacy and cookie consent Built-in analytics is **cookieless** and first-party: the beacon goes to PageFork, not to a third-party ad network, and no cookie is set to follow visitors between sites. In practice that puts it in the same category as Plausible or Fathom, which usually do **not** require a consent banner. PageFork does not turn on the [cookie consent modal](/docs/cookie-consent-and-privacy/) for built-in analytics alone — it turns it on when you add cookie-setting tools like GA4 or Meta Pixel. Cookieless is not the same as "no data processing", though. If you publish a privacy policy, mention that you collect aggregate traffic statistics. If your jurisdiction or your legal advice is stricter than the norm, follow that. ## Built-in vs Google Analytics Built-in analytics answers "is the site getting traffic, and are forms converting?" That's the question most PageFork sites need answered. Add [GA4 or another tool](/docs/analytics-and-tracking/) when you need what it doesn't do: funnels and multi-step journeys, audience demographics, ad-platform conversion tracking for paid campaigns, cross-domain tracking, or custom event taxonomies. Running both is fine. Their numbers will never match exactly — different tools filter bots, count sessions, and get blocked differently. Use one as your reference and treat the other as a cross-check. ## Next - [Analytics and tracking](/docs/analytics-and-tracking/) - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) - [Designing for conversion](/docs/designing-for-conversion/) - [Submissions inbox](/docs/submissions-inbox/) --- # 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 Updated: 2026-07-23 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. When > the widget sets cookies, PageFork enables the > [built-in consent modal](/docs/cookie-consent-and-privacy/). ## 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/) --- # Connecting Zapier, Make, and n8n Source: https://pagefork.ai/docs/connecting-zapier-make-n8n/ Description: Route PageFork form submissions into Google Sheets, HubSpot, Slack, or anything else, without writing code. Group: Forms Updated: 2026-07-31 A [webhook destination](/docs/webhook-destinations/) can point at an automation tool instead of your own server. That's the no-code route to a thousand other apps: Google Sheets, HubSpot, Salesforce, Airtable, Mailchimp, Slack, Notion. The setup is the same in all three tools: 1. Create a webhook trigger in the automation tool and copy its URL. 2. Add a PageFork destination pointing at that URL. 3. Send a sample so the tool learns your field names. 4. Map the fields and turn the automation on. ## Before you start: send a real submission Every one of these tools builds its field mapping from the first request it receives. Whatever it sees, it treats as the shape of your data. So make the first request a real one. **Publish your site and submit the form yourself once.** PageFork's **Send test** also carries your real field names and works fine, but a genuine submission additionally proves the whole path — endpoint, spam checks, queue, delivery — in one go. Either way, the field names your automation sees are the ones your form actually uses. PageFork refuses to send a test at all rather than invent placeholder names, precisely because a wrong mapping here fails silently later. ## Zapier 1. Create a Zap and choose **Webhooks by Zapier** → **Catch Hook** as the trigger. 2. Copy the custom webhook URL Zapier gives you. 3. In PageFork: **Forms** → **Destinations** → **Add destination**, paste the URL, pick the form, save. 4. Submit your form once, then click **Test trigger** in Zapier. 5. Add your action step and map fields from `data__submission__fields__*` — Zapier flattens nested JSON with double underscores, so `email` appears as `data__submission__fields__email`. **Webhooks by Zapier is a premium app** and needs a paid Zapier plan. Make and n8n both offer webhooks on their free tiers if that's a blocker. Zapier's Catch Hook does not verify signatures. That's fine — the URL is secret and unguessable — but it means the `X-PageFork-Signature` header goes unused on this path. ## Make 1. Add a **Custom webhook** trigger to a scenario and copy its address. 2. Create the PageFork destination pointing at it. 3. Click **Re-determine data structure** in Make, then submit your form. 4. Map fields from the nested structure Make derives — it preserves the nesting, so you'll drill into `data` → `submission` → `fields`. Custom webhooks are available on Make's free tier. ## n8n 1. Add a **Webhook** node, method `POST`, and copy the production URL. 2. Create the PageFork destination pointing at it. 3. Submit your form to capture a sample. 4. Continue your workflow from `data.submission.fields`. n8n is the one tool here that can **verify the signature**, since you can run a Code node. If you do: - Enable the **raw body** option on the Webhook node. Verification hashes the exact bytes PageFork signed, and n8n's parsed-and-re-serialised JSON will not match. - Follow the HMAC example in [Webhook destinations](/docs/webhook-destinations/#verifying-the-signature). **Self-hosted n8n needs a public HTTPS address.** PageFork refuses to deliver to private or loopback addresses, so an instance on your LAN, a `localhost` address, or a private VPN address will be rejected when you save the destination. Put it behind a real domain or a tunnel. n8n Cloud works out of the box. ## Choosing between them | | Zapier | Make | n8n | |---|---|---|---| | Webhooks on free tier | No | Yes | Yes | | App library | Largest | Large | Growing | | Can verify signatures | Not practically | Awkward | Yes | | Self-hosting | No | No | Yes | Zapier has the widest app catalogue; Make is the easiest to try at no cost; n8n suits you if you're technical or want to self-host. ## Troubleshooting **The automation fires but every field is empty.** The tool learned its mapping from a different payload shape than it's now receiving. Re-capture the sample and re-map — this is what the "send a real submission first" step prevents. **Nothing arrives at all.** Check the delivery log under the destination in PageFork. A `dead` status with a `4xx` means the tool rejected the request; a timeout means it took longer than 15 seconds to respond. **It worked, then stopped.** Check whether the destination auto-disabled. Fifty consecutive failures turn it off; re-enable it after fixing the receiver. **Duplicate rows.** Retries can deliver the same submission twice. Use `X-PageFork-Idempotency-Key`, which stays stable across attempts, to deduplicate. ## Next - [Webhook destinations](/docs/webhook-destinations/) - [Forms not receiving](/docs/forms-not-receiving/) - [Embeds and iframes](/docs/embeds-and-iframes/) --- # Cookie consent and privacy Source: https://pagefork.ai/docs/cookie-consent-and-privacy/ Description: Enable PageFork’s built-in cookie consent modal, gate tracking scripts, and add privacy pages. Group: Integrations Updated: 2026-07-23 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 ships a built-in consent modal on every site — off by default, and turned on when you add non-essential tracking or ask for a banner. > 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). - No tracking at all. ## Built-in consent modal (recommended) Every PageFork site includes a native cookie preference modal. It stays **disabled** until you need it. Ask in chat — PageFork enables the modal, themes it to your site, gates tracking scripts until the visitor accepts, and adds `/cookies` and `/privacy` pages when needed: ``` Add Google Analytics 4 to the whole site. Measurement ID: G-ABC12345. ``` ``` Add a cookie consent banner and privacy pages. No analytics yet. ``` ``` Enable the cookie banner, match it to the site colours, and put a "Cookie preferences" link in the footer. ``` When you add analytics, pixels, GTM, or cookie-setting chat widgets, PageFork enables the modal automatically and wires consent gating — you usually do not need a separate prompt. ### What you get - Equal-weight **Accept** and **Reject** choices (no sneaky pre-ticked analytics/marketing categories). - Categories for necessary, functional, analytics, and marketing cookies. - **Google Consent Mode v2** defaults (denied until the visitor accepts) when you add GA4 / gtag / GTM. - Tracking scripts that only run after the matching category is allowed. - Links from the modal to your cookie and privacy policy pages. - A footer control to reopen preferences later. ### Localize the banner On a non-English site, ask PageFork to match the banner language to the rest of the site: ``` Translate the cookie banner and the /cookies and /privacy pages into German to match the site. ``` ## 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). PageFork creates starter `/privacy` and `/cookies` pages when the native modal is enabled. For denser legal copy, tools like **Termly**, **iubenda**, and **FreePrivacyPolicy.com** generate policies you can paste in: ``` Replace the /privacy page with this policy text: (paste the generated policy here) ``` ## Testing After enabling 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 that GA4, Meta, and similar tools do not fire (or only send “default denied” consent pings). 4. Click **Accept all** — the pings should now fire. 5. Verify consent persists across pages but resets after clearing cookies. 6. Open **Cookie preferences** from the footer and confirm visitors can change their mind. ## 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. These stay in the “strictly necessary” category. ## Third-party consent managers (optional) If you already use CookieYes, Cookiebot, Termly, Osano, Klaro!, or similar, you can still paste their snippet instead of the built-in modal. Tell PageFork which manager you use and to skip the native one: ``` Add Cookiebot to every page. CBID: abc-123-def. Do not enable the built-in PageFork cookie banner. ``` ``` Wire Cookiebot to automatically block GA4, Meta Pixel, and Intercom until the visitor accepts analytics and marketing cookies. ``` For most sites, the built-in modal is enough. ## 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”). If you use a third-party manager, enable GPC in their dashboard. For the built-in modal, ask PageFork if you need GPC-specific behaviour for your jurisdiction. ## 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 Updated: 2026-07-21 **PageFork's core concepts are sites (projects), pages (URLs), versions (snapshots of every edit), credits (the unit of AI work), model tiers (Standard / Advanced / Premium), 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 Every message goes through the same composer. PageFork decides per message whether to: - **Answer** — reply in chat without changing the site. - **Edit** — generate a new version of the site. Both consume credits, but answers are usually cheaper because PageFork doesn't rewrite your site. See [Questions and edits](/docs/edit-vs-discuss/). ## Credit A **credit** is the unit of AI usage. Each generation, edit, question, or retry consumes credits based on how much the AI has to think and write. You buy credits in packs. See [Credits explained](/docs/credits-explained/). ## Model tier A **model tier** is the quality level for an AI run: **Standard**, **Advanced**, or **Premium**. You pick it in the composer before generating or editing. Higher tiers usually produce stronger results and cost more credits. See [Model tiers](/docs/model-tiers/). ## 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 Updated: 2026-07-23 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 change request). - **Asking questions** about a site (usually cheaper than edits — PageFork reads and responds without rewriting). - **Retrying** a failed generation. - **Generating AI images** — on the Images page or when **Create Image** is enabled in the site editor. See [AI image generation](/docs/ai-image-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. - Browsing or uploading files in the [media library](/docs/media-library/) (without generating images). ## How pricing is calculated Cost is based on how much work the AI does — specifically, the number of tokens read and written — and on the **[model tier](/docs/model-tiers/)** you selected for that run. Tokens are a measure of text the AI processes. For reference on **Standard** (the default): - A short question 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. ### Model tier multipliers Higher tiers use a richer model and convert tokens to credits at a higher rate: | Tier | Relative cost vs Standard | | --- | --- | | **Standard** | Baseline | | **Advanced** | About **2.5×** | | **Premium** | About **5×** | Very large prompts (over ~272K input tokens in a single model call) also apply a long-context surcharge of about **1.75×** on that call’s tokens. Pick the tier in the composer before you generate or send. See [Model tiers](/docs/model-tiers/) for when to use each. **Image generation** is priced separately from site edits — cost scales with output quality and size, not with the site model tier. Low quality is typically about 1 credit, medium about 2, and high about 7. The exact charge appears on each generated image. ## 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 - [Model tiers](/docs/model-tiers/) - [Media library](/docs/media-library/) - [AI image generation](/docs/ai-image-generation/) - [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. - **Media → Library** — browse, upload, and manage files shared across your organization. See [Media library](/docs/media-library/). - **Media → Images** — generate custom AI images in threaded conversations. See [AI image generation](/docs/ai-image-generation/). - **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 Updated: 2026-07-31 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. Send converters to a thank-you page A form that just swaps the button for "Thanks!" wastes your best moment — the one point where someone has already said yes. Ask for a dedicated thank-you page and PageFork will build the route and redirect to it on success: ``` Add a thank-you page after the contact form and send people there when they submit. ``` A thank-you page gives you somewhere to set expectations ("we reply within one working day"), offer the obvious next step, and — because it has its own URL — a clean conversion to measure in [built-in analytics](/docs/built-in-analytics/). Keep secondary forms, like a footer newsletter, confirming in place. Redirecting someone away from the page they were reading to celebrate an email signup costs you the read. Thank-you pages are automatically excluded from search results, so they never show up as a landing page in Google. See [SEO basics](/docs/seo-basics/). ## 6. 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." ## 7. 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." ## 8. 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 - [SEO basics](/docs/seo-basics/) - [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/) --- # Questions and edits Source: https://pagefork.ai/docs/edit-vs-discuss/ Description: How PageFork decides when to answer in chat and when to change your site. Group: Editing PageFork uses a single chat composer for everything — questions, brainstorming, and site changes. There is no mode switch. PageFork reads your message and decides what to do. ## Questions and advice When you ask a question or want feedback, PageFork replies in chat without touching your 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 this 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?" ## Change requests When you ask for a specific change, PageFork edits your site. It will: - Read the relevant pages. - Plan the change. - Write updated code. - Produce a new version that appears in the preview. Every change creates a new version. Undo rolls it back without losing your chat history. Use this 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." ## How PageFork chooses PageFork looks at the latest message only: - **Question or advice** → reply in chat, don't modify files. - **Change request** (including block references from Select mode) → edit the site. - **Unclear intent** → PageFork usually answers first rather than editing. If you want a change but get only a reply, follow up with a more direct instruction: "Apply option 2 to the hero headline." ## Credits Both kinds of messages consume [credits](/docs/credits-explained/), but questions are usually cheaper because PageFork doesn't rewrite your site — it just reads and responds. When you're exploring ideas, ask first and edit once you've picked a direction. ## Which should I use? | Situation | What to type | |--|--| | Clear, specific change | A direct instruction ("Make the hero darker") | | Generate options to choose from | A question ("Give me three headline options") | | "What should I do about X?" | A question | | Apply the option you just picked | A direct instruction ("Use headline option 2") | | Fixing a small issue | A direct instruction | | Exploring a big structural change | Ask first, then instruct | ## 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 Updated: 2026-07-23 **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. ## Model tier Before you send, check the **model tier** pill in the composer. **Standard** is enough for most edits; use **Advanced** or **Premium** when the brief is harder and you're willing to spend more credits. See [Model tiers](/docs/model-tiers/). ## When to reference - **Live website**: paste a public URL to modernize, redesign, or match structure — PageFork inspects the real pages. See [Reference websites](/docs/reference-websites/). - **Brand / structural reference**: "Match the tone of brand X" or "Use a hero similar to Stripe's docs landing" (include a URL if public). - **Image or file reference**: attach a screenshot, logo, or PDF. See [File uploads](/docs/reference-images/). ## Chat language PageFork replies in the **language of your latest message**. Site copy is separate — if the page is in German but you write in English, chat stays in English unless you ask to rewrite the site. --- # Email notifications Source: https://pagefork.ai/docs/email-notifications/ Description: Get an email for every form submission you receive. Group: Forms Updated: 2026-07-31 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/) - [Webhook destinations](/docs/webhook-destinations/) --- # 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 `