# 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-10-21T13:43:37.688Z --- ## Documentation # Adding leads by hand Source: https://pagefork.ai/docs/adding-leads-by-hand/ Description: Add a lead for someone who called, walked in or was referred to you, and learn how hand-added leads differ from form leads. Group: Leads Updated: 2026-09-30 Not every lead fills in a form. People call, walk in, get referred by a friend or message you on social media. Add them with **New lead** so they sit in the same pipeline as everyone else. > Adding leads is a **Pro** feature. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Adding a lead 1. Open **Leads** in the sidebar and pick the site the lead belongs to. 2. Click **New lead**. 3. Fill in what you know and click **Add lead**. The lead is created in the first open stage of your [pipeline](/docs/lead-pipeline/), and its page opens so you can carry on working. | Field | Notes | |---|---| | **Name**, **Email**, **Phone** | Enter at least one of the three | | **How did they reach you?** | The channel: **Phone**, **Walk-in**, **Referral**, **Email**, **Social** or **Other**. Phone is preselected | | **Company** | Optional | | **Note** | Optional. It becomes the first note on the lead | | **Follow-up** | Optional date. It creates a task called "Follow up" due that day | | **More fields** | Your [custom fields](/docs/custom-fields/), if the site has any | If you leave name, email and phone all empty, you're asked to "Enter at least a name, an email or a phone number". An email or phone number that doesn't look valid is refused as well. A brand-new site with no leads shows an **Add your first lead** button that opens the same dialog. ## What a hand-added lead looks like It works like any other lead: you can move it between stages, assign it, log calls and add follow-ups. Two things mark where it came from: - **Source** is **Added by hand**, followed by the channel you chose, for example "Added by hand · Referral". You'll see it in the **Lead** panel, and you can filter the list by source. - It has no form submission in its timeline, because there wasn't one. ## When the person already exists PageFork checks the **email address** you typed against the people already on the site. **If the email belongs to someone you already have**, the dialog says "This person exists." Choose: - **Add a new lead for them** to create the lead on the existing person. Their record is kept as it is. The name and company you typed are not applied, but any custom fields you filled in are saved to the person. - **Back** to change what you typed. **If that person already has an open lead**, the dialog says "They already have an open lead." A person can only have one open lead at a time, so click **Open their lead** and continue there instead of creating a second one. If the existing person was archived, adding a lead for them restores them. > Only the email is checked here. If you add someone by phone number > alone and they're already on the site, you get a second person. > When two people share a phone number, the lead page shows a banner > where you can [merge the duplicates](/docs/merging-duplicates/). ### Starting from the person's page You can also begin from the person. Open them from the **People** view and click **New lead**. The dialog is titled "New lead for" and their name, and skips the name, email and phone boxes because it already knows who the lead is for. The button only appears when the person has no open lead. If they have one, it reads **Open lead** instead. ## Other ways leads get created | Source | How | |---|---| | **Form** | A visitor submits a form on your site. This is the usual way | | **Added by hand** | The **New lead** dialog described above | | **Import** | A CSV import can optionally create a lead for each person. See [Importing people](/docs/importing-people/) | | **API** | The PageFork apps for [Zapier](/docs/zapier-app/) and [Make](/docs/make-app/) can create leads from another tool | Leads created from Zapier or Make follow the same matching as forms: if the person is already on the site and has an open lead, no second lead is created for them. ## Hand-added leads and automations This is the rule to remember: **A lead that didn't come from a form submission never triggers destinations or Zapier and Make triggers.** [Destinations](/docs/destinations-overview/) send a form submission to your other tools. A lead added by hand, imported or created through Zapier or Make has no submission to send, so: - Nothing fires when the lead is created. - Nothing fires when you move it to another stage, even if a destination is set to fire on that stage. One thing follows from how leads work: if that person later submits a form on your site, the submission is attached to their open lead. From then on the lead carries a submission, and stage changes can trigger destinations like on any form lead. ## Good to know **I can't see the New lead button.** Pick a single site in the site dropdown. The button isn't shown for **All sites** or on a Basic site. **I added a lead for the wrong site.** Leads can't be moved between sites. Add the lead again on the right site. **The follow-up I set has no owner.** A follow-up created from this dialog starts unassigned. Open the lead and give it to someone in the **Follow-ups** panel. ## Next - [The lead page](/docs/lead-record/) - [Follow-ups and tasks](/docs/follow-ups-and-tasks/) - [Importing people](/docs/importing-people/) - [Merging duplicates](/docs/merging-duplicates/) --- # 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 Updated: 2026-08-07 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 mainly on the quality setting you choose. ## 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 draws on the same credit balance as site edits, but it's priced on its own terms: what you pay tracks how much the image model produces, not the [model tier](/docs/model-tiers/) you use for site edits. **Quality is the setting that moves the number.** Typical cost per image: | Quality | 1:1 | 3:2 and 2:3 | |---|---|---| | **Low** | ~1 credit | ~1 credit | | **Medium** | ~2 credits | ~2 credits | | **High** | ~7 credits | ~6 credits | Ratio barely matters, and not in the direction you'd guess: **1:1 is the most expensive of the three**, despite being the smallest on screen. Square images are generated at a resolution that costs the model slightly more than the wide and tall crops, so switching to 3:2 to save credits does roughly nothing. Pick the ratio that suits the placement and control cost with **Quality** instead. The exact charge appears on every generated image — treat the table as a guide, not a quote. A minimum of 1 credit applies to each generation, and 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, then re-run the prompt you settled on at **High** for the final asset. Iterating at High is the main way people overspend here — roughly 3½× per attempt for detail you're about to throw away. - 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-10-02 > Every published site already has [built-in > analytics](/docs/built-in-analytics/) — pageviews, form conversions, > top pages and traffic sources, with no account and usually no consent > banner. Its dashboard is part of the **Pro** plan. 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/) --- # API keys Source: https://pagefork.ai/docs/api-keys/ Description: Create the key that lets Zapier and Make act on your PageFork team, and revoke it when you no longer need it. Group: Destinations Updated: 2026-09-30 An **API key** is a password for apps. The PageFork apps on [Zapier](/docs/zapier-app/) and [Make](/docs/make-app/) use one to prove they are allowed to read your sites and forms, listen for new leads, and create leads for you. You only need a key if you use Zapier or Make. Every other [destination](/docs/destinations-overview/) is set up inside PageFork and needs no key. > API keys are part of the **Pro** plan: the things a key can do all > require a Pro site. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Creating a key 1. Open the **Team** page. 2. Find **API keys** and click **Create key**. 3. Give it a name that says where it will be used, such as "Zapier" or "Make". 4. Click **Create**. 5. **Copy the key now.** It starts with `pfk_` and is shown exactly once. PageFork stores only a scrambled fingerprint of it, so nobody, including PageFork, can show it to you again. 6. Paste it into Zapier or Make when it asks for your PageFork API key. Lost the key before pasting it? Revoke it and create another. It takes ten seconds. ## Who can create keys Team **owners and admins**. Members can't see or create keys. ## What a key can do A key acts for your **whole team**, across all of its sites. With it, an app can: - See the names of your sites, their forms, their custom fields and their pipeline stages, so it can offer them in dropdowns. - Subscribe to **new form submissions** and **lead stage changes**. - **Create leads**. - Look up a lead by its id. A key cannot log in to PageFork, change your site, edit or delete leads, change billing, or manage your team. Treat it like a password anyway. Anyone holding it can add leads to your pipeline and receive your new submissions. ## One key per tool Create a separate key for each tool. The list shows each key's name, its first characters, when it was created and when it was **last used**, so with one key per tool you can tell at a glance which connection is active, and you can switch one off without breaking the other. A team can have up to **5** keys. ## Revoking a key 1. On the **Team** page, find the key under **API keys**. 2. Click **Revoke** and confirm. Revoking takes effect immediately: - The key stops working. Any Zap or scenario using it fails until you give it a new key. - **Every connection that key created is removed.** The "Managed by Zapier" and "Managed by Make" entries under your site's destinations disappear, and PageFork stops sending leads to those Zaps and scenarios. To reconnect afterwards, create a new key, paste it into the tool, and switch your Zaps or scenarios off and on again so they subscribe afresh. ### When a key stops working by itself A key belongs to the person who created it. If that person leaves the team, or is no longer an owner or admin, their keys stop working. Have a current owner or admin create a replacement. ## Keeping keys safe - Paste a key only into the official PageFork app on Zapier or Make. - Don't put keys in emails, chat messages, screenshots or documents. - If a key might have been seen by someone it shouldn't, revoke it and create a new one. There is no downside to rotating. ## Troubleshooting **The tool says "Invalid API key".** The key was revoked, mistyped, or its creator left the team. Create a new key and reconnect. **The tool shows a "pro_required" error.** The site you picked is on Basic. Zapier and Make need a Pro site. **The tool says too many requests.** A key is limited to a generous number of requests per minute. A Zap or scenario stuck in a loop can hit it. It clears by itself within a minute once the loop stops. **"Maximum of 5 API keys".** Revoke a key you no longer use. ## Next - [Zapier](/docs/zapier-app/) - [Make](/docs/make-app/) - [Team and roles](/docs/team-and-roles/) - [Destinations overview](/docs/destinations-overview/) --- # Basic and Pro plans Source: https://pagefork.ai/docs/basic-and-pro-plans/ Description: What each site plan costs and includes, how the Pro trial works, and how to start, change or cancel a plan. Group: Billing Updated: 2026-10-02 A **site plan** is what puts a PageFork site on the internet. You pick one per site and pay monthly or yearly while the site is live. There are two: **Basic** is a fast website with a contact form. **Pro** adds the tools for working the leads that website brings in. | | **Basic** | **Pro** | |---|---|---| | Price per site | €5/month · €50/year | €14/month · €140/year | | Hosting on a global CDN, custom domain, SSL | Yes | Yes | | Publishing, versions, visual edits | Yes | Yes | | AI editing with your [credits](/docs/credits-explained/) | Yes | Yes | | Forms that capture every submission | Yes | Yes | | [Submissions list](/docs/submissions-inbox/) with read and unread, CSV export | Yes | Yes | | New-submission [notification email](/docs/email-notifications/) | Yes | Yes | | Site source export | Yes | Yes | | Storage for the [media library](/docs/media-library/#storage-allowance) | +500 MB / 500 files | +2 GB / 2000 files | | [Leads](/docs/leads-overview/): pipeline, board, list, calendar | | Yes | | [People](/docs/people/), custom fields, tags, import, merge | | Yes | | Notes, calls, follow-ups and lead owners | | Yes | | [Booking dates](/docs/booking-dates/) and corrections | | Yes | | [Destinations](/docs/destinations-overview/): Google Sheets, email, Kit, Mailchimp, webhooks | | Yes | | [API keys](/docs/api-keys/), [Zapier](/docs/zapier-app/) and [Make](/docs/make-app/) | | Yes | | [Analytics dashboard](/docs/built-in-analytics/) | | Yes | | "Built with PageFork" footer | Shown | Removed | Yearly billing gives you two months free. AI credits are separate from plans and shared by all your sites: see [Credits explained](/docs/credits-explained/). ## Plans are per site Plans belong to a site, not to your account. One team can have a Basic site and a Pro site side by side, and there are no seat fees. Unpublished drafts cost nothing to keep, and you can share any of them for free with a [preview link](/docs/preview-links/). You pay only for the sites that are live. ## The Pro trial Every new site starts with a **14-day Pro trial**. You get the full Pro feature set from the first day, so you can see your leads in a pipeline and connect your tools before deciding. When the trial ends, the site keeps the plan you chose. If that's Basic, or the site has no plan yet, the Pro features lock, and nothing is lost: see below. ## Your data is never gated This is the rule behind both plans: **PageFork gates features, never data.** - **Forms always capture.** A submission is saved on every plan, at any volume. A Basic site never drops a lead. - **Leads are built in the background on every plan.** Each submission still creates the person and the lead behind the scenes. A Basic site simply doesn't show the pipeline. - **Analytics keep counting on every plan.** Only the dashboard is a Pro feature. So upgrading is instant. The moment a site becomes Pro, its pipeline and its analytics are already full of history. ## The "Built with PageFork" footer Basic sites show a small **Built with PageFork** credit at the bottom of every page. Pro removes it. The footer is added when the site is published, and PageFork republishes the site for you when its plan changes, so it appears or disappears on its own. ## Starting a plan 1. Open the site in the editor. 2. Click **Publish** in the toolbar, or open **Settings → Domain**. 3. Choose **yearly** or **monthly**, then **Basic** or **Pro**. 4. Pay in Stripe Checkout. 5. [Connect your domain](/docs/connecting-your-domain/). Once it's verified, click **Publish**. A site goes live only on a domain you own; see [Publishing overview](/docs/publishing-overview/). ## Changing plans Open **Billing → Subscriptions** and choose **⋯ → Change plan** on the site's row, or use **Upgrade to Pro** / **Change plan** in the site's **Settings → Domain**. - **Upgrades** (Basic to Pro, or monthly to yearly) apply **immediately**. Stripe charges the prorated difference for the rest of the current period today. - **Downgrades** (Pro to Basic, or yearly to monthly) are scheduled for the **end of the current period**. You keep what you paid for until then, and the plan row shows the date the switch happens. Click **Keep Pro** (or **Keep current plan**) any time before that to undo it. If an upgrade payment fails, nothing changes: the site stays on its current plan and you can try again with another card. ## Moving from Pro to Basic When a site moves to Basic, whether because the trial ended, you downgraded, or a payment lapsed: - **Nothing is deleted.** People, leads, stages, notes, follow-ups, custom fields and analytics history are all kept. - **The Pro screens lock** and show an **Upgrade to Pro** button in their place. You keep the submissions list, read and unread, CSV export and the notification email. - **Destinations stop sending.** They keep their settings and their on/off state, but nothing is delivered while the site is on Basic. This includes Zapier and Make. - **The footer appears** on the published site. When the site returns to Pro, everything unlocks exactly as you left it. Destinations start sending again for **new** activity. Submissions that arrived while the site was on Basic are in your leads, but they are not sent to your destinations afterwards. ## Cancelling Choose **⋯ → Cancel subscription** on the Subscriptions tab. The site stays live until the end of the period you've paid for. After that it is unpublished and its custom domain is released. Click **Keep subscription** any time before then to stay live. Cancelling deletes nothing. Versions, submissions, leads and media all stay, and you can keep editing the site and sharing it by [preview link](/docs/preview-links/). Start a plan again and republish to bring it back. Within 14 days of paying for a new plan, an upgrade or a yearly renewal, you can ask for that payment back at support@pagefork.ai, and we refund it in full. See [Refunds](/terms/#refunds) in our terms. ## Managing your plans The **Subscriptions** tab on the Billing page lists every site plan with its tier, billing cycle, renewal or end date, and any scheduled change. Its **Payments** view has the invoice for every charge. **Payment methods & invoices** opens the Stripe portal, where you update your card and billing details. Plans are changed and cancelled here in PageFork; the portal can't switch plans. See [Managing billing in Stripe](/docs/managing-billing-in-stripe/). ## Plans from before Basic and Pro Sites subscribed to the earlier single hosting plan keep their price and renew as before. They appear as **Basic · legacy** and have the Basic feature set. Upgrading one to Pro works like any other upgrade: it applies now and you pay the prorated difference. ## What a plan doesn't include - **AI credits.** Credits are bought separately: see [Purchasing credits](/docs/purchasing-credits/). - **Email hosting** for your domain. PageFork hosts websites, not mailboxes. ## Questions **Do I need Pro to receive form submissions?** No. Every plan captures and emails you every submission. **Can one team mix plans?** Yes. Each site has its own plan. **Will I lose leads if I downgrade?** No. They are kept and reappear when the site is Pro again. **I downgraded but still see Pro.** Downgrades apply at the end of the current period. The plan row on the Subscriptions tab shows the date. **My Zap stopped working.** Check the site's plan. Zapier, Make and every other destination need the site to be on Pro. ## Next - [Credits explained](/docs/credits-explained/) - [Publishing overview](/docs/publishing-overview/) - [Leads overview](/docs/leads-overview/) - [Invoices and payments](/docs/invoices-and-payments/) --- # Board view Source: https://pagefork.ai/docs/board-view/ Description: Work your leads as a board with one column per stage. Drag a card to move it forward or to reorder it. Group: Leads Updated: 2026-09-30 The **Board** shows your pipeline as columns, one per [stage](/docs/lead-pipeline/), with each lead as a card in the column it currently belongs to. > The board is a **Pro** feature. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). Open **Leads** in the sidebar and click the **Board** tab. It's the view the Leads page opens on by default. ## Pick a site first The board shows one site at a time, because each site has its own pipeline. Choose the site in the dropdown above the board. PageFork remembers your choice for next time. ## What's on a card | On the card | Meaning | |---|---| | A coloured dot before the name | The lead has a submission nobody has opened yet | | Name | The person's name. If there is no name, their email or phone is shown instead | | Email or phone | Shown under the name when the person has a name | | Priority | **Low**, **Medium** or **High**. Hidden when the priority is **None** | | A number | The lead's value, if one was entered | | **Due** and a date | The earliest open [follow-up](/docs/follow-ups-and-tasks/) on the lead | | A page icon with a number | How many form submissions the lead holds | | A name at the end | The lead's owner | Click a card to open the [lead page](/docs/lead-record/). ## Moving a lead to another stage **Drag a card** into another column and drop it. The stage changes immediately, exactly as if you had clicked the stage on the lead page. Because it's a real stage change, it also: - Adds a "moved the lead" entry to the lead's timeline. - Triggers any [destination](/docs/destinations-overview/) that is set to fire on the stage the lead just entered. If a move can't be saved, the card goes back to where it was and you see "Failed to move lead". One move is refused on purpose: dragging a **closed** lead back into an open stage while that person already has another open lead. A person can only have one open lead at a time, so PageFork says "This person already has another open lead" and offers **Open it** to jump to it. ## Ordering cards inside a column You can also drag a card up or down **within** its column. The order is saved and is the same for everyone on your team, so you can keep the leads you want to deal with first at the top. Two things put a card at the top of a column on their own: - A brand-new lead arrives. - A lead's stage is changed without dragging, for example from the lead page or with a bulk action in the list. ## Column counts and loading more Each column header shows how many cards it has. When a column holds more cards than are loaded, you see two numbers, such as `20 / 63`: 20 shown out of 63 in the stage. Columns load **20 leads at a time**. Click **Load more** at the bottom of a column for the next 20. An empty column says **Drag leads here**. ## Show closed By default the board shows only your **open** stages. Won and lost leads are finished, so their columns are hidden. Click **Show closed** in the filter bar to add the won and lost columns. With them visible you can: - Drag a card into a won or lost column to close the lead. - Drag a closed card back into an open column to reopen it. Closing a lead by dragging doesn't ask for a lost reason. To record one, use the **Lost** button on the lead page instead. Reopening follows the one-open-lead rule: if the person already has another open lead, the card snaps back. See [Reopening a lead](/docs/lead-pipeline/#reopening-a-lead). ## Filters on the board The filter bar above the board narrows which cards are shown: search, priority, owner, source, form, custom field filters and **Unread**. They work the same way as in the list and are described in [Leads list and filters](/docs/leads-list-and-filters/). Two filters are missing on purpose: - **Stage.** The columns already are the stages. - **Archived.** Leads of archived people never appear on the board. Find them in the **List** view with **Archived** turned on. You can save a filtered board as a [saved view](/docs/leads-list-and-filters/#saved-views). ## Editing stages from the board Owners and admins can click the settings icon at the right end of the filter bar and choose **Edit stages** to add, rename, recolour, reorder or delete columns. See [Lead pipeline](/docs/lead-pipeline/). ## Exporting what you see **Export CSV** on the board downloads the leads the board is showing. Your search, priority, owner, source, form, field and **Unread** filters carry over, and so does **Show closed**. See [CSV export](/docs/csv-export/). ## On a phone Columns sit side by side and you swipe sideways to move between them. The filters collapse into a single **Filters** button next to the search box. ## Good to know **A card I expected isn't there.** Check the filter bar for an active filter, then check whether the lead is closed (turn on **Show closed**) or the person is archived (look in the **List** view with **Archived** on). **A card won't move back to an open column.** The person already has another open lead. Open that lead instead, or close it first. **Someone submitted a second form but there's no new card.** That's expected. The submission was attached to their existing open lead, which is now marked unread. ## Next - [Lead pipeline](/docs/lead-pipeline/) - [The lead page](/docs/lead-record/) - [Leads list and filters](/docs/leads-list-and-filters/) - [Lead calendar](/docs/lead-calendar/) --- # Booking dates Source: https://pagefork.ai/docs/booking-dates/ Description: Tell PageFork which form field holds an appointment date, so bookings show up on the calendar. Group: Leads Updated: 2026-09-30 If your form asks visitors to pick a date, such as a consultation, a viewing or a table reservation, PageFork can put those appointments on the [Bookings calendar](/docs/lead-calendar/). It needs to be told which field to read. To PageFork, a field called `preferred_date` arrives as plain text like any other answer. Nothing in a form says "this one is a date", or which timezone it's in. > Setting up booking dates and the calendar are **Pro** features. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Setting it up Open the site in the editor, go to the **Forms** tab and scroll to **Booking dates**. 1. Choose the **Form**. 2. Choose the **Date field**, the field that holds the appointment. 3. Choose the **Value format**. 4. Check the **Timezone**. 5. Set the **Appointment length (minutes)**. 6. Click **Save mapping**. | Setting | What it means | |---|---| | **Form** | Which form on this site | | **Date field** | The field holding the appointment date | | **Value format** | **Date only** (`2026-08-05`) or **Date and time** (`2026-08-05T14:30`) | | **Timezone** | The timezone the value should be read in | | **Appointment length (minutes)** | How long each booking is drawn on the calendar. From 5 to 1440, and 60 if you leave it alone | Each form has **one** mapping. Saving again for the same form replaces the earlier one. Remove a mapping with the bin icon next to it. ### If the form or field isn't in the list The dropdowns only offer forms and fields PageFork already knows about. It learns them when your site is built and from real submissions. If the panel says "No form fields are known yet", publish the site and submit the form once yourself. See [Form field schemas](/docs/form-field-schemas/). ## Value format Pick the format that matches what your form sends. | Format | Use it when | How it's read | |---|---|---| | **Date only** | The form has a date picker with no time | As that day. Any time in the value is ignored | | **Date and time** | The form has a date and time picker | As that exact date and time. A value with no time is read as midnight | PageFork reads dates written year first: `2026-08-05`, optionally followed by a time such as `2026-08-05T14:30` or `2026-08-05 14:30`. That's what browser date pickers send. Dates typed another way, such as `05/08/2026`, can't be read. So use a real date picker in your form rather than a free-text box. If you're not sure what your form sends, open a submission and look at the value. ## Timezone Date fields carry **no timezone**. `2026-08-05T14:30` doesn't say which 2:30 pm it is. So bookings are read in the timezone you set here, which should be the **business's** timezone, not the visitor's. A restaurant in Lisbon taking a booking from someone in Tokyo means a table at 8 pm Lisbon time. The box is filled in with your own timezone. To change it, type a timezone name in the *Region/City* style, for example `Europe/Budapest` or `America/New_York`. An unknown name is refused when you save. On the calendar, each team member sees bookings converted to their own timezone. ## Appointment length A form captures one moment, not a start and an end. This setting only controls how long the block is drawn in the calendar's week view. It doesn't reserve time or prevent double bookings. ## Checking that it works A mapping can be saved correctly and still read nothing, for example when it points at a free-text field. An empty calendar would look exactly the same as having no bookings. So each saved mapping shows a health line under it. PageFork looks at the most recent submissions of that form, up to 300, and tries to read the field in each one. | Message | Meaning | |---|---| | Reads cleanly on all N recent submissions with a value. | Working | | N of the last M submissions couldn't be read as a date. | Mostly working. Some values are wrong | | None of the last M submissions could be read as a date. Check that this is the date field, and that visitors pick a date rather than type one. | The wrong field, or visitors type dates as free text instead of using a date picker | | None of the last M submissions filled this field in. | Right field? It may be optional and always skipped | | No submissions on this form yet. | Nothing to check yet | If there's a problem when you save, the same message pops up straight away. The mapping is still saved. ### "N of the last M submissions couldn't be read as a date" This is the one you'll see most often. It means most values are fine, but a few visitors sent something that isn't a real date. The usual causes: - **Free text.** The field accepts typing, and someone wrote "next Tuesday" or "05/08/2026". - **A date that doesn't exist.** February 31, April 31, or month 13. - **A time that doesn't exist.** Hour 25, or minute 60. Two details make the number fair: - **Blank values aren't counted.** A visitor who skipped an optional date field isn't an error, so they count neither as readable nor as unreadable. - **Corrected values count.** If you [correct](/docs/correcting-submission-data/) a bad date on a submission, the corrected value is the one that's checked, and the count goes down. A submission with an unreadable date is never rejected. The lead is created as usual. It just has no booking on the calendar. ## Fixing a booking on one submission When a visitor picked the wrong day, or typed something unreadable: 1. Open the lead and expand the submission in the timeline. 2. Click the pencil next to the date field. 3. Enter the date in the same style, for example `2026-08-05` or `2026-08-05T14:30`, and save. The booking moves to the new date on the calendar. If you change the value to something that can't be read, the booking is removed from the calendar. ## Existing submissions Once a mapping is saved, **new** submissions land on the calendar straight away. Submissions that arrived *before* the mapping existed are not re-read automatically, so they don't appear. The same goes for changing a mapping's field, format or timezone: bookings already on the calendar stay where they were read originally. Removing a mapping stops new bookings from being read. Bookings already on the calendar stay. ## Where bookings show up - On the [calendar](/docs/lead-calendar/) in **Bookings** mode. - On the submission in the lead's timeline, as **Books** and the date. - In the submissions list on a Basic site, in a **Booking** column. ## Bookings still not showing Work down this list: 1. **Is a mapping saved for that form?** The panel lists them. 2. **What does the health line say?** A warning there names the problem. 3. **Are you in Bookings mode?** The calendar opens on **Follow-ups**. 4. **Are you looking at the right dates?** Appointments are usually in the future. Step forward a month. 5. **Was the submission sent before the mapping was saved?** See [Existing submissions](#existing-submissions). 6. **Is the person archived?** Bookings of archived people are hidden. ## Next - [Lead calendar](/docs/lead-calendar/) - [Correcting submitted data](/docs/correcting-submission-data/) - [Form field schemas](/docs/form-field-schemas/) --- # Built-in analytics Source: https://pagefork.ai/docs/built-in-analytics/ Description: Traffic, traffic sources and form conversion numbers for every published PageFork site, with no third-party account and usually no cookie banner. Group: Integrations Updated: 2026-10-02 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. > The analytics dashboard is a **Pro** feature. On a Basic site > collection keeps running, so the full history is there the moment the > site moves to Pro. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## What you get Four numbers across the top: | Metric | Means | |---|---| | **Pageviews** | How many pages were viewed | | **Sum of daily uniques** | Unique visitors, added up per day — see below | | **Conversions** | Form submissions | | **Submits / pageviews** | Conversions divided by pageviews | Then **Pageviews by day** (hover a bar for the exact count), **Top pages** — each path with its views and the submits it produced — and **Top sources**, where those visits came from, with a switch between sources, mediums, and campaigns. Choose a window of **7, 30, or 90 days**. Days are counted in **UTC**, so a late-evening visit may land on the next day's bar depending on your timezone. ### "Sum of daily uniques" is not a range unique This is the one number people misread, so it's labelled literally. PageFork counts unique visitors **per day** and adds those daily figures together. Someone who visits on Monday, Tuesday, and Wednesday counts **three times** over a 7-day window, not once. That makes it a good measure of *repeat engagement* and a poor one for "how many different people saw my site". Deduplicating across a range would mean tracking individuals across days, which is exactly what cookieless analytics avoids. If you need true range-uniques, that's a reason to add [a third-party tool](/docs/analytics-and-tracking/). ### The conversion rate is site-wide **Submits / pageviews** is the raw ratio across the whole site, with every pageview in the denominator. That matters if your form redirects to a thank-you page. A visitor who converts generates an *extra* pageview, so the site-wide ratio reads **lower** than the conversion rate of the page that actually did the work. For the number you probably want, read **Top pages** — it shows views and submits per path, so you can see how the landing page itself performs. ## Turning collection on and off Collection is **on by default** for every published site, and the Analytics page shows its state with an **Enable / Disable analytics** button next to it. Disabling stops collection for that site from that moment. Data already collected is kept and stays visible — turning it off is not a delete. Turn it back on and collection resumes, leaving a gap for the period it was off. This is per site, so you can run analytics on your live marketing site and leave it off on a client draft. ## Nothing appears until you publish Analytics only exists for published sites. Select a site with no published version and the page says so, with a link into the editor, rather than showing an empty chart you'd have to interpret. ## 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. In **Top sources** the same submissions are counted against the source the visitor arrived from, which is the "which channel actually produces leads?" number. First arrival within the visit, not last: someone who lands from a search result and then clicks around before filling in the form still counts against the search engine. That memory lasts as long as the browser tab. Someone who closes the tab and comes back the next day starts a new visit, so a form they submit then is credited to however they arrived that time — typing your address counts as `(direct)`. Attribution that follows a person across days needs a cookie or a stored identifier, which is exactly what this does not do. ## 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. - **Sites with collection disabled**, for the period it was off. 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. ## How sources are counted A **source** is where a visit started: the `utm_source` on the link if there is one, otherwise the site that linked to you, otherwise `(direct)` — someone typing your address, a bookmark, or a link from an app that passes no referrer. The numbers in this card are **entries**, not pageviews. Only the first page of a visit is attributed, so clicking around your site doesn't add to any source. Entries are therefore never higher than the Pageviews number above — and on a single-page site, where most visits are one pageview, the two are usually about the same. **Medium** is the kind of link, not the site: `referral` for an ordinary link from another site, whatever you put in `utm_medium` (`email`, `cpc`, `social`) when the link carries one, and `(none)` for a direct arrival. Values in brackets — `(direct)`, `(none)` — are labels PageFork generates rather than anything a visitor sent, so they're shown greyed out. A site with an unusually wide spread of sources in one day (hundreds of distinct referrers, which in practice means referrer spam) has the tail collected into `(other)` rather than storing every one. Campaign links work the way they do everywhere else: add `?utm_source=newsletter&utm_medium=email&utm_campaign=spring` to a link and it shows up under those labels. Campaign parameters win over the referring site, so an ad click credits the campaign rather than the ad network's redirect domain. Labels are lowercased before they're counted, so `Spring` and `spring` are the same campaign rather than two rows that each tell half the story. Countries and devices are still **not** broken out. If you need those, [add a tool that does it](/docs/analytics-and-tracking/) alongside — the two run happily together. Sources come from the analytics script that ships inside your site, so they need a site built with the current version of it. Sites generated from now on include it automatically. A site generated before this feature existed keeps the script it was built with — it carries on reporting pageviews and conversions as usual, but its Top sources card stays empty, and republishing on its own does not change that. ## 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. Traffic sources are counted in aggregate. Only the *hostname* of a referring site is kept — never the page, the path, or anything in its query string — and campaign labels are stored as daily totals, never against a visitor. So that a form submission can be credited to the source the visitor arrived from, the source labels for the current visit are held in the browser's `sessionStorage` for the lifetime of the tab. That's the labels only — no identifier, nothing that can follow anyone between sites — and the browser discards it when the tab closes. 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: de-duplicated visitor counts across a date range, 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. ## Sharing a view The site and window are in the address bar, so a particular view can be bookmarked or sent to a colleague: - `/analytics?siteId=abc` — a specific site. - `/analytics?siteId=abc&days=90` — that site over 90 days. ## Next - [Analytics and tracking](/docs/analytics-and-tracking/) - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) - [Designing for conversion](/docs/designing-for-conversion/) - [Leads overview](/docs/leads-overview/) --- # 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 Updated: 2026-10-02 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, open **Settings → Domain**. 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 — it stays > live on any other custom domains still attached. > > **You can't remove the last domain of a published site.** PageFork > refuses with *"Unpublish the site before removing its last custom > domain"*, because there's no `pagefork.ai` address for it to fall back > to — the site would have nowhere to serve from. [Unpublish > it](/docs/unpublishing/) first, then remove the domain. ## 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. Cancelling a site's plan does the same for you at the end of the period you've paid for: the site is unpublished and its custom domain released. See [Basic and Pro plans](/docs/basic-and-pro-plans/#cancelling). ## 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/) --- # Clarifying questions Source: https://pagefork.ai/docs/clarifying-questions/ Description: When your brief leaves something important open, PageFork asks before it builds instead of guessing. Group: Editing Sometimes PageFork will stop and **ask you a question** instead of building straight away. You'll see it in the chat as a small panel with a question and a few options to click. This is deliberate. A quick answer costs you a few seconds; a whole site built on a wrong guess costs a rebuild. ## Answering Click one of the **options** and PageFork carries on with that answer. The option's label is sent back as your reply, so it appears in the conversation like any message you typed. You can also **type your own answer** in the box instead, if none of the options fit. Say whatever you'd have said in a normal message — you're not limited to the choices. Once answered, the question panel **collapses** and marks which option you chose. Expand it again any time to see what was asked. Only the **most recent unanswered** question accepts input. Older ones are history. ## When you'll see questions **Creating a new site — often.** This is where a wrong guess is expensive, so PageFork leans towards asking one question at the very start, before writing any files. Expect it when your brief leaves open: - Facts it would otherwise have to invent — business name, location or service area, contact details, existing brand colours. - A major direction — is the site primarily for **taking bookings** or **showcasing work**? What overall style? One page or several? It asks **one** question, folding in the single most important gap, and usually marks the option it would have assumed anyway — so clicking the default is always a reasonable move. **Editing an existing site — rarely.** Most edit requests just get done. PageFork only asks when a request is genuinely ambiguous in a way that changes the outcome: conflicting instructions, missing essential content, or two very different plausible readings. It won't ask you to confirm work it can already do, or to settle minor styling choices. ## It never asks mid-build Once PageFork has started creating your site, it won't stop to ask anything. A question at that point would leave you with a half-built site, so instead it finishes with sensible assumptions and you adjust afterwards. That's the normal way to work anyway — see [Iterate in small steps](/docs/iterate-in-small-steps/). ## Avoiding questions altogether If you'd rather not be asked, put the answers in your brief. A prompt that already names the business, the goal, and the style gives PageFork nothing to ask about. [Writing great prompts](/docs/writing-great-prompts/) covers what's worth including. ## Next - [Writing great prompts](/docs/writing-great-prompts/) - [Edit vs discuss](/docs/edit-vs-discuss/) - [Iterate in small steps](/docs/iterate-in-small-steps/) --- # 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 Updated: 2026-10-02 **To connect a custom domain to PageFork, open your site's Settings → Domain, 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 a plan (Basic or Pro) 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 settings In the editor, click **Settings** in the toolbar and open the **Domain** tab. The **Custom Domain** section is where you add a domain you own. Custom domains require a **plan** for this site. If it doesn't have one yet, the same tab shows **Choose a plan** above the domain section: pick Basic or Pro, monthly or yearly, and pay in Stripe Checkout. See [Basic and Pro plans](/docs/basic-and-pro-plans/). > A verified custom domain isn't just for vanity — it's a > **prerequisite for publishing at all**. There's no `*.pagefork.ai` > fallback address. Until a domain here reads **Active**, Publish will > refuse to run. To share the site meanwhile, use a > [preview link](/docs/preview-links/). ## 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/) --- # Webhooks with n8n and other tools Source: https://pagefork.ai/docs/connecting-zapier-make-n8n/ Description: Send PageFork leads to n8n, or to Zapier and Make through a plain webhook, when the native apps are not the right fit. Group: Destinations Updated: 2026-09-30 For Zapier and Make, start with the native apps: the [PageFork Zapier app](/docs/zapier-app/) and the [PageFork Make app](/docs/make-app/). They connect with an API key, offer your sites and forms as dropdowns, hand you clean field names, and can also create leads in PageFork. This page covers the other route: pointing a [webhook destination](/docs/webhook-destinations/) at an automation tool's own webhook address. Use it when: - You use **n8n**, which has no PageFork app. - You use another tool that can receive a webhook. - You want the raw, signed payload in Zapier or Make rather than the native app's tidied fields. > Webhook destinations are part of the **Pro** plan. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). The setup is the same in every tool: 1. Create a webhook trigger in the automation tool and copy its URL. 2. Add a PageFork webhook 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, through a plain webhook The [native Zapier app](/docs/zapier-app/) is easier and doesn't need a paid Zapier plan. If you still want the webhook route: 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, open the site's **Settings** → **Forms** → **Destinations**, click **Add**, choose **Webhook**, paste the URL, pick the form, and 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. The native PageFork app does not. 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, through a plain webhook The [native Make app](/docs/make-app/) is the simpler path. For the webhook route: 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 a route | | Native Zapier app | Native Make app | Plain webhook | |---|---|---|---| | Setup | API key, then dropdowns | API key, then dropdowns | Copy and paste a URL | | Field names | Clean, top level | Clean, in a Fields collection | Nested in the raw payload | | Can create leads in PageFork | Yes | Yes | No | | Works with n8n and other tools | No | No | Yes | | Signature you can verify | No | No | Yes | ## 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 - [Zapier](/docs/zapier-app/) - [Make](/docs/make-app/) - [Webhook destinations](/docs/webhook-destinations/) - [Forms not receiving](/docs/forms-not-receiving/) --- # 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 site plans. Group: Getting Started Updated: 2026-10-02 **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 site plans (Basic or Pro, per site, monthly or yearly). 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, they never expire, and one balance is shared by every site in your team. New accounts start with 25 free credits. See [Credits explained](/docs/credits-explained/). ## Auto top-up **Auto top-up** is an optional setting under **Billing → Credits**. You pick a pack and a threshold; when your balance drops below it, PageFork buys that pack with your saved card — at most twice per calendar month. See [Auto top-up](/docs/purchasing-credits/#auto-top-up). ## 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/). ## Site plan A **site plan** is what puts a site on the internet. Each site has its own plan, billed monthly or yearly, and one team can mix plans across its sites: - **Basic** (€5/month or €50/year) — hosting on your own domain with SSL, publishing, forms, the submissions list with CSV export, and notification emails. - **Pro** (€14/month or €140/year) — everything in Basic, plus leads, people, destinations, Zapier and Make, and the analytics dashboard. Without a plan for a site, you can still edit it and share it by [preview link](/docs/preview-links/) — you just can't publish it to a live URL. Unpublished drafts cost nothing to keep. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Pro trial Every new site starts with a **14-day Pro trial**: the full Pro feature set from day one. When it ends, a site without a Pro plan has Basic features. Nothing is deleted — forms keep capturing, and leads and analytics keep building in the background, ready the moment the site is upgraded. ## "Built with PageFork" footer Published **Basic** sites show a small **Built with PageFork** credit at the bottom of every page. **Pro** removes it. ## Storage allowance Files you upload to the [media library](/docs/media-library/) count towards your team's **storage allowance**: 100 MB or 100 files free, plus 500 MB / 500 files for each Basic site and 2 GB / 2000 files for each Pro site. When it's full, new uploads are refused until you delete files or add or upgrade a plan — nothing is ever deleted for you. See [Storage allowance](/docs/media-library/#storage-allowance). ## Preview link A **preview link** is a private URL that shows your current draft to anyone you send it to — no account, no domain, no plan. It's how you share work before going live, and it's free. See [Preview links](/docs/preview-links/). ## Custom domain A **custom domain** is a domain you own (like `acme.com`) that you point at your PageFork site. It requires a plan for the site and a quick DNS setup. SSL is automatic. See [Connecting your domain](/docs/connecting-your-domain/). A custom domain isn't optional: **a site goes live on your own domain or not at all.** PageFork doesn't host finished sites on a shared `pagefork.ai` address. ## The lifecycle, visually ``` prompt/template │ ▼ version 1 ──edit──▶ version 2 ──edit──▶ version 3 … │ │ preview │ ▼ publish link ◀─────┘ live at (free, any version) acme.com (your own domain) ``` 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. --- # Correcting submitted data Source: https://pagefork.ai/docs/correcting-submission-data/ Description: Fix a typo in a submitted value without losing what the visitor originally sent, and see how the fix reaches the person. Group: Leads Updated: 2026-09-30 Visitors mistype their own details. They write "jhon@" instead of "john@", leave the phone field blank and give you the number on the call, or pick the wrong day for an appointment. You can **correct any submitted value** on the lead, and PageFork keeps the original. > Corrections are a **Pro** feature. On a Basic site submitted values > are read-only. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Making a correction 1. Open the [lead page](/docs/lead-record/). 2. In the timeline, click the submission card to expand it. Every field the visitor sent is listed. 3. Click the **pencil** next to the field's name. 4. Edit the value. 5. Click **Save**. **Cancel** or Escape leaves the value as it was. Long values, and values with line breaks, open in a larger box. Fields the visitor left **blank** are listed too, shown as a dash, so you can fill them in after a phone call. You can only correct fields the submission **already has**. Corrections fix values. They don't add new fields to a form. ## The original is never overwritten A correction is stored **on top of** what the visitor sent. The original submission is kept exactly as it arrived. That's what makes corrections safe. Any [destination](/docs/destinations-overview/) that already received this submission received the original. Rewriting it afterwards would leave PageFork and your other tools quietly disagreeing about what the visitor said. **Correcting a value doesn't re-send anything.** If another tool already has the wrong email, fix it there too. ## How a correction reaches the person A submission is a record of what was sent. The **person** is the record your team actually works with. When you correct a submission, PageFork carries the fix over to the person where that's clearly what you meant. **Name, email, phone and company.** If the corrected field is the one PageFork read the person's name, email, phone or company from, the person is updated as well, as long as their current value is **still the one from the submission** or empty. **Custom fields.** If the corrected field feeds one of the person's [custom fields](/docs/custom-fields/), that field is updated under the same rule. **Details someone has edited are left alone.** If a teammate has already changed the person's phone number by hand to something else, correcting the old submission doesn't overwrite their edit. An example. A visitor submits `jhon@example.com`, and the person is created with that email. | You do | Submission shows | Person's email | |---|---|---| | Correct the submission to `john@example.com` | `john@example.com` | `john@example.com` | | Edit the person's email by hand to `j.smith@example.com`, then correct the submission | `john@example.com` | `j.smith@example.com`, unchanged | Two more details: - Clearing an identity value in a submission doesn't blank the person's name, email, phone or company. Remove those on the person directly if you need to. - Clearing a value that feeds a custom field does clear that custom field, under the same "still the submitted value" rule. ### When the corrected email belongs to someone else If you correct an email to an address that **another person on the site already has**, the correction is refused and nothing is changed. Moving a submission from one person to another isn't something a typo fix should do silently. If the two really are the same person, [merge them](/docs/merging-duplicates/) instead. ## What a correction changes | Place | Shows | |---|---| | The submission card on the lead | The corrected value | | The submission's preview line | Rebuilt from the corrected values | | The person's details | Updated when the rules above apply | | The [calendar](/docs/lead-calendar/) | The booking moves if you corrected the form's booking date field | | [CSV export](/docs/csv-export/) | The person's details, so the fix is included once the person is updated | | Destinations that already received it | The original. Nothing is re-sent | | The lead's timeline | Both, old value → new value | ### Correcting a booking date If the field you correct is the form's [booking date](/docs/booking-dates/) field, the appointment is re-read from the new value and moves on the calendar. Enter it the way the form sends it, for example `2026-08-05` or `2026-08-05T14:30`. A value that can't be read as a date removes the booking from the calendar. ## The trail Every correction is recorded in the lead's timeline as "corrected", with the field name, the old value, the new value, who did it and when. Long values are shortened there. When the correction also updated the person, a second line records that too, for example "changed Email". So the original is never lost from view. It's one scroll away. ## Good to know **Can I undo a correction?** Correct the field again and type the original value back. Both changes stay in the timeline. **The person didn't update.** Their current value was different from what the submission originally said, so PageFork treated it as a deliberate edit and left it. Change the person's details directly in the **Person** panel. **Saving did nothing.** The value you entered is the same as the current one, so there was nothing to correct. ## Next - [The lead page](/docs/lead-record/) - [People](/docs/people/) - [Booking dates](/docs/booking-dates/) - [CSV export](/docs/csv-export/) --- # 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-10-04 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 [site plans](/docs/basic-and-pro-plans/): you can build and edit sites on credits alone, and a plan doesn't include any credits. Your balance belongs to your team and is shared by all your sites. Every new account starts with **25 free credits**. ## 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, and the model tier above does **not** apply to it. Cost is driven almost entirely by the **quality** setting: low is typically about 1 credit, medium about 2, and high about 7. Aspect ratio makes little difference. The exact charge appears on each generated image — see [AI image generation](/docs/ai-image-generation/). ## Seeing your balance Your credit balance is shown: - On the **Billing** page (→ Credits tab). - On the **Credits** tile of the [dashboard](/docs/dashboard-tour/). - 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 creating a new site. ## Getting more Credits come in one-time packs: **100 for €10, 300 for €25, 750 for €50, or 2000 for €100**. Bigger packs cost less per credit. To never run dry mid-edit, turn on **auto top-up**, which buys a pack for you when your balance drops below a threshold. See [Purchasing credits](/docs/purchasing-credits/). ## 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. Changed your mind about a pack? Within 14 days of buying it, email support@pagefork.ai and we refund the credits you haven't used. See [Refunds](/terms/#refunds) in our terms. ## 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/) - [Basic and Pro plans](/docs/basic-and-pro-plans/) - [Insufficient credits](/docs/insufficient-credits/) --- # CSV export Source: https://pagefork.ai/docs/csv-export/ Description: Download your leads as a CSV file from the board, list or calendar, with your filters applied. Group: Leads Updated: 2026-09-30 To get your leads into a spreadsheet, another CRM or an email tool, use **Export CSV**. What you get depends on the site's plan: - On a **Pro** site the file has **one row per lead**, with the person's details and where the lead stands. - On a **Basic** site the file has **one row per form submission**, with the answers the visitor gave. See [Basic and Pro plans](/docs/basic-and-pro-plans/) for the difference between the plans. ## Exporting leads (Pro) 1. Open **Leads** in the sidebar and pick a **site**. 2. Go to the **Board**, **List** or **Calendar** view. 3. Set any filters you want. 4. Click **Export CSV**. On a phone it's under the **…** button. A file named `leads.csv` downloads straight away. A site is required. There is no export across all sites, and the **People** view has no **Export CSV** button. ### Which leads are included The export follows the view you clicked it from. | From | Included | |---|---| | **List** | Exactly the leads your filters show: search, stage, priority, owner, source, form, custom fields, **Unread**, **Show closed** and **Archived** all apply | | **Board** | The leads the board shows. All filters apply, including **Show closed**. There is no stage or archived filter on the board, so none is applied | | **Calendar** | All open leads on the site. The calendar has no filters, so none are applied | It's the whole filtered set, not just the page or the cards currently loaded on screen. Two defaults are easy to miss: - **Closed leads are left out** unless **Show closed** is on. To export your won deals, turn on **Show closed** in the list and filter the stage to **Won**. - **Archived people are left out** unless **Archived** is on in the list, in which case you get *only* archived people's leads. ### What's in the file Rows are ordered by last activity, most recent first. | Column | Contents | |---|---| | `Created` | When the lead was created, as a date and time in UTC | | `Source` | `form`, `manual` (added by hand), `api` or `import` | | `Channel` | For hand-added leads: `phone`, `walk_in`, `referral`, `email`, `social` or `other` | | `Form` | The form that created the lead, if any | | `Name`, `Email`, `Phone`, `Company` | The person's details | | `Stage` | The stage's name | | `Priority` | `none`, `low`, `medium` or `high` | | `Assignee` | The owner's name. Blank if unassigned | | `Due` | The earliest open follow-up date, as `2026-08-05` | | `Value` | The lead's value with two decimals, such as `1200.00` | | `Closed` | When the lead was won or lost. Blank while it's open | | `Lost reason` | The reason entered when it was marked lost | | `Tags` | The person's tags, separated by semicolons | | `Submissions` | How many form submissions the lead holds | | `Last activity` | When the lead last changed | After these come your [custom fields](/docs/custom-fields/), one column each. Only fields that are set to **show in list view** and aren't hidden are included. That's the setting on the field itself, shared by your team, not the columns you personally ticked in the list. ### What's not in the file The leads export describes **leads and people**. It doesn't contain the raw answers of each form submission, notes, logged calls or follow-up titles. Form answers still reach the file when they're stored on the person: name, email, phone and company, plus any form field that became a custom field. Because the file uses the person's details, a value you [corrected](/docs/correcting-submission-data/) shows up corrected once the person has been updated. ## Exporting submissions (Basic) 1. Open **Leads** in the sidebar and pick a **site**. 2. Optionally choose one form, or turn on **Unread**. 3. Click **Export CSV**. Leave the form dropdown on **All forms** to get every form on the site in one file. | Column | Contents | |---|---| | `Received` | When the submission arrived, as a date and time in UTC | | `Form` | Which form it came from | | `Booking` | The appointment the visitor picked, if the form has a [booking date](/docs/booking-dates/) | | `Read` | `true` or `false` | | One column per form field | The visitor's answers | Rows are ordered newest first. With **All forms**, the field columns are the combined fields of all the site's forms. The file is named after the form, such as `contact-submissions.csv`, or `all-forms-submissions.csv` when no form is selected. ## Very large exports An export is capped at **25,000 rows**. Past that, the file holds the first 25,000 and **says so in its own name**, because a download has no screen to show a warning on: - A leads export is named `leads-first-25000-of-more.csv`. - A submissions export ends in `-first-25000-of-more.csv`. If you hit the cap, narrow the filters and export in slices, for example one stage or one form at a time. ## Opening the file - **Google Sheets**: **File → Import → Upload**, separator "Comma". - **Excel**: open it directly, or use **Data → From Text/CSV** for control over column types, especially dates. - **Other CRMs and email tools**: most accept a CSV and let you match columns on import. Files are UTF-8. If accented characters look wrong, which is common in older Excel on Windows, import through **Data → From Text/CSV** and pick UTF-8. Values are quoted where needed, so commas and line breaks inside a value don't break the columns. ## Good to know **A value starts with an apostrophe.** Text that begins with `=`, `+`, `-` or `@` gets a leading `'` so a spreadsheet shows it as text instead of running it as a formula. Plain negative numbers are left alone. **My closed leads are missing.** Turn on **Show closed** before exporting. **Exporting every week gives overlapping rows.** Each export is a snapshot of what matches your filters, not "what's new since last time". There is no ID column, so remove duplicates in your spreadsheet using `Email` together with `Created`. **I want leads to flow into a spreadsheet automatically.** Use a [destination](/docs/destinations-overview/) such as Google Sheets instead of exporting by hand. ## Next - [Leads list and filters](/docs/leads-list-and-filters/) - [Custom fields](/docs/custom-fields/) - [Destinations](/docs/destinations-overview/) --- # Custom fields Source: https://pagefork.ai/docs/custom-fields/ Description: Keep extra details on each person — budget, event date, service wanted — picked up from your forms or added by hand. Group: Leads Updated: 2026-09-30 Every [person](/docs/people/) has four built-in details: name, email, phone and company. **Custom fields** hold everything else you want to know about them — budget, preferred date, party size, how they heard about you. Fields are set up **per site**. Each site has its own list. > Editing fields is a **Pro** feature. See [Basic and Pro > plans](/docs/basic-and-pro-plans/). ## Three kinds of field Open the fields editor and each field carries a small caption saying where it came from: | Caption | What it is | |---|---| | **Built-in** | Name, Email, Phone, Company. Always there. | | **From form** | Picked up automatically from a form on your site. The caption also shows the form's own field name. | | **Custom** | Added by you, in the editor or during a CSV import. | ## Fields from your forms You don't have to set anything up. When you publish a site, PageFork reads its forms and creates a field for each input that isn't a name, email, phone or company. It uses the label visitors see on the form, and picks a matching type — a date picker becomes a **Date** field, a dropdown becomes a **Select** field with the same options, a checkbox becomes **Yes/No**. If a submission later arrives with a field PageFork hasn't seen, a **Text** field is created for it on the spot, named after the form field. Tracking and technical values are ignored and never become fields: anything starting with `utm_`, click IDs from ad platforms, and captcha responses. See [Form field schemas](/docs/form-field-schemas/) for how form inputs map to a person's details. ## Field types | Type | Holds | Edited with | |---|---|---| | **Text** | Any text | A text box | | **Number** | A number | A number box | | **Date** | A calendar date | A date picker | | **Select** | One choice from a list you define | A dropdown | | **Yes/No** | Yes, no, or not set | A dropdown | | **URL** | A web address, shown as a clickable link | A text box | ## Editing a value On a person page or a lead record, click a field's value to change it. Press Enter to save, Escape to cancel. **Select** and **Yes/No** fields save as soon as you pick. Choose **—** or clear the box to empty a field. A value that doesn't fit the type — letters in a number field, say — is rejected with a message naming the field. Each change is recorded on the person's timeline with the old and new value and who made it. ## The fields editor Owners and admins can change the field list. Members can edit values but don't see the editor. Open it with **Edit fields** — at the top of a person's details, or from the **View settings** button in the Leads **List** view. | To | Do this | |---|---| | Rename a field | Type a new label. Built-in fields can be renamed too. | | Change its type | Pick from the type dropdown. Built-in fields keep their type. | | Set Select options | Type them in the box under the field, separated by commas. | | Reorder | Drag a field, or use the up and down arrows. | | Show it as a list column | Turn on the **Show in list** toggle. Built-in fields don't have one. | | Hide it | Click the **Hide field** icon (an eye with a line through it). | | Bring it back | Find it under **Hidden** and click **Unhide**. | | Add a new one | Click **Add field**, then give it a label and type. | Nothing changes until you click **Save**. ### Hiding instead of deleting There is no delete. **Hide field** hides a field: it disappears from person pages, list columns and the import mapping, but every value stored in it is kept. **Unhide** brings the field and its data straight back. Built-in fields can't be hidden. A field you've just added and not yet saved can be removed outright. ### Changing a field's type When you change a type, PageFork re-reads every stored value as the new type. Values that make sense convert — the text `42` becomes the number 42, `yes` becomes Yes. Values that don't convert are **left exactly as they were**, so nothing is lost; they just stay as text until someone edits them. For a **Select** field, a stored value that isn't one of the options still shows on the person, as an extra choice in the dropdown. ### Show in list Custom fields with **Show in list** on are added as columns in the Leads [List view](/docs/leads-list-and-filters/) and as columns in the [CSV export](/docs/csv-export/). In the List view you can still switch any field's column on or off for yourself from **View settings**. ## How values get filled in **From a form submission.** When a submission arrives for a person, each field that is **empty** on the person is filled from the matching form field. Fields that already have a value are left alone — a later submission never overwrites them. If a submitted value doesn't fit the field's type, it is stored as the text the visitor typed rather than dropped. **From a correction.** If you [correct a submission](/docs/correcting-submission-data/), the person's field follows the correction — but only if it still held the old submitted value, or was empty. A value someone has since changed by hand is left alone. **From an import, Zapier or Make.** Same rule as forms: empty fields are filled, existing values are kept. **By hand.** Editing on the person or lead always takes effect. ## Limits - **40** fields discovered from forms per site, hidden ones included. Past that, new form fields are no longer turned into fields (the submission itself still stores everything). - **40** fields added by hand or by import per site. **Add field** switches off when you reach it. Fields discovered from forms don't count towards this limit. - Labels up to **60** characters. - Values up to **5,000** characters. - **Select** fields: up to **50** options, **100** characters each, and at least one. ## Good to know **A form field isn't showing on the person.** It may have been treated as the name, email, phone or company, or ignored as a tracking value. Or the site has reached 40 form fields. **The same information shows twice under different names.** A form field was renamed, so PageFork sees two different fields. Hide the old one. **A field is missing from the import mapping.** Hidden fields aren't offered as import targets. Unhide it first. ## Next - [People](/docs/people/) - [Form field schemas](/docs/form-field-schemas/) - [Importing people](/docs/importing-people/) - [Leads list and filters](/docs/leads-list-and-filters/) --- # Dashboard tour Source: https://pagefork.ai/docs/dashboard-tour/ Description: Find your way around the dashboard, the sidebar, and All Sites. Group: Getting Started Updated: 2026-10-04 Once you're signed in, you land on the **Dashboard**: what needs your attention, how your sites are doing, and the sites you were last working on. The left sidebar takes you everywhere else. ## The dashboard Click the PageFork logo at the top of the sidebar to come back here at any time. Until you have a site, the dashboard shows the box where you describe your first one instead. ### Needs your attention A short list of things worth acting on, most urgent first. Each row names the site and has a button that takes you where you can fix it. | Row | What it means | Button | |---|---|---| | **Follow-ups are overdue** | A site has open [follow-ups](/docs/follow-ups-and-tasks/) whose due date has passed. Pro only. | **View follow-ups** opens that site's leads, earliest due first | | **Generation failed** | The last build stopped before it finished. | **Open site** | | **Publish failed** | Your latest changes never went live. | **Open site** | | **Payment problem** | A site plan's payment didn't go through. | **Open billing** | | **Generation cancelled** | The site was left half-built. | **Open site** | | **Unpublished changes** | You've edited a live site since you last published it. | **Publish** | | **Not published yet** | The site has never been published. When several sites are drafts, they're grouped into one row. | **Open site** or **View sites** | The list shows at most four urgent rows, plus the drafts row. When nothing needs you, the section is hidden. ### At a glance Tiles with your key numbers. Click any tile to open the page behind it. - **Pageviews, last 30 days** — total visits across your Pro sites that have [analytics](/docs/built-in-analytics/) turned on, compared with the 30 days before, with a small daily chart. Shown when at least one such site exists. - **Unread leads** — new [leads](/docs/leads-overview/) nobody has opened yet. - **Due today** — follow-ups due today across your sites. Opens the [lead calendar](/docs/lead-calendar/). Pro only. - **Credits** — your [credit](/docs/credits-explained/) balance. - **Storage** — how much of your [media library allowance](/docs/media-library/#storage-allowance) you've used. ### Continue building Your six most recently edited sites, each marked **Live**, **Draft** or **Generating**. Click one to open its editor, or **All sites** for the full list. ### Starting a new site Click **Create new site** at the top of the dashboard or in the sidebar. You get the same box as on your first visit: describe the site, or pick a [template](/docs/from-a-template/). If you signed up from a prompt on pagefork.ai and the site couldn't be started, for example because you ran out of credits, the dashboard shows a banner explaining why, with a **Try again** button. ## The sidebar - **PageFork logo (top)** — returns to the dashboard. - **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. - **Create new site** — opens the box where you describe a new site or pick a template. - **Leads** — every lead across your sites. An unread count appears as a badge when new leads arrive. - **Analytics** — traffic for your Pro sites. See [Built-in analytics](/docs/built-in-analytics/). - **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. **Billing** has two tabs: **Credits** (buy credit packs, set up auto top-up) and **Subscriptions** (every site's Basic or Pro plan). See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## 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 leads** — jumps to the Leads page filtered to 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 site plan**. - **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 the site's name) 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 Updated: 2026-10-02 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 site plan.** On **Billing → Subscriptions**, choose **⋯ → Cancel subscription** on each site's row. Active plans block deletion, and a cancelled plan stays active until the end of the period you've paid for — so you can delete the account once that date has passed. See [Basic and Pro plans](/docs/basic-and-pro-plans/#cancelling). 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 - [Basic and Pro plans](/docs/basic-and-pro-plans/) - [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/) --- # Destinations overview Source: https://pagefork.ai/docs/destinations-overview/ Description: Send every lead to the tools you already use: a spreadsheet, an inbox, your email list, Zapier, Make, or your own server. Group: Destinations Updated: 2026-10-02 A **destination** is a place PageFork sends a lead to, automatically, the moment something happens to it. Your leads always live in [PageFork](/docs/leads-overview/) first. Destinations copy them outward so the rest of your business hears about them without anyone retyping anything. > Destinations, API keys and the Zapier and Make apps are part of the > **Pro** plan. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## What you can send leads to | Destination | What it does | Best for | |---|---|---| | [Google Sheets](/docs/google-sheets-destination/) | Adds a row to a spreadsheet for every submission | A shared list the whole team can read | | [Email](/docs/email-destinations/) | Emails a verified address on a new submission or a stage change | Routing a form to a person, alerts when a deal is won | | [Kit](/docs/kit-destination/) | Subscribes the person to a Kit form or tag | Newsletters and email sequences | | [Mailchimp](/docs/mailchimp-destination/) | Adds the person to a Mailchimp audience, with tags | Newsletters and customer lists | | [Zapier](/docs/zapier-app/) | Starts a Zap, or creates a lead from a Zap | Connecting thousands of other apps without code | | [Make](/docs/make-app/) | Starts a scenario, or creates a lead from one | The same, in Make | | [Webhook](/docs/webhook-destinations/) | Sends signed JSON to a URL you control | Your own server, n8n, anything custom | You can mix them freely. One form can feed a spreadsheet, email your sales inbox and add the person to your newsletter, all at once. ## Where destinations live Destinations belong to a **site**. 1. Open the site in the editor. 2. Open **Settings** and go to the **Forms** tab. 3. Find **Destinations** and click **Add**. 4. Pick a type and follow its form. Only team **owners and admins** can add, change or delete destinations. See [Team and roles](/docs/team-and-roles/). Zapier and Make are the exception to the steps above: you set those up inside Zapier or Make, and the destination appears here by itself, marked **Managed by Zapier** or **Managed by Make**. ## The three choices every destination has **Name.** Anything that helps you recognise it later, such as "Sales inbox" or "Newsletter signups". **Form scope.** One specific form, or **All forms** on the site. A destination scoped to a form ignores submissions from the others. **Triggers.** When it fires. See the next section. ## Triggers: when a destination fires Every destination has a row of trigger chips. Click one to turn it on or off. - **New submission** fires when someone submits a form. - **→ Stage** chips, one per stage in your [pipeline](/docs/lead-pipeline/) (for example **→ Contacted** or **→ Won**), fire when a lead *moves into* that stage. They combine. A destination with **New submission** off and **→ Won** on ignores raw leads and only speaks up when a deal closes. A destination with every trigger off never fires. The panel tells you so, rather than leaving you to work it out from an empty log. Google Sheets only offers **New submission**. A spreadsheet is a flat list of submissions, and a second row for the same person each time their stage changed would only confuse it. ### What fires a destination, and what doesn't This is the rule that surprises people most, so it's worth reading once. **Destinations fire for leads that have a form submission.** A lead you [added by hand](/docs/adding-leads-by-hand/), imported from a CSV file, or created from Zapier or Make does not trigger any destination, not when it's created and not when its stage changes later. The reason is safety. A destination often does something outward and hard to undo, such as subscribing a person to a mailing list. PageFork only does that for people who filled in your form themselves. One consequence: if a person you added by hand later submits a form, that submission joins their lead, and from then on the lead behaves like any other form lead. Stage changes on it start firing. A few more details: - If a known person submits a form again, the submission joins their existing open lead. **New submission** destinations still fire, since there is a new submission. - Stage triggers fire on the move itself, whether you used the stage bar on the lead or dragged a card on the board. - The one exception is a bulk change. **Moving many leads at once from the list never triggers destinations**, so changing fifty leads doesn't send fifty emails. - Moving a lead through three stages quickly sends three deliveries. Nothing is merged or delayed. ## Testing a destination Google Sheets, email and webhook destinations have a **Send test** button. It sends a sample built from your form's real field names, with placeholder values. Kit and Mailchimp have no test button, on purpose: a test would subscribe a made-up person to your real list. To check those, submit your live form once with your own address. For any destination, a real submission is the most complete test. It proves the whole path: the form, spam checks, the lead, and the delivery. ## The delivery log Open a destination to see **Recent deliveries**. Each line is one attempt to deliver one lead. | Status | Meaning | |---|---| | `pending` | Waiting in the queue or being sent right now | | `success` | The other side accepted it | | `skipped` | Nothing to send, and that's fine. For example, the form had no email address to subscribe | | `failed` | This attempt failed. PageFork will try again | | `dead` | PageFork has given up on this one | A delivery that ended badly can be sent again with **Retry**. Delivery records are kept for **30 days**. They are a debugging window, not an archive. Your leads themselves are never affected by a delivery failing. ## Retries and automatic disabling - PageFork tries each delivery up to **5 times**, waiting longer between each try, starting at 5 seconds. - Temporary problems (the other service is down, busy, or rate limiting you) are retried. Permanent ones (a wrong address, a rejected key) stop straight away, since trying again can't fix them. - After **50 failures in a row**, a destination is **disabled automatically** and the team's owners and admins get an email. Fix the cause, then click **Enable**. - Some failures disable a destination at once, because nothing can succeed until you act: a Google account that was disconnected, a spreadsheet that was deleted, or an API key that Kit or Mailchimp rejects. ## Pausing and deleting **Disable** pauses a destination without losing its settings. **Enable** switches it back on. Leads that arrived while it was paused are not sent afterwards. **Delete** removes it and its delivery log. Nothing is deleted in the other tool: rows already in your spreadsheet and people already on your mailing list stay there. ## Limits Per site: - **10 destinations** in total that you create yourself. - Enabled at the same time: **5** webhooks, **5** email destinations, **3** Google Sheets, **3** Kit and **3** Mailchimp. - **10** Zapier or Make connections, counted separately from the above. ## If your site moves to Basic Destinations stop firing while a site is on Basic, for example when its 14-day Pro trial ends without a Pro plan. That includes the Zapier and Make apps. Nothing is deleted and nothing is switched off: your destinations keep their settings and start firing again, for new activity only, as soon as the site is back on Pro. Leads that arrived in between are not sent retroactively. ## Troubleshooting **Nothing is being sent.** Check, in this order: the site is on Pro; the destination says **Enabled**; at least one trigger chip is on; its form scope matches the form people are actually submitting; and the lead came from a form rather than being added by hand or imported. **It worked, then stopped.** Open the destination. If it was disabled automatically, the reason is shown at the top. Fix it and click **Enable**. **The log says `skipped`.** PageFork had nothing to send. For Kit and Mailchimp this almost always means the mapped email field was empty on that submission. **I see the lead in PageFork but not in the other tool.** Open the destination and read the newest delivery. The status and the message next to it say exactly what the other service answered. ## Next - [Google Sheets](/docs/google-sheets-destination/) - [Email destinations](/docs/email-destinations/) - [Zapier](/docs/zapier-app/) - [Webhook destinations](/docs/webhook-destinations/) --- # 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 destinations Source: https://pagefork.ai/docs/email-destinations/ Description: Send a form to a specific inbox, or email someone the moment a lead reaches a stage such as Won. Group: Destinations Updated: 2026-09-30 Every site already sends one [notification email](/docs/email-notifications/) per submission. An **email destination** is the more precise tool for when that one address isn't enough: - **Route a form to a person.** Send the "Wholesale enquiry" form to your wholesale manager and the "Booking" form to the front desk. - **Alert on a stage.** Email the owner when a lead moves to **Won**, or the accountant when one reaches **Qualified**. > Email destinations are part of the **Pro** plan. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). The standard > notification email works on every plan. ## Notification email or email destination? | | Notification email | Email destination | |---|---|---| | Plan | Basic and Pro | Pro | | How many | One address per site | Up to 5 per site | | Which forms | All forms | One form, or all | | Fires on | New submissions | New submissions, stage changes, or both | | Delivery log and retries | No | Yes | Many sites use both: the notification email as the catch-all, and one or two destinations for the cases that need a specific person. ## Setting one up 1. Open your site in the editor, open **Settings** and go to the **Forms** tab. 2. Under **Destinations**, click **Add** and choose **Email**. 3. Give it a **Name** and choose the **Form scope**. 4. Choose the **Triggers**: **New submission**, one or more stages, or both. 5. Under **Recipient**, pick an address, or add a new one (see below). 6. Click **Create Email destination**. Each destination sends to **one** recipient. To email three people, create three destinations, or point one at a shared mailbox such as `sales@yourbrand.com`. ## Recipients and verification PageFork only emails addresses that have proven they want the mail. That stops a destination being used to send unwanted email to a stranger. **Your team members are verified automatically.** Pick a teammate's address and it's ready to use. **Anyone else gets a one-time code:** 1. Type the address and click **Add email**. 2. PageFork emails a **6-digit code** to that address. 3. Ask the recipient for the code, enter it, and click **Verify email**. Good to know about codes: - A code is valid for **15 minutes**. - You get **3 attempts** per code. After that, request a new one. - **Resend code** is available once an hour per address. A verified recipient belongs to your team, so once an address is verified you can reuse it on any site without verifying again. ## What the emails look like **On a new submission** the subject is "New *form* submission on *site*". The email lists every field the visitor filled in. **On a stage change** the subject is "A lead on *site* is now *stage*". The email shows who the lead is and which stage it moved from and to, using your stage names. Both link straight to the lead in PageFork. ## Stage alerts Stage triggers use **your own pipeline**. If you rename "Won" to "Booked", the chip and the emails say "Booked". A few rules worth knowing: - An alert fires when a lead **moves into** the stage, each time it does. - It fires for leads that **came from a form**. Leads added by hand or imported don't send alerts. See [what fires a destination](/docs/destinations-overview/#what-fires-a-destination-and-what-doesnt). - Moving many leads at once from the list does not send alerts. - If you delete a stage, destinations that were watching it simply stop matching. Check your alerts after [editing the pipeline](/docs/lead-pipeline/). ## Testing it **Send test** sends a sample email to the recipient, built from your form's real field names. ## Limits - **5** enabled email destinations per site. - One recipient per destination. ## Troubleshooting **The recipient never got the code.** Check spam, then check the address for typos. You can resend once an hour. **The email isn't arriving.** Open the destination and read **Recent deliveries**. A `success` line means the email was handed to the mail system, so look in the recipient's spam folder. A `failed` or `dead` line shows the reason next to it. **My stage alert stopped.** The stage was probably deleted or replaced. Open the destination and select the stage chips again. **I get two emails per submission.** You have both the notification email and an email destination pointing at the same address for the same form. Remove one. ## Next - [Email notifications](/docs/email-notifications/) - [Destinations overview](/docs/destinations-overview/) - [Lead pipeline](/docs/lead-pipeline/) - [Team and roles](/docs/team-and-roles/) --- # Email notifications Source: https://pagefork.ai/docs/email-notifications/ Description: Get an email for every form submission, choose which address receives it, and know when a teammate hands you a lead. Group: Forms Updated: 2026-09-30 PageFork sends two kinds of lead email without any setup: one when a **submission arrives**, and one when a **lead is assigned to you**. The submission email works on every plan. Assignment emails come with the lead features of the Pro plan. For more control (a different inbox per form, or an alert when a lead reaches a stage), add an [email destination](/docs/email-destinations/), also part of Pro. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## New submission emails Every time someone submits a form on your site, PageFork sends an email. ### Where the email goes By default, to **an owner or admin of your team**. To send it somewhere else, such as a shared sales inbox: 1. Open your site in the editor, open **Settings** and go to the **Forms** tab. 2. Under **Form Notifications**, type the address into **Notification Email**. 3. If the address belongs to someone outside your team, PageFork emails it a **6-digit code**. Enter the code to confirm the address. The code is valid for 15 minutes and you have 3 attempts. A new code can be requested once an hour. Each site has its own notification address, so different sites can notify different people. Clear the field to go back to the default. ### What the email contains - Which site received the submission. - Which form was submitted. - Every field value submitted, in a clean table. - A button that opens the submission in PageFork. ## Assignment emails When someone makes you the **owner** of a lead, you get an email with the lead's preview, its current stage, its due date if it has one, and a link that opens that exact lead. It goes to the address on the new owner's PageFork account. Three cases send **nothing**, on purpose: - You assign a lead to **yourself** — you already know. - The lead is **re-saved** with the same owner. - A lead is **unassigned**. So reassigning a lead notifies the new owner and nobody else. > If the link says the lead can't be opened, you're probably in a > different team than the one that owns it. Switch teams and reload. ## Notification email or email destination? | | Notification email | [Email destination](/docs/email-destinations/) | |---|---|---| | Plan | Basic and Pro | Pro | | How many | One address per site | Up to 5 per site | | Which forms | All forms | One form, or all | | Fires on | New submissions | New submissions, stage changes, or both | | Delivery log and retries | No | Yes | ## 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. Then check **Notification Email** in the site's **Settings** → **Forms**. If an address is set there, that inbox gets the email, not the default recipient. If submissions are visible in PageFork but the email never came, see [Forms not receiving](/docs/forms-not-receiving/) for more checks. ## Can I turn off emails per form? The notification email covers every form on the site. To mute a high-volume form, a common pattern is a mail-client rule that auto-archives anything from PageFork containing that form's name. If what you want is the opposite, *only* one form emailed to a particular person, leave the notification email as it is and add an [email destination](/docs/email-destinations/) scoped to that form. ## Getting leads to the right person If several people work your leads, the better setup is to [invite them to your team](/docs/team-and-roles/) and make them the **owner** of their leads. Each assignment emails the new owner and gives you a record of who holds what, which forwarding can't. If you'd rather everyone just see everything, set the notification email to a mailing list (such as `leads@yourbrand.com`) that fans out. ## Next - [Email destinations](/docs/email-destinations/) - [Forms overview](/docs/forms-overview/) - [Leads overview](/docs/leads-overview/) - [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 `