# 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 ` ``` The AI handles responsive sizing, aspect ratios, and sensible fallbacks (title, loading="lazy", sandbox where needed). ## Video ### YouTube ``` Embed this YouTube video in the hero section: https://youtu.be/dQw4w9WgXcQ ``` Or use their share → embed snippet directly. Ask the AI for an autoplay muted loop for hero backgrounds: ``` Add this YouTube video as an autoplay, muted, looping background in the hero: https://youtu.be/dQw4w9WgXcQ ``` ### Vimeo Same pattern — paste the URL or the embed snippet. ``` Embed this Vimeo in the About section: https://vimeo.com/123456789 ``` ### Loom ``` Embed this Loom walkthrough in the Demo section: https://www.loom.com/share/abc123 ``` ### Wistia ``` Embed this Wistia video: https://yourbrand.wistia.com/medias/abc123 ``` ## Audio and podcasts ### Spotify ``` Embed this Spotify episode: https://open.spotify.com/episode/... ``` Works for tracks, albums, episodes, and shows. ### SoundCloud ``` Embed this SoundCloud track: https://soundcloud.com/artist/track ``` ### Apple Podcasts Use the Apple Podcasts "Share → Embed" snippet: ``` Embed this Apple Podcasts player in the Podcast section: ``` ## Maps ### Google Maps Maps → **Share** → **Embed a map** → copy the iframe. ``` Embed this Google Map in the Location section: ``` Ask for a specific address instead if you don't have the embed code: ``` Add a Google Map for "123 Main St, Berlin, Germany" in the Contact section. ``` ## Scheduling and booking ### Calendly ``` Embed my Calendly page in the Contact section: https://calendly.com/yourbrand/intro ``` Calendly offers inline, popup, and popup-button variants. Specify if you want something non-default: ``` Add Calendly as a popup-button labelled "Book a call" in the header: https://calendly.com/yourbrand/intro ``` ### Cal.com ``` Embed my Cal.com link inline in the Contact section: https://cal.com/yourbrand/30min ``` ### SavvyCal / other schedulers Same pattern — paste the vendor's embed snippet or their share URL. ## Forms (third-party) PageFork has [built-in forms](/docs/forms-overview/) that store submissions in your dashboard and email you. Use a third-party form instead when you need: - Advanced logic (branching questions, calculations). - Payment collection inside the form (Typeform / Tally paid tiers). - Submission data routed straight to another tool (Notion, Airtable, Sheets) without custom plumbing. ### Tally ``` Embed this Tally form in the signup section: https://tally.so/r/abc123 ``` ### Typeform ``` Embed this Typeform in the signup section: https://yourbrand.typeform.com/to/abc123 ``` Typeform supports inline, fullpage, and popup modes — say which one you want. ### Google Forms ``` Embed this Google Form on the Contact page: https://docs.google.com/forms/d/e/.../viewform ``` ### Jotform ``` Embed this Jotform: https://form.jotform.com/12345678 ``` ## Design and product embeds ### Figma ``` Embed this Figma prototype in the Design section: https://www.figma.com/file/abc123/Prototype ``` ### Airtable ``` Embed this Airtable view as an iframe in the Pricing section: https://airtable.com/embed/appABC/shrXYZ ``` ### Notion Use a service like **Super** or **Fruition** to expose a Notion page as an iframe, or paste the public Notion URL and ask the AI to use the standard Notion embed pattern. ## Social posts ### X (Twitter) ``` Embed this tweet in the Testimonials section: https://twitter.com/username/status/1234567890 ``` ### Instagram post ``` Embed this Instagram post: https://www.instagram.com/p/ABC123/ ``` Instagram embeds rely on Instagram's script — the AI adds the loader too. ### TikTok ``` Embed this TikTok video: https://www.tiktok.com/@user/video/1234567890 ``` ### LinkedIn post LinkedIn doesn't ship a great native embed. Two common workarounds: - Take a screenshot and use it as a testimonial image. - Use [Embedsocial](https://embedsocial.com/) or a similar aggregator. ## Reviews and social proof - **Trustpilot widget** — paste the script from their embed generator. - **Senja widget** — testimonial carousel / wall of love. - **G2 / Capterra badges** — usually plain image links; the AI can wire them as regular images. - **Google Reviews** — use a widget like Elfsight or Trustmary; paste their script. ## Responsive iframe tips PageFork wraps iframes in a responsive container by default (16:9 for video, sensible aspect ratios elsewhere). If something looks wrong on mobile: ``` Make the Calendly embed in the Contact section responsive — full width on mobile with a min height of 600px. ``` ## Gotchas - **`X-Frame-Options` / CSP blocks** — a few vendors (notably some banks, Google account pages) refuse to be iframed. There's no workaround; find a different embed option or link out. - **Autoplay restrictions** — browsers block autoplay with sound. Loop videos in hero sections must be muted. - **Cookie consent** — some embeds set tracking cookies (YouTube, social). If you target EU users, consider a consent-gated variant (e.g. YouTube `nocookie` URLs, or loading the embed only after consent). - **Performance** — many heavy embeds on one page will slow it down. Use `loading="lazy"` (the AI sets this by default) and keep the fold light. ## Next - [Chat and support widgets](/docs/chat-and-support-widgets/) - [Forms overview](/docs/forms-overview/) - [Payment links and checkout](/docs/payment-links-and-checkout/) - [Cookie consent and privacy](/docs/cookie-consent-and-privacy/) --- # Erasing a person Source: https://pagefork.ai/docs/erasing-a-person/ Description: Permanently delete a person and everything PageFork holds about them — for a privacy request or a record that should not exist. Group: Leads Updated: 2026-10-02 Sometimes a record has to go completely: someone asks you to delete their data, or a test entry or a spam submission needs clearing out. **Delete person** removes a [person](/docs/people/) and everything attached to them in one step. > Erasing is a **Pro** feature, and only **owners and admins** > can do it. It is **permanent**. See [Basic and Pro > plans](/docs/basic-and-pro-plans/) and [Team and > roles](/docs/team-and-roles/). ## What gets deleted Everything PageFork stores about that person on that site: | Deleted | Includes | |---|---| | The person | Name, email, phone, company, tags, custom field values | | Their leads | Every lead, open or closed, with its stage, owner, value and priority | | Follow-ups | Every [follow-up](/docs/follow-ups-and-tasks/) on those leads, done or not | | Form submissions | Every submission they sent, including the original answers | | Delivery records | The delivery log entries for those submissions under your destinations | | Notes and activity | Notes, calls, emails and meetings logged against them | | History | The full timeline of changes | It all goes together. You can't erase a person but keep their leads, or keep their submissions. ## What is not deleted PageFork can only delete what it holds. Erasing a person does **not** reach: - **Copies already sent elsewhere.** Rows in a Google Sheet, subscribers in Mailchimp or Kit, records created through a webhook, Zapier or Make. Remove those in the other tool. See [Destinations overview](/docs/destinations-overview/). - **Emails already delivered.** Notification emails about their submissions stay in whichever inboxes received them. - **Files you've downloaded.** Any [CSV export](/docs/csv-export/) made earlier still contains them. - **The same person on another site.** People are per site. If they also appear on a second site of yours, erase them there too. Your setup is untouched: custom fields, pipeline stages and tags used by other people all stay as they are. Delivery log entries for *stage* triggers aren't linked to the person, so they stay in the log until they age out on their own. ## How to erase someone 1. Open the person — from the **People** view, or from one of their leads. 2. Open the **More actions** menu at the top right. 3. Choose **Delete person…**. 4. The dialog tells you what will go: the number of leads and submissions, plus notes, follow-ups and history. 5. Type the confirmation text **exactly** as shown. It's the person's name; if they have no name, their email; if they have neither, the word `delete`. 6. Click **Delete person**. The button stays disabled until the text matches, capitals included. Afterwards you're returned to the People view. ## It can't be undone There is no bin and no restore. PageFork doesn't keep a copy, and nothing about the erased person remains on the site — not even a note that they were erased. If you may need proof that you handled a deletion request, keep your own record of it outside PageFork. ## If they come back An erased person isn't blocked. If they submit a form again, or turn up in a later import, PageFork has no memory of them and creates a **new person** with a fresh history. ## Erase or archive? If you only want someone out of the way — a lead that went nowhere, a customer you've stopped working with — **archive** them instead. Archiving hides a person and their leads from your everyday views but keeps everything, and it can be reversed. A new submission from an archived person brings them back automatically. Archiving is done from the Leads [List view](/docs/leads-list-and-filters/). Use erase when the data genuinely must not exist any more. ## Good to know **Delete person… isn't in the menu.** You're a member. Only owners and admins see it. **You merged the wrong people and want to split them.** Erasing doesn't help — it would remove both people's data, since a merged record is one person. See [Merging duplicates](/docs/merging-duplicates/). **You want to clear out many people at once.** People are erased one at a time. ## Next - [People](/docs/people/) - [Merging duplicates](/docs/merging-duplicates/) - [Team and roles](/docs/team-and-roles/) --- # Follow-ups and tasks Source: https://pagefork.ai/docs/follow-ups-and-tasks/ Description: Add follow-up tasks to a lead, give them a due date and an owner, tick them off, and see them on the calendar. Group: Leads Updated: 2026-10-04 A **follow-up** is a small task attached to a lead: "Call back about the quote", "Send the contract", "Check in after the viewing". It's how you make sure a lead doesn't go quiet. > Follow-ups are a **Pro** feature. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). A lead can have as many follow-ups as you need, each with its own due date and owner. ## Adding a follow-up 1. Open the [lead page](/docs/lead-record/) and find the **Follow-ups** panel. On a phone it's under the **Details** tab. 2. Type what needs doing in **Add a follow-up…**. 3. Optionally click the calendar icon and pick a due date. 4. Press Enter or click **Add**. A title can be up to 200 characters. The due date is optional, but only follow-ups with a date appear on the calendar. You can also set one while creating a lead: the **Follow-up** date in the [New lead](/docs/adding-leads-by-hand/) dialog creates a task called "Follow up" due on that day. ## Working with follow-ups Each follow-up is one row. | To... | Do this | |---|---| | Mark it done | Click the circle in front of it | | Rename it | Click the title, edit it and press Enter | | Set or change the due date | Click the date or the calendar icon on the row | | Remove the due date | Open the date picker and click **Clear date** | | Give it to someone | Click the person icon on the row and choose a team member | | Delete it | Click the bin icon on the row | On a computer, the date, person and bin icons appear when you point at the row. Deleting happens immediately, without a confirmation. ### Due dates are days, not times A due date is a **calendar day**. It has no time of day and shows as the same day for everyone on your team, whatever timezone they're in. A due date that has passed is shown in red until the follow-up is completed. ### Owners A follow-up's owner is separate from the lead's owner. You can own a lead and hand one follow-up on it to a colleague. A new follow-up starts unassigned. ## Completing a follow-up Click the circle. The follow-up is ticked off, moves out of the open list and is recorded in the lead's timeline as "completed" with its title. Completed follow-ups are tucked under a line such as **3 completed**. Click it to show them. From there you can: - Click the tick again to reopen one. - Delete one with the bin icon. A completed follow-up can't be renamed or rescheduled. Reopen it first. When nothing is open, the panel reminds you: "Nothing planned. Add a follow-up so this lead doesn't go quiet." ## The lead's due date You never set a due date on the lead itself. **A lead's due date is the earliest due date among its open follow-ups.** It updates by itself when you add, reschedule, complete or delete one. That date is what you see as: - **Due** and a date on the card in the [board](/docs/board-view/). - The **Due** column in the [list](/docs/leads-list-and-filters/). When the lead has more open follow-ups, a small `+1` or `+2` follows the date. When the last open follow-up is completed, the lead has no due date. ## Follow-ups on the calendar Open **Leads**, click the **Calendar** tab and make sure **Follow-ups** is selected. Each follow-up with a due date appears on its day, labelled with its title and the person's name, and coloured by the lead's stage. Click it to open the lead. A follow-up is shown on the calendar only while all of these are true: - It has a due date. - It isn't completed. - Its lead is still open. - The person isn't archived. So completing a follow-up removes it from the calendar, and so does winning or losing the lead. The follow-up itself stays on the lead page. More in [Lead calendar](/docs/lead-calendar/). ## Follow-ups on the dashboard The [dashboard](/docs/dashboard-tour/) keeps follow-ups in view without opening Leads: - **Needs your attention** shows a row for each site with overdue follow-ups. **View follow-ups** opens that site's leads with the earliest due date first. - The **Due today** tile counts follow-ups due today across your sites and opens the calendar. Both count the same follow-ups the calendar shows: open, on an open lead, for a person who isn't archived. ## What's recorded The lead's timeline shows when a follow-up was **added** and when it was **completed**, with who did it. Renaming, rescheduling, reassigning and deleting aren't recorded. ## Good to know **My follow-up isn't on the calendar.** Check that it has a due date, that you're in **Follow-ups** mode rather than **Bookings**, and that you're looking at the right month. **The Due date on the card changed by itself.** It always shows the earliest open follow-up. Completing or deleting that one makes the next one the lead's due date. **Follow-up or booking?** A follow-up is something *your team* plans to do. A booking is an appointment *the visitor* picked in a form. See [Booking dates](/docs/booking-dates/). ## Next - [Lead calendar](/docs/lead-calendar/) - [The lead page](/docs/lead-record/) - [Board view](/docs/board-view/) --- # Form field schemas Source: https://pagefork.ai/docs/form-field-schemas/ Description: How PageFork reads the fields on your forms — which become a person''s name, email and phone, and which become custom fields. Group: Forms Updated: 2026-09-30 Each form on your site has a **schema** — the list of fields it sends. PageFork uses it in two ways: - To show each submission's answers, as columns in the submissions list and the [CSV export](/docs/csv-export/). - To work out **who** sent the submission, and which answers to keep on that [person](/docs/people/). You don't manage a schema by hand. It's a reflection of what the form actually sends. ## How a schema is built PageFork reads your forms when you **publish**, and again each time a submission arrives. Any field name it hasn't seen before is added. The schema grows automatically with the form. ## Which fields identify the person Four details are special: **name**, **email**, **phone** and **company**. They're what a person record is built from, and email and phone are how PageFork [recognises someone who comes back](/docs/people/#how-pagefork-recognises-a-returning-person). PageFork decides which form field is which from the field's type and its name: | Detail | Recognised when the field… | |---|---| | **Email** | is an email input, or is named `email`, `e-mail`, `email_address`, `your_email`, `contact_email`, or anything starting with `email` | | **Phone** | is a phone input, or is named `phone`, `tel`, `telephone`, `mobile`, `cell`, `whatsapp`, `phone_number`, or anything starting with one of those | | **Name** | is named `name`, `full_name`, `your_name` or `contact_name` | | **Company** | is named `company`, `company_name`, `organisation`, `organization`, `business` or `business_name` | Capitals don't matter. **First and last name.** If the form has separate fields named `first_name` (or `given_name`) and `last_name` (or `surname`, `family_name`), PageFork joins them with a space into one name. **Values are checked too.** A field called `email` that doesn't contain a valid address isn't used as the person's email. A phone needs at least 7 digits. Forms PageFork generates use these names already. It matters when you ask for something unusual — "call the email field `reach_me_at`" would leave PageFork unable to tell it's an email unless the input is an email-type input. > A form with **no email and no phone field** still creates a lead, but > PageFork can't recognise the visitor next time. Each submission > becomes a new person. ## Everything else becomes a custom field Every other field on the form becomes a [custom field](/docs/custom-fields/) on the site — "Budget", "Preferred date", "Message" — and its answer is saved on the person. When the field is found at publish, PageFork uses the label visitors see and a matching type: | Form input | Custom field type | |---|---| | Number or slider | **Number** | | Date | **Date** | | Dropdown or radio buttons | **Select**, with the same options | | Single checkbox | **Yes/No** | | Web address | **URL** | | Anything else | **Text** | A field that first turns up in a submission, rather than at publish, becomes a **Text** field named after the form field. An answer only fills a custom field that is **empty** on the person. If they already have a value there, the new answer doesn't replace it. The submission itself always keeps the full original answers. ### Fields that are ignored Some values are technical and never become custom fields: - Campaign tracking values starting with `utm_`. - Ad click IDs: `gclid`, `fbclid`, `msclkid`. - Captcha responses. - Any field whose name starts with an underscore. ## When the schema gets messy Occasionally you'll see junk fields — typically after: - **Renaming a field in the form** — old submissions used the old name; new ones use the new name. Both appear as columns, and you get two custom fields. - **Spam entries with random field names** — rare, but possible. - **Pasting a form into a new place** and forgetting a stale `name=…` attribute. ## Cleaning up If you want things consistent going forward: 1. **Edit the form in PageFork** so the field names match what you want. Ask in chat: "rename the 'email_address' field to 'email' on the contact form". 2. **Republish** the site so visitors start submitting the new names. 3. **Hide the leftover custom field** in the fields editor. Hiding keeps its data but takes it off person pages and list columns. See [Custom fields](/docs/custom-fields/#the-fields-editor). Old submissions keep their original fields, and they show in the submissions CSV as extra columns. You can ignore or delete them in your downstream tool. If a single submission has a wrong value — a typo in an email, say — fix that one submission instead. See [Correcting submission data](/docs/correcting-submission-data/). ## Field ordering Fields are listed in the **order they were first seen**. If you want a particular order: - Edit the form in PageFork so fields appear in the right order on the page. Most browsers submit fields in page order. - Custom fields have their own order, which you set by dragging in the fields editor. ## Next - [Forms overview](/docs/forms-overview/) - [Custom fields](/docs/custom-fields/) - [People](/docs/people/) - [CSV export](/docs/csv-export/) --- # Forms not receiving Source: https://pagefork.ai/docs/forms-not-receiving/ Description: Submitted a test and nothing arrived? Here's where submissions usually get lost — or where they're hiding. Group: Troubleshooting Updated: 2026-10-02 If you submit a test entry and can't find it on the **Leads** page (or the email notification never arrives), work through this list. Quite often the submission *did* arrive and is sitting somewhere you didn't expect. The first half of this page covers that. ## Is the site actually published? Visitors can only reach your form on a **published** site, and edits aren't live until you publish them. 1. Confirm the form is visible in the editor preview. 2. Click **Publish** / **Republish**. 3. Open the live URL in an incognito window. 4. Submit again from there. Testing from the live address exercises the same path your visitors use. ## It arrived, but it joined an existing lead This is the most common surprise when testing. PageFork files each submission under a [person](/docs/people/), matched by email and then by phone. If that person **already has an open lead**, the new submission is attached to that lead. **No new lead appears** — not as a new card on the **Board**, and not as a new row in the **List**. So if you test with your own email address twice, the second test doesn't create anything new to look at. To find it: 1. Open **Leads** and search for the email or name you used. 2. Open the lead. 3. Look at its timeline — both submissions are there. To get a genuinely new lead while testing, use an email and phone you haven't used on that site before. A new lead *is* created when the person's earlier leads are all closed (won or lost). ## It arrived as an "Unnamed lead" If the form has no field PageFork recognises as a name, email or phone, the lead is created but shows as **Unnamed lead**. It's easy to scroll past. See [Form field schemas](/docs/form-field-schemas/) for which field names are recognised. ## Check the site and the filters On the **Leads** page: - The **site** dropdown may be set to a different site. - On **Pro**, a saved view or filter may be hiding the lead — a stage, an owner, a priority, a custom field. Click **Clear filters**. - On **Pro**, archived people and their leads are hidden unless **Archived** is switched on in the **List** view. - On **Basic**, check the form dropdown is on **All forms** and the **Unread** button is off. ## Basic and Pro show different things On a **Basic** site the Leads page is a plain list of submissions, one row each. **Board**, **Calendar** and **People** show a lock. On a **Pro** site the page shows **leads**, not submissions — one row or card per lead, however many submissions it holds. If a site's Pro trial has ended, the page switches back to the Basic list. Your submissions are all still there. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ## Check email spam / filters Email notifications can end up in spam, especially for the first few submissions on a new account. Check: - Spam / Junk folder. - Promotions tab (Gmail). - Any custom rule that might auto-archive PageFork emails. Add the PageFork notification sender to your contacts / safe senders so future notifications arrive reliably. ## Is the notification email the right address? Each site has its own notification address. In the site editor, open the **Forms** tab and look at **Notification Email** under **Form Notifications**. - If it's set, notifications go there. - If it's empty, they go to an owner or admin of your team. See [Email notifications](/docs/email-notifications/). ## Is the form using a third-party embed? If you asked PageFork to embed a third-party form (Typeform, Tally, Mailchimp, HubSpot…), submissions go to that provider, **not** to PageFork. Nothing appears in **Leads**. Check the provider's dashboard. ## Is the form on a different website? PageFork only accepts submissions sent from your site's own addresses. A form copied out of a PageFork site and pasted into another website will be refused. ## Is rate-limiting blocking submissions? Submissions are limited to **5 per minute** from one address. If you're firing off test entries quickly, some will be rejected. Wait a minute and retry. ## Did something fill in the hidden spam field? PageFork forms carry a hidden field that real visitors leave empty; submissions that fill it are rejected as spam. A browser extension that auto-fills *every* field on a page can trip it. Retry in an incognito window with extensions off. ## Leads has it, but my other tool doesn't A submission that reached **Leads** but not your spreadsheet, mailing list or automation is a delivery problem, not a form problem. In the site editor, open **Forms** → **Destinations**, open the destination and check its recent deliveries — a failed entry shows what the receiver answered. See [Destinations overview](/docs/destinations-overview/). Destinations are a Pro feature, so they stop sending if the site is on Basic. After upgrading they resume for new submissions; ones that arrived while the site was on Basic aren't sent afterwards. ## Still nothing arriving Contact support with: - The live URL. - The form name / page. - Approximate time of a test submission. - What you submitted. ## Next - [Forms overview](/docs/forms-overview/) - [Submissions inbox](/docs/submissions-inbox/) - [People](/docs/people/) - [Email notifications](/docs/email-notifications/) --- # Forms overview Source: https://pagefork.ai/docs/forms-overview/ Description: Add forms to your site by asking. Every submission becomes a person and a lead you can follow up. Group: Forms Updated: 2026-10-02 Forms are first-class in PageFork. You don't install a third-party widget or paste embed codes — you just ask, and every submission lands on your **Leads** page as someone to follow up. ## Adding a form Open the editor and say what you want: - "Add a contact form with name, email, and message." - "Put a newsletter signup form (just email) in the footer." - "Add a waitlist form with name, email, and company — make email required." PageFork generates the form in the right section and connects it to its own form backend for this site. There's nothing else to wire up. Visitors can only reach a form once the site is **published**, which needs a Basic or Pro plan and your own domain. See [Publishing overview](/docs/publishing-overview/). Publish, then send yourself a test from the live address. ## What happens to a submission When a visitor presses send, PageFork does four things: 1. **Stores the submission** exactly as it was sent. 2. **Finds or creates the person.** If someone with the same email — or, failing that, the same phone — is already on the site, the submission is filed under them and any details they were missing are filled in. Otherwise a new [person](/docs/people/) is created. 3. **Attaches it to a lead.** If that person already has an open lead, the submission joins it. If not, a new lead is created in the first stage of your [pipeline](/docs/lead-pipeline/). 4. **Tells you.** An [email notification](/docs/email-notifications/) goes out, and on Pro sites the submission is passed to any [destinations](/docs/destinations-overview/) you've set up. So a customer who fills in your form twice is one person with one lead and two submissions — not two unrelated messages. ## Where you see it Open **Leads** in the sidebar and pick the site. | Plan | What you get | |---|---| | **Basic** | A list of submissions you can read, search, filter by form, mark read and export to CSV, plus the notification email. | | **Pro** | The full CRM: **Board**, **List**, **Calendar** and **People** views, lead records with notes and follow-ups, custom fields, tags, import, and destinations. | New sites start with a 14-day Pro trial. After it, a site without a Pro plan has Basic features. See [Basic and Pro plans](/docs/basic-and-pro-plans/) for the full comparison, and [Leads overview](/docs/leads-overview/) for a tour of the Pro views. People and leads are recorded for every submission on either plan, so nothing is missing if you move to Pro later. ## Sending submissions elsewhere On Pro, a **destination** passes each submission on to another tool as it arrives: a [Google Sheet](/docs/google-sheets-destination/), [email](/docs/email-destinations/), [Kit](/docs/kit-destination/), [Mailchimp](/docs/mailchimp-destination/), a [webhook](/docs/webhook-destinations/), or the [Zapier](/docs/zapier-app/) and [Make](/docs/make-app/) apps. Destinations are managed in the site editor, under the **Forms** tab. Start with the [Destinations overview](/docs/destinations-overview/). ## Forms vs third-party tools If you already use Typeform, Tally, HubSpot forms or similar, you can embed them instead — see [Embeds and iframes](/docs/embeds-and-iframes/) for the patterns. Reach for a third-party form when you need features PageFork's built-in forms don't cover: branching logic, calculations, or payment fields. Bear in mind that an embedded form sends its submissions to that provider. They won't appear in **Leads**, and no person or lead is created. Getting submissions into another tool is not a reason to leave — destinations do that on Pro. For everything else, PageFork's built-in forms are the simpler default: one less service to manage. ## Required vs optional fields Tell PageFork which fields are required: - "Make email required, everything else optional." - "Require all fields." Client-side validation is automatic: empty required fields block submission. Ask for at least an **email or phone** field on every form. That's what lets PageFork recognise a returning visitor as the same person. See [Form field schemas](/docs/form-field-schemas/). ## Privacy For each submission PageFork stores: - The values submitted. - The submission timestamp. - The submitter's IP address (for anti-spam / legitimacy checks). Submissions are only accepted from your site's own addresses. If you need to comply with a privacy policy (GDPR, CCPA), add a clear disclosure to your form ("By submitting, you agree to our privacy policy") and publish a matching policy page. When someone asks you to delete their data, an owner or admin of a Pro site can [erase the person](/docs/erasing-a-person/), which removes their submissions, leads and history together. ## Limits - No artificial cap on submissions per form. - Submissions are rate-limited to prevent abuse: **5 per minute** from one address. - For extremely high-volume lead capture, contact support. ## Next - [Leads overview](/docs/leads-overview/) - [People](/docs/people/) - [Email notifications](/docs/email-notifications/) - [Destinations overview](/docs/destinations-overview/) --- # Starting from a template Source: https://pagefork.ai/docs/from-a-template/ Description: Skip the blank page. Pick a template and customise it with AI. Group: Getting Started Updated: 2026-10-04 If you'd rather not start from a prompt, pick one of PageFork's prebuilt templates and customise it from there. Templates are full, opinionated websites designed for a specific use case — you swap the copy, images, and style via chat, exactly the same way you'd edit a generated site. ## Browsing templates 1. Click **Create new site** on the [dashboard](/docs/dashboard-tour/) or in the sidebar, then click **template** under the prompt box. 2. Filter by category — **Marketing Agencies**, **Local Businesses**, **Fitness**, and more. 3. Click any template to see a full-page preview. 4. Click **Use this template** to create a new site from it. Each template has a short description and a preview image. Filters make it easy to narrow to your use case, but a "restaurant" template works just as well as a starting point for a bakery, studio, or café — once generated, the site is yours to reshape. ## Customising your template A site created from a template behaves identically to one created from a prompt: - You can edit any section via chat. - You get the same [versions, undo, and retry](/docs/versions-undo-retry/). - You can add and remove pages. - You publish exactly the same way. Good first prompts after picking a template: - "Change the brand name to Acme and replace the hero copy to focus on AI coaching." - "Swap the testimonials for real ones — I'll paste them." - "Tighten the colour palette to navy and cream, keep the lime accent." ## Template vs. prompt: which should I choose? | Pick a template when | Start from a prompt when | |--|--| | You want a fully-populated site right away | You have a very specific vision | | You're unsure what sections you need | You want something unusual or off-pattern | | You want a known-good layout baseline | You want PageFork to invent the structure | Both paths give you the same editable result. The template route just starts you closer to "done". ## Next - [Editing with AI](/docs/editing-with-ai/) — write prompts that actually work. - [Core concepts](/docs/core-concepts/) — understand sites, pages, versions. --- # Generation failed Source: https://pagefork.ai/docs/generation-failed/ Description: Your edit or generation failed. What to try next. Group: Troubleshooting Occasionally a site generation or edit doesn't complete. The chat shows a **Generation failed** banner and offers a **Retry** button. Here's how to recover. ## Try Retry first In most cases, retrying works. The AI gets a fresh attempt with the same message, and common transient issues (timeouts, hiccups) resolve. - Click **Retry** in the chat. - Wait for the generation to complete. - If it succeeds, you're done. Failed generations that consumed credits are automatically refunded when the refund policy applies — so Retry is usually a safe first move. ## If Retry fails Try a different angle. One of these usually helps: ### Simplify the prompt If the original prompt tried to do several things at once, break it up: - Undo the failed state (if any partial version was produced). - Send a smaller, more focused Edit. See [Iterate in small steps](/docs/iterate-in-small-steps/). ### Ask in chat to diagnose Ask PageFork what went wrong in the same composer: > "The last edit failed — why might that be?" PageFork can often explain: the request was ambiguous, an element didn't exist, or a pattern was ambiguous. You can still click **Retry** afterward, or send a clearer change request once you understand the issue. ### Rewrite the prompt After understanding the issue, send a cleaner Edit prompt with more specifics — see [Writing great prompts](/docs/writing-great-prompts/). ## Common causes - **Too much scope in one prompt.** Fix: smaller prompts. - **Ambiguous references** (e.g. "change the button" on a page with many buttons). Fix: use [Select mode](/docs/selecting-blocks/) to reference the specific element. - **Conflicting instructions** (e.g. "keep this exactly" + "make it completely different"). Fix: pick one. - **Network blip.** Fix: Retry. ## When to contact support If the same prompt fails three times in a row and you can't tell why, send support: - The site URL. - The approximate time of the failure. - The prompt you were trying. ## Next - [Insufficient credits](/docs/insufficient-credits/) - [Writing great prompts](/docs/writing-great-prompts/) - [Iterate in small steps](/docs/iterate-in-small-steps/) --- # Getting started Source: https://pagefork.ai/docs/getting-started/ Description: Generate your first PageFork site in under a minute. Group: Getting Started Updated: 2026-10-04 **To generate your first PageFork site: go to [pagefork.ai](https://pagefork.ai), describe your site in one sentence, click Generate, then iterate with natural-language prompts and click Publish when you're ready.** This guide walks you through generating, editing, and publishing your first landing page — from zero to live domain in about five minutes. ## 1. Describe your site On the [homepage](/), type a sentence describing what you want to build. Try to include: - **Who it's for** — "a launch page for my AI fitness app" - **What it should highlight** — "with pricing, testimonials, and a booking form" - **Any tone or style cues** — "bold and minimal, dark mode" Optionally pick a **[model tier](/docs/model-tiers/)** in the composer — **Standard** (default), **Advanced**, or **Premium** — then hit **Generate**. PageFork will produce your first version in under a minute. > Already have an account? Click **Create new site** on the > [dashboard](/docs/dashboard-tour/) or in the sidebar. > Tip: paste a live website URL to modernize or redesign an existing site > ([Reference websites](/docs/reference-websites/)), or attach a file for > logos and specs ([File uploads](/docs/reference-images/)). ## 2. Iterate in plain English You don't have to get it right the first time. Just tell PageFork what you want changed. Examples: - "Make the hero darker." - "Replace the pricing table with a comparison grid." - "Add a testimonials section above the FAQ." - "Shorten the hero headline — make it punchier." Every change is instant and non-destructive. Undo, redo, and branch experiments freely. ## 3. Publish to your domain Want feedback first? Share a free [preview link](/docs/preview-links/) — no domain or plan needed. When you're happy, hit **Publish**. Going live needs two things: 1. **A plan for the site.** Pick **Basic** (€5/month) or **Pro** (€14/month, adds leads, destinations and analytics), monthly or yearly, and pay in Stripe Checkout. See [Basic and Pro plans](/docs/basic-and-pro-plans/). 2. **A custom domain you own**, connected and verified (DNS records to copy, SSL is automatic). There's no free `pagefork.ai` address. Then click **Publish** again. PageFork generates a static, CDN-hosted version of your site and exposes a sitemap for search engines. That's it — your page is live. Read [Connecting your domain](/docs/connecting-your-domain/) for the domain setup details. --- # Glossary Source: https://pagefork.ai/docs/glossary/ Description: Plain-English definitions for every PageFork term — sites, versions, credits, leads, people, pipelines, destinations, and more. Group: Reference Published: 2026-04-22 Updated: 2026-10-02 **Need a definition?** This glossary explains every PageFork concept in one sentence, with a link to the full article when one exists. ## Core concepts ### Site A **site** is one PageFork project — one set of pages, one style, one domain. Every site has its own version history, its own leads and people, and its own plan. ### Page A **page** is a single URL inside a site (for example, the home page, an about page, or a pricing page). PageFork sites can be single-page or multi-page; you control this with prompts. ### Generation A **generation** is the first-time creation of a site from your prompt. Generation uses generation credits and typically finishes in under a minute. ### Edit An **edit** is any change you make to an existing site by typing an instruction in plain English. Edits use edit credits. ### Prompt A **prompt** is the natural-language instruction you type to generate or edit a site (for example, "Create a landing page for a dog-training business in Austin"). ### Version A **version** is a saved snapshot of your site at a point in time. Every generation and every edit creates a new version. You can preview any version, revert to it, or fork from it. ### Fork A **fork** is a branch of your version history. Forking lets you explore an alternative direction without losing the current one — useful when you want to try a redesign or test a different hero. ### Fork tree The **fork tree** is the full graph of versions and forks for a site. It's how you navigate and compare directions. ## AI & editing ### Questions and edits PageFork uses one chat composer for everything. **Questions** get a conversational reply without changing the site. **Change requests** apply your instruction and create a new version. See [Questions and edits](/docs/edit-vs-discuss/). ### File upload A **file upload** attaches an image, video, PDF, or other file to a prompt as a URL badge. PageFork reads it for context or places it on your site depending on your message. Uploads are saved to your [media library](/docs/media-library/). See [File uploads](/docs/reference-images/). ### Reference website A **reference website** is a public URL you paste into chat so PageFork can map pages, read content, and screenshot the live site before generating or editing. See [Reference websites](/docs/reference-websites/). ### Cookie consent modal The **cookie consent modal** is PageFork’s built-in banner for gating analytics and marketing cookies. It stays off until you add cookie-setting trackers or ask for a banner. See [Cookie consent and privacy](/docs/cookie-consent-and-privacy/). ### Media library The **media library** is your organization's shared file storage — every upload and generated image is saved here for browsing, filtering, and reuse. See [Media library](/docs/media-library/). ### AI image generation **AI image generation** creates custom visuals on the Images page or inline in the site editor when **Create Image** is enabled. Generated images cost credits and are saved to the media library. See [AI image generation](/docs/ai-image-generation/). ### Model tier A **model tier** is the AI quality level for a generation or edit — **Standard**, **Advanced**, or **Premium**. Higher tiers usually cost more credits. See [Model tiers](/docs/model-tiers/). ## Credits & billing ### Credit A **credit** is PageFork's unit of AI work. Credits are consumed by generations and edits. Credits never expire and are shared by every site in your team; new accounts start with 25 free. See [Credits explained](/docs/credits-explained/). ### Credit pack A **credit pack** is a one-time purchase of credits: 100 for €10, 300 for €25, 750 for €50 or 2000 for €100. Buy them on the **Credits** tab of the Billing page. See [Purchasing credits](/docs/purchasing-credits/). ### Auto top-up **Auto top-up** buys a chosen credit pack with your saved card whenever your balance drops below a threshold you set — at most twice per calendar month. It's off until you turn it on under **Billing → Credits**, and pauses itself if the card is declined. ### Generation credit A **generation credit** is spent the first time you turn a prompt into a site. ### Edit credit An **edit credit** is spent each time you change an existing site with a prompt. ### Site plan A **site plan** is the per-site monthly or yearly plan — **Basic** or **Pro** — that keeps a site live on PageFork's CDN with SSL on your own domain. Each published site needs one; drafts don't. Manage plans on the **Subscriptions** tab of the Billing page. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ### Apex domain An **apex** (or root) domain is the bare domain without a subdomain — for example, `pagefork.ai`. The opposite is `www.pagefork.ai`. See [Apex vs WWW](/docs/apex-vs-www/). ## Publishing & domains ### Publish To **publish** a site is to make its current version live on a custom domain you own. It requires a verified domain and a plan (Basic or Pro) for the site. See [Publishing overview](/docs/publishing-overview/). ### Unpublish To **unpublish** a site is to take it offline while keeping all its versions, submissions and leads intact. ### Preview link A private, revocable URL that shows a chosen draft version to anyone you send it to — free, and without a domain or plan. The way to share work before publishing. See [Preview links](/docs/preview-links/). ### Custom domain A **custom domain** is any domain you own, connected to a PageFork site via two DNS records. See [Connecting your domain](/docs/connecting-your-domain/). ### SSL certificate PageFork automatically issues and renews a free **SSL certificate** (via Let's Encrypt) for every custom domain once DNS verification succeeds. ## Forms & submissions ### Form A **form** is a lead-capture block on a page (contact, waitlist, booking). PageFork generates forms from your prompt; every submission becomes a person and a lead on the **Leads** page. See [Forms overview](/docs/forms-overview/). ### Submission A **submission** is one entry someone made by filling out a form on your site, stored exactly as it was sent. Each submission is filed under a person and attached to one of their leads, and can be exported to CSV. ### Field schema A **field schema** is the list of fields a form sends. PageFork uses it to tell which answers are the person's name, email, phone and company, and which become custom fields. See [Form field schemas](/docs/form-field-schemas/). ## Leads & people ### Lead A **lead** is one piece of potential business with a person — an enquiry you work from first contact to won or lost. A lead sits in a stage of the pipeline and collects submissions, notes and follow-ups. A person has at most one open lead at a time. See [Leads overview](/docs/leads-overview/). ### Person A **person** is one human being on one site: name, email, phone, company, tags and custom fields. A person can have many leads over time but stays one record, recognised by email and then by phone. See [People](/docs/people/). ### Pipeline The **pipeline** is a site's ordered list of stages that leads move through. Each site has its own. See [Lead pipeline](/docs/lead-pipeline/). ### Stage A **stage** is one step in the pipeline. Every stage is either **open** (still being worked), **won** or **lost**. New sites start with New, Contacted, Qualified, Won and Lost; owners and admins can change them. ### Follow-up A **follow-up** is a to-do on a lead with a due date — "call back Tuesday". Follow-ups appear on the lead and in the calendar until completed. See [Follow-ups and tasks](/docs/follow-ups-and-tasks/). ### Activity An **activity** is something you log against a lead: a **note**, **call**, **email** or **meeting**. Activities appear on the timeline of the lead and of the person, alongside submissions and the history of changes. ### Custom field A **custom field** is an extra detail kept on each person beyond the four built-in ones — budget, event date, service wanted. Fields are picked up from your forms or added by hand. See [Custom fields](/docs/custom-fields/). ### Tag A **tag** is a short free-form label on a person, such as `vip` or `wedding`. Tags are lower-case and belong to the person, so they show on all of that person's leads. See [Tags](/docs/tags/). ### Merge To **merge** is to fold two records for the same person into one, moving every lead, submission and note onto the record you keep. It can't be undone. See [Merging duplicates](/docs/merging-duplicates/). ### Erase To **erase** a person is to permanently delete them together with their leads, submissions, notes and history. See [Erasing a person](/docs/erasing-a-person/). ## Plans ### Basic **Basic** (€5/month or €50/year per site) publishes a site on your own domain with SSL. Forms capture every submission; the **Leads** page shows a plain list of submissions with CSV export, and you get the notification email. A site without Pro has Basic features. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ### Pro **Pro** (€14/month or €140/year per site) unlocks the full CRM for a site — the board, list, calendar and people views, lead records, custom fields, tags, import — plus destinations, Zapier and Make, the analytics dashboard, and no "Built with PageFork" footer. See [Basic and Pro plans](/docs/basic-and-pro-plans/). ### Pro trial The **Pro trial** is the 14 days of full Pro features that every new site starts with. When it ends, the site shows the Basic view unless you upgrade; your submissions and leads are kept. ### "Built with PageFork" footer The **Built with PageFork** footer is a small credit shown at the bottom of every page of a published Basic site. Pro removes it. ### Storage allowance The **storage allowance** caps how much your team can keep in the [media library](/docs/media-library/#storage-allowance): 100 MB or 100 files free, plus 500 MB / 500 files per Basic site and 2 GB / 2000 files per Pro site. When it's full, uploads are refused until you delete files or add or upgrade a plan; nothing is deleted for you. ## Integrations ### Destination A **destination** passes form submissions on to another tool as they arrive — a Google Sheet, email, Kit, Mailchimp, a webhook, Zapier or Make. Destinations are set per site, under the **Forms** tab of the editor. See [Destinations overview](/docs/destinations-overview/). ### Stage trigger A **stage trigger** makes a destination fire when a lead *moves into* a chosen stage, instead of (or as well as) when a new submission arrives — for example, tell another system when a lead is won. ### API key An **API key** lets the PageFork Zapier and Make apps act on behalf of your team. Owners and admins create and revoke keys on the **Team** page; a key is shown only once. See [API keys](/docs/api-keys/). ### Managed hook (Zapier/Make) A **managed hook** is a destination that the Zapier or Make app creates for you when you switch on a Zap or scenario. It is labelled **Managed by Zapier** or **Managed by Make**, and you change it in that tool rather than in PageFork. See [Zapier app](/docs/zapier-app/) and [Make app](/docs/make-app/). --- Missing a term? Email [support@pagefork.ai](mailto:support@pagefork.ai) and we'll add it. --- # Going live checklist Source: https://pagefork.ai/docs/going-live-checklist/ Description: What to verify before you publish to the public. Group: Publishing Updated: 2026-10-02 Once something is live, the bar for quality jumps. Run this checklist before your first real publish — it takes five minutes and prevents almost every "I should have caught that" moment. ## Content - [ ] Every page's **copy is proofread**. Ask PageFork to proofread if you want a second pass. - [ ] **Placeholders are replaced** — no "Lorem ipsum", "Your name here", or `#` buttons. - [ ] **Images are final** — no stock-photo watermarks, no unlicensed photography, no low-resolution hero images. - [ ] **Contact details are correct** — phone numbers, addresses, email addresses, social links all work. ## Layout and responsive - [ ] **Desktop preview** looks balanced at wide widths. - [ ] **Tablet preview** (768 px) has no broken layouts. - [ ] **Mobile preview** (375 px) has readable copy, tappable buttons, and a working nav. See [Preview devices](/docs/preview-devices/). - [ ] **Long content** doesn't overflow on mobile (tables, code blocks, long headlines). ## Forms - [ ] Every form has the fields you actually want. - [ ] You've **submitted a test entry** to every form after publishing, and checked it arrived on the [Leads page](/docs/leads-overview/). - [ ] You've **received the email notification** (check spam). See [Email notifications](/docs/email-notifications/). ## Plan, domain and SSL - [ ] The site has a **Basic or Pro plan** — Publish won't run without one. If you need leads, destinations or the analytics dashboard after the 14-day Pro trial, pick Pro. See [Basic and Pro plans](/docs/basic-and-pro-plans/). - [ ] Your **custom domain** shows status **Active** — publishing is blocked until one is verified. See [Connecting your domain](/docs/connecting-your-domain/). - [ ] The site loads over **HTTPS** (padlock in the browser). - [ ] Both `yourbrand.com` and `www.yourbrand.com` resolve if you want both. See [Apex vs www](/docs/apex-vs-www/). ## Links and navigation - [ ] All nav links go where you expect. - [ ] All CTAs lead to a real destination (form, booking tool, pricing page). - [ ] No accidental links to `/draft`, `/internal`, or similar. ## Analytics and SEO - [ ] **Page titles and descriptions** are meaningful on every page. Ask PageFork to "set a great title and meta description on every page" if you haven't already. - [ ] **Analytics** is installed (if you want it). - [ ] If you use analytics or chat that sets cookies, the [cookie consent banner](/docs/cookie-consent-and-privacy/) appears in an incognito window and Reject blocks those scripts. - [ ] **Favicon** is yours. ## Test on a real phone The in-editor preview is good, but real phones catch issues the preview can't (touch scrolling, viewport quirks, font rendering). Publish first, then test on your phone. ## Next - [SEO basics](/docs/seo-basics/) - [Publishing overview](/docs/publishing-overview/) - [Connecting your domain](/docs/connecting-your-domain/) --- # Google Sheets Source: https://pagefork.ai/docs/google-sheets-destination/ Description: Add a row to a Google spreadsheet for every form submission, with no copy-pasting and no Zapier in between. Group: Destinations Updated: 2026-09-30 The Google Sheets destination keeps a spreadsheet of your form submissions up to date by itself. Each new submission becomes a new row, a second or two after it arrives. It's the quickest way to give your whole team, including people who never log in to PageFork, a live list of who got in touch. > Google Sheets is a [destination](/docs/destinations-overview/), which > is part of the **Pro** plan. See > [Basic and Pro plans](/docs/basic-and-pro-plans/). ## What you need - A Google account. - To be an **owner or admin** of your PageFork team. You do not need to create the spreadsheet first. PageFork creates it. ## Setting it up 1. Open your site in the editor, open **Settings** and go to the **Forms** tab. 2. Under **Destinations**, click **Add** and choose **Google Sheets**. 3. Give it a **Name** and pick the **Form scope**: one form, or **All forms**. 4. Under **Google account**, choose an account you've already connected, or click **Connect Google account**. A Google window opens and asks you to allow PageFork. Approve it and come back to the editor. 5. Click **Create Google Sheets destination**. PageFork then creates a new spreadsheet in that Google account and starts filling it. **Open spreadsheet** on the destination takes you straight to it. ### What PageFork can see in your Google account Only the spreadsheets it creates itself. PageFork asks Google for the narrowest permission there is: access to files made by PageFork, plus your email address so the account has a label. It cannot read, list or change any of your other files. ## What the spreadsheet looks like - The file is named **"Your site name — Form leads"**. - It has one tab, called **Leads**. - The first two columns are **Submitted at** and **Form**. - After those comes one column per field in your form, named exactly as the field is named: `name`, `email`, `message` and so on. Every submission adds one row at the bottom. ### When your form changes If a submission contains a field the spreadsheet has no column for, PageFork adds a new column at the right-hand end and fills it in. Existing columns are never moved, renamed or removed, so rows you already have stay exactly as they were. ### What you can and can't change in the sheet The sheet is yours. You can sort, filter, colour, add notes and add formulas in other tabs. Two things to leave alone: - **Don't rename the headers in row 1.** PageFork finds the right column by its header text. Rename `email` to `E-mail` and PageFork will no longer recognise it, and will add a fresh `email` column at the end. - **Don't rename the Leads tab**, and don't delete the file. You can move the file to another folder or share it with other people as usual. ## What is and isn't sent - One row per **form submission**. If the same person submits twice, that's two rows. - The values are what the visitor **originally submitted**. A value you [correct later](/docs/correcting-submission-data/) in PageFork is not rewritten in the sheet. - Stage changes are not written. Google Sheets only has the **New submission** trigger. For "tell me when a deal is won", use an [email destination](/docs/email-destinations/). - Leads you add by hand or import don't add rows. See [what fires a destination](/docs/destinations-overview/#what-fires-a-destination-and-what-doesnt). ## Testing it Click **Send test** on the destination. A sample row appears in the sheet, using your form's real field names with placeholder values. Delete the row afterwards if you like. ## Connected Google accounts Google accounts are connected once for your whole **team**, not per site. You'll find them on the **Team** page under **Connected accounts**, where you can connect another account or **Disconnect** one. - A team can have up to **5** connected accounts. - Any number of Sheets destinations, across all your sites, can use the same account. ### Disconnecting and reconnecting Disconnecting an account switches off every Sheets destination that uses it, since none of them can deliver any more. The destinations and spreadsheets are not deleted. When you connect the **same** Google account again, those destinations switch back on by themselves. Ones you had paused yourself stay paused. The same thing happens if you remove PageFork's access from Google's side, under your Google account's security settings. The next delivery fails, PageFork marks the account as disconnected, and the fix is to connect it again. ## Limits - **3** enabled Google Sheets destinations per site. - **5** connected Google accounts per team. ## Troubleshooting **The destination was disabled and says the spreadsheet is missing.** The file was deleted, or PageFork's access to it was removed. PageFork can't recreate a deleted file in place. Delete the destination and add a new one, which creates a fresh spreadsheet. **The destination was disabled and mentions the Google account.** The account was disconnected, or access was revoked at Google. Connect the same account again on the **Team** page and it switches back on. **A column is empty for new rows.** Its header in row 1 was probably changed. Look at the far right of the sheet for a new column with the original name, and move the data back or restore the old header. **Rows stopped appearing.** Open the destination and read **Recent deliveries**. See the [delivery log](/docs/destinations-overview/#the-delivery-log). ## Next - [Destinations overview](/docs/destinations-overview/) - [Email destinations](/docs/email-destinations/) - [CSV export](/docs/csv-export/) - [Team and roles](/docs/team-and-roles/) --- # Importing people Source: https://pagefork.ai/docs/importing-people/ Description: Bring an existing contact list into PageFork from a CSV file, with a preview of exactly what will happen before anything is saved. Group: Leads Updated: 2026-09-30 If you already have a customer list — in a spreadsheet, an old CRM, a mailing tool — you can bring it into PageFork as [people](/docs/people/) with a CSV file. The import is a three-step wizard: **File**, **Map columns**, **Review**. The review step shows what the import *would* do before it does anything, so you can go back and fix the mapping as often as you like. > Importing is a **Pro** feature, and only **owners and admins** can do > it. See [Basic and Pro plans](/docs/basic-and-pro-plans/) and [Team > and roles](/docs/team-and-roles/). ## Before you start Export your list as a **CSV** file. In Excel or Google Sheets that's **Save as** or **Download** → CSV. The file needs: - **A header row.** The first line names the columns. - **At least one data row** under it. - **A name, email or phone column.** Every person needs at least one of the three. PageFork is forgiving about the rest: - Columns can be separated by commas, semicolons or tabs. It works out which from the header row. - Values containing commas or line breaks are fine as long as they're wrapped in double quotes, which spreadsheet apps do for you. - Blank lines are skipped. - A column with no header is called **Column 3** (or whatever its position is). Two columns with the same header get **(2)** added to the second. ## Step 1: File 1. Open **Leads**, pick the site, and choose the **People** tab. 2. Click **Import CSV**. 3. Drop your file onto the box, or click **choose a file**. PageFork shows the file name, how many rows and columns it found, and the first three rows so you can check it read the file correctly. If something is wrong you'll see one of: | Message | Meaning | |---|---| | **No header row found. The first line should name the columns.** | The file is empty. | | **No data rows below the header.** | There's a header but nothing under it. | | **Couldn't read that file.** | The file couldn't be opened. Export it again as CSV. | Click **Next**. ## Step 2: Map columns Each column in your file is listed with a sample value and an **Import as** dropdown. This is where you tell PageFork what each column means. | Import as | Use it for | |---|---| | **Name** | The person's name | | **Email** | Their email address | | **Phone** | Their phone number | | **Company** | Their company | | **Tags** | [Tags](/docs/tags/), separated by commas or semicolons | | A custom field | Any of the site's visible [custom fields](/docs/custom-fields/) | | **Create new field…** | Make a new custom field from this column | | **Skip** | Leave the column out | ### What PageFork maps for you Column headers are matched ignoring capitals and punctuation, so `E-mail`, `email` and `EMAIL` are all the same. | Mapped to | Headers recognised | |---|---| | **Name** | name, full name, first name, given name, last name, surname, family name, contact, contact name, person | | **Email** | email, e-mail, email address, mail | | **Phone** | phone, phone number, tel, telephone, mobile, mobile phone, cell, cell phone | | **Company** | company, company name, organisation, organization, org, business, employer | | **Tags** | tags, tag, labels, label | A header that matches the label of one of your custom fields is mapped to that field. Everything else starts as **Skip**. If two columns would map to the same thing, the first one gets it and the later ones start as **Skip**. ### First and last name in separate columns **Name** is the one target you can use more than once. When your file has separate first-name and last-name columns, PageFork maps both to **Name** automatically and joins them with a space, in the order the columns appear in the file. ### Creating a new field Choose **Create new field…** and a label box appears, pre-filled with the column header. Change it if you like. The field is created as a **Text** field when the import runs; you can change its type afterwards in the fields editor. ### Two options below the table **Also create a lead for each person.** Off by default — the import just adds people. Tick it to also open a lead for each person, and pick the stage they should start in. Only open stages are offered. People who already have an open lead don't get a second one. **Add tags to everyone imported.** Tags typed here go onto every person in the file, on top of any tags in a **Tags** column. Useful for marking where the list came from, such as `imported-2026`. ### When Next is greyed out A line under the options says what's missing: - **Map at least one column to Name, Email or Phone** - **Each target can only be used once** — the offending dropdowns are marked **Used more than once**. Only **Name** may repeat. - **Give every new field a label** ## Step 3: Review PageFork now runs the whole import as a rehearsal. **Nothing is saved yet.** You get a summary headed **What this import will do**: | Figure | Meaning | |---|---| | **Rows** | Data rows in the file | | **Will be added** | New people that will be created | | **Already here** | Rows that match a person already on the site | | **Skipped** | Rows that can't be imported | | **Leads to create** | New leads, if you ticked the option | | **Fields to create** | The new fields that will be made | If any rows will be skipped, they're listed underneath with the row number and the reason. Row 1 is the first row under the header. The first 50 are shown. The usual reason is **No name, email or phone** — the row is empty in all the columns that identify a person. A row whose only details are an email or phone that isn't valid is skipped too, with **Invalid email** or **Invalid phone**. A second list shows rows that will be imported **with a problem**: the person has a name, but their email or phone isn't valid, so it's left out. The message says which, for example **Imported without email: not a valid email**. Fix the address in your file and import again to fill it in, or add it on the person's page afterwards. Not happy? Click **Back**, adjust the mapping, and come forward again. The rehearsal re-runs each time. When the numbers look right, click **Import N people**. The button is unavailable if no rows can be imported. When it finishes, the summary changes to **Import complete** with the real counts: **Added**, **Matched existing**, **Skipped**, **Leads created**, **Fields created**. Click **Done**. ## How existing people are matched Import uses the same rules as form submissions — see [People](/docs/people/#how-pagefork-recognises-a-returning-person). - A row whose **email** matches someone on the site is that person. If the email matches nobody, the **phone** is tried. - A matched person only has their **gaps filled**. Empty details and empty custom fields take the value from the file. Anything already filled in is **kept** — an import never overwrites existing data. - Tags are added to whatever tags the person already has. - Rows that match nobody become new people, shown as first seen **via import**. Two rows in the same file with the same email end up as one person: the first row creates them, the second counts as **Already here**. A value in the Email column that isn't a valid address is ignored rather than saved. ## Large files Files are imported **2,000 rows at a time**. A bigger file is sent in several batches, one after another, and the wizard shows which batch it's on. You can't close the wizard while it's working. If a batch fails partway through a large file, the batches before it are already saved. Click the import button again and PageFork carries on from the batch that failed rather than starting over. ## Good to know **There is no undo.** Imported people stay until you remove them, and people can only be [erased one at a time](/docs/erasing-a-person/). Read the review step carefully, and try a small file first if you're unsure. **Far more "Already here" than expected.** Those rows share an email or phone with someone already on the site, or with an earlier row in the file. **Imported the same file twice.** Nothing is duplicated as long as the rows have an email or phone: they're all matched the second time. Rows with only a name are added again, because names aren't used for matching — tidy those up with [Merging duplicates](/docs/merging-duplicates/). **A custom field isn't in the dropdown.** It's hidden. Unhide it in the fields editor first. **The Import CSV button isn't there.** You're a member, not an owner or admin — or the site is on Basic. ## Next - [People](/docs/people/) - [Custom fields](/docs/custom-fields/) - [Tags](/docs/tags/) - [Merging duplicates](/docs/merging-duplicates/) --- # Insufficient credits Source: https://pagefork.ai/docs/insufficient-credits/ Description: Out of credits mid-edit, or hitting an "Insufficient Credits" modal. Group: Troubleshooting Updated: 2026-10-04 If you see the **Out of credits** banner in chat or an **Insufficient Credits** modal when creating a new site, you're at 0 credits — the AI won't run until you top up. ## Immediate fix 1. Click **Get credits** on the banner or modal. 2. You're sent to **Billing → Credits**. 3. Pick a pack and complete checkout. See [Purchasing credits](/docs/purchasing-credits/). 4. Credits arrive instantly after Stripe confirms payment. 5. Return to the editor. The banner clears and you can continue. ## What's safe to do with 0 credits - Open any site and view the preview. - Undo and redo through versions. - Publish or republish a site (publishing doesn't consume credits). - Read chat history. - Manage domains, view submissions, download CSVs. The only thing that's blocked is **running the AI** — new messages, retries, and new site generations. ## I just bought credits, why am I still blocked? - **Payment still processing.** If Stripe is verifying the payment method (especially on SCA / 3D Secure), the top-up can lag the return to PageFork by up to a minute. Refresh the editor. - **Browser tab cached the old balance.** Refresh. - **Bought on a different account.** Check the account email on the Billing page matches the one you expect. - **Auto top-up is paused.** If you rely on auto top-up, check its card on **Billing → Credits**. A declined card or a missing saved card pauses it until you turn it back on. ## I want to avoid running out - **Turn on auto top-up.** PageFork buys a pack for you when your balance drops below a threshold you choose, up to twice a month. See [Auto top-up](/docs/purchasing-credits/#auto-top-up). - **Buy a bigger pack** so you're not topping up often. Bigger packs are cheaper per credit: 2000 credits cost €100, against €10 for 100. - **Ask questions before big edits** to explore options cheaply — see [Saving credits](/docs/saving-credits/). - **Keep an eye on the Credits tab** — it shows balance and recent usage. ## Refunds Credits consumed by **failed generations** are automatically refunded where our policy applies. Credits consumed by successful generations aren't refundable even if you don't like the result — prefer Undo and a better prompt over Retry in that case. ## Next - [Credits explained](/docs/credits-explained/) - [Purchasing credits](/docs/purchasing-credits/) - [Saving credits](/docs/saving-credits/) --- # Integrations overview Source: https://pagefork.ai/docs/integrations-overview/ Description: How to add analytics, pixels, embeds, chat widgets, and other third-party tools to a PageFork site. Group: Integrations Updated: 2026-10-02 A PageFork site is a regular static HTML site, so almost anything a normal website can do with client-side code — analytics, pixels, iframe embeds, chat widgets, external payment links — drops in cleanly. This group walks through the most common integrations. If the one you need isn't listed, the same pattern works for anything that ships with an HTML snippet. ## What you can integrate Anything that runs **client-side in the browser**: - JavaScript snippets (analytics, pixels, tag managers, heatmaps). - `