> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linkrunner.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Linkrunner has a remote MCP server at https://mcp.linkrunner.io/mcp. People sign in to Linkrunner in a browser popup (OAuth), so there is no token to copy. New users sign up in the same popup.
> If a person asks you to sign them up, log them in, or set Linkrunner up and you have no Linkrunner tools, do not send them to the website: tell them to add the connector and walk them through it. In Claude: Customize (or Settings), Connectors, Add custom connector, name Linkrunner, URL https://mcp.linkrunner.io/mcp, leave the OAuth fields empty, click Connect, sign in or sign up in the popup, click Allow, then turn the connector on for the chat and ask again.
> Before sign-in, only get_linkrunner_overview and search_documentation work. Any other tool asks the person to sign in first.
> To set a person up: connect the server, then call get_my_account, list_projects, find_app_in_store (confirm the right app with the person), and create_project. create_project returns the project ID and the SDK token. Install the SDK with that token. get_sdk_configuration returns the token again later.
> Rules: a company email is needed to create a project (Gmail accounts cannot), an app project needs a live App Store or Play Store listing, a person can create up to 3 projects per day from an AI assistant, and using an existing project needs the Admin, Owner or Manager role.
> Claude Code: claude mcp add --transport http linkrunner https://mcp.linkrunner.io/mcp, then run /mcp to sign in.
> Guides: connector setup and tool reference at https://docs.linkrunner.io/features/mcp, manual setup at https://docs.linkrunner.io/quickstart. To integrate the SDK in a codebase, use the @linkrunner/skills package: https://docs.linkrunner.io/ai-agent-skills

# Custom landing pages

> Show your own pages before the app or store opens, checked and sped up by Linkrunner, and choose which page each Meta ad or campaign link shows

<video src="https://media.assets.linkrunner.io/linkrunner-custom-landing-pages.mp4" poster="https://media.assets.linkrunner.io/linkrunner-custom-landing-pages-thumbnail.jpg" controls preload="metadata" playsInline />

When someone taps your link inside Instagram, Facebook, LinkedIn or a similar app, Linkrunner shows a short [intermediary page](/features/social-media-intermediary-page) before opening your app or the store. You can replace it with your own pages, for example an offer, reviews or a hero image, and use a different page for each Meta ad set, Meta ad or campaign link.

Linkrunner checks every page, fixes what it can, and shows you the result before anyone sees it. Opening the app, picking the right store and crediting installs to your campaigns keep working.

> [!NOTE]
>
> Landing pages are being rolled out project by project. If you don't see **Landing Pages** in Settings, contact [support@linkrunner.io](mailto:support@linkrunner.io).

## When your pages are shown

Your pages replace the Linkrunner page wherever it appears today:

* Linkrunner campaigns with **Open in app** turned on
* Links opened inside the Instagram, Facebook, LinkedIn, X, Snapchat and TikTok apps, and Threads on iPhone
* [Meta web-to-app](/ad-networks/meta-web-to-app) campaigns, ad sets and ads

Campaigns with their own iOS or Android redirect URL skip the page on phones, and desktop visitors go to your website. Google web-to-app campaigns always keep the Linkrunner page.

Your pages show only on links that use your own domain. Links on a shared Linkrunner domain, such as `yourapp.linkrunner.io`, keep the Linkrunner page.

## How your page differs from the Linkrunner page

| | Linkrunner page | Your page |
| - | - | - |
| Visitors see it | Up to about 2 seconds, then it moves on by itself | Until they tap your button |
| Taps needed to reach the store | Usually 0 | 1 |
| App already installed | Opens straight away | Opens straight away |
| Size | About 45 KB | Up to 500 KB |

Because visitors tap to continue, some will leave without tapping. Try a new page on one ad set or campaign first, then compare installs before you use it everywhere.

## Before you upload

* **Format:** a `.zip` with `index.html` at the top and every image and font next to it, or a single `.html` file. Up to 10 MB.
* **Download button:** point it at `{{linkrunner_link}}`, or add `data-linkrunner="cta"` to it. If you forget, Linkrunner does it for you.
* **Phones only:** design for screens 320 to 430 px wide.
* **Up to 50 pages** per project.

```html theme={null}
<a href="{{linkrunner_link}}" data-linkrunner="cta">Start running free</a>
```

> [!TIP]
>
> Don't worry about image sizes, fonts or store links. Linkrunner fixes those for you.

## Add and approve a page

**1. Open Landing Pages**

Go to [**Settings → Landing Pages**](https://dashboard.linkrunner.io/dashboard/settings/landing-page). Your pages are listed with their status, where they show and their size. Click **New page** or drop a file at the bottom of the list.

![Landing Pages library with a page in each status](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/library.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=525ec25aa2cdf24abef5cfd3976cb912)

**2. Upload your page**

Choose your `.zip` or `.html` file.

![Uploading a page](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/upload.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=f612f98e3f9acd6d2f0203c19dfcb8c4)

**3. Watch the check**

Linkrunner opens your page the way a visitor would: on an Android phone, inside Instagram, on a slow mobile network. It usually takes under a minute.

![Your page being checked on a slow network](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/checking.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=73ed35e04174df86dbc42596f97e8f91)

**4. Let Linkrunner fix it**

The report lists what needs to change before your page can go live. Click **Fix it for me**. Choose **Required only** to make just the changes your page needs, or **Everything** to also make it faster. Click an item to see which files it touches.

![Check report with the Fix it for me button](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/report.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=900f36607bb719d632044eb10f3a929e)

**5. Wait for the email**

Fixing takes about 2 minutes. You can leave the page: Linkrunner emails you when it is ready, or if it could not fix the page. Nothing goes live until you approve it.

![Fixes in progress](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/fixing.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=92640a40829f9b4b4242ab9b8e5f63e0)

**6. Review the result**

Check the summary, then compare your page before and after inside Instagram, iPhone Safari and Android Chrome. The ring marks your download button. Scan the QR code to try the page on your own phone. The preview does not count as a click.

![Summary and before and after phones with the download button highlighted](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/review.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=5da4fb532b1fb5f83e91ffca79b5687c)

**On a slow network** shows what a visitor sees second by second, before and after the fixes.

![Filmstrip of the page loading on a slow network, before and after](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/slow-network.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=b1ddc3ce64002b725ef1cf9695523c9b)

**7. Approve it**

Click **Approve and go live**. Choose **Make it my default page** to use it for every Meta ad and link that has no page of its own, or **Only the Meta ads and links I pick** to choose where it shows yourself. Your links switch over within a minute.

![Choosing whether the page becomes the default](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/approve.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=bbfbef92984dcc2196454ca44bfa92fc)

## Choose where each page shows

Open the **Where they show** tab to pick a page for each Meta web-to-app campaign, ad set or ad, and for each Linkrunner campaign link. For each click, Linkrunner uses the most specific choice it finds:

1. The ad
2. The ad set
3. The campaign
4. Your default page
5. The Linkrunner page, if none of the above is set

![Where they show: Meta campaigns, ad sets and ads, and Linkrunner campaign links](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/where-they-show.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=0739286defb245293e56e02ced93666b)

* **Meta web-to-app:** pick a page for a whole campaign, an ad set or a single ad. Pages for ad sets and ads need `adset_id={{adset.id}}` and `ad_id={{ad.id}}` in the ad's URL parameters. The URL parameters in our [Meta web-to-app setup](/ad-networks/meta-web-to-app) already include them, and **Copy URL parameters** gives them to you again. Without `ad_id`, clicks use the ad set's page.
* **Linkrunner campaigns:** pick a page in the **Links** table, or in the **Landing page** field under **Advanced Options** when you create or edit a campaign.

![Landing page field when creating a campaign](https://mintcdn.com/linkrunner-01ef8e08/ldr-9DhhfqYSd0L3/images/custom-landing-page/campaign-picker.webp?fit=max\&auto=format\&n=ldr-9DhhfqYSd0L3\&q=85\&s=993eda5d3da611a076e58ba746bb681e)

Only pages that passed the checks can be picked. Pages that still need fixes, are being checked or are waiting for your approval are greyed out. A page that is in use cannot be deleted: pick another page for those ads and links first.

## What Linkrunner fixes and what needs you

| Linkrunner fixes it | You fix it |
| - | - |
| Images larger than they show on screen | A page still over 500 KB because of its content, such as a video background |
| Fonts loaded from Google Fonts or other servers | Forms that collect personal data, such as a phone number |
| Download buttons that link straight to the App Store or Play Store | A page that needs a login or your own servers |
| Code that picks a store by phone type | Content loaded from other sites, such as embedded videos or chat widgets |
| Code that sends visitors to another page by itself | Analytics and ad pixels. Linkrunner lists the ones it finds |
| Search engines listing the page | Anything that would change your design or wording |

Fixes are designed to keep your design the same. Linkrunner compares screenshots of your page before and after on iPhone and Android and shows you the result before anything goes live.

## Change or stop using a page

To change a page, upload a new file for it from its row. Linkrunner checks every new version, and your current version stays live until you approve the new one. To stop using a page, pick another page, or the Linkrunner page, for the ads and links that use it.

## Troubleshooting

> **I don't see Landing Pages in Settings**
>
> Landing pages are rolled out per project. Contact [support@linkrunner.io](mailto:support@linkrunner.io) and we will check your project.

> **The report says something needs me**
>
> Linkrunner only fixes changes that keep your design the same. The item tells you what to change in your file. Click **Upload a different file** to add the new version.

> **My page shows Check failed**
>
> Open the page to see the reason. The most common causes are a `.zip` without `index.html` at the top and a file over 10 MB. Upload a corrected file.

> **I can't pick my page for an ad or campaign**
>
> Only pages that passed the checks can be picked. Open the page and finish the fix or approval first.

> **A Meta ad set or ad shows a different page than I picked**
>
> Linkrunner uses the ad's page, then the ad set's, then the campaign's, then your default. Check **Where they show** for a more specific choice. If every ad shows its ad set's page, the ad's URL parameters are missing `ad_id={{ad.id}}`.

> **My page shows Fix failed**
>
> Open the page to see why the fix could not finish. Click **Fix it for me** to try again, or upload a corrected file.

> **There is no QR code, or my links still show the Linkrunner page**
>
> Your pages and their previews need a link domain of your own. Links on a shared Linkrunner domain, such as `yourapp.linkrunner.io`, keep the Linkrunner page. Contact [support@linkrunner.io](mailto:support@linkrunner.io) to set up your own domain.

> **A Google web-to-app campaign shows the Linkrunner page**
>
> This is expected. Google web-to-app campaigns always keep the Linkrunner page.

> **The wrong element is used as the download button**
>
> Add `data-linkrunner="cta"` to your download button in your file and upload the new version.

> **Fewer visitors reach the store than with the Linkrunner page**
>
> This is expected: visitors now need to tap. Put your button where it is visible without scrolling, keep the page light, and try it on one ad set or campaign first. To go back, pick the Linkrunner page for it.

> **A link still shows the Linkrunner page**
>
> Check that **Open in app** is on for the campaign and that it has no iOS or Android redirect URL. Then check that the campaign, or your default page, has a page selected.

**Need help?** Contact [support@linkrunner.io](mailto:support@linkrunner.io)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.