Skip to main contentWhere does your team stand on AI adoption?
CONTACT SALESSTART BUILDING
Landing pages
Blog Article
Hero Section
Navigation Links
Announcement Bar
Product Details
Product Editorial
Homepage
Request a blueprintGo to developer docs

Integrate Landing Pages

Landing pages are the most common application of integrating page models.

Model definition

You can use the standard Page model. The Page model that Builder comes by default is named page. For this example, you'll want to make sure you have a couple of fields:

nametypenotes

title

string

To populate the page <title>

image

file

Optional, to populate og:image

You can also optionally add additional fields for other metadata.

Example Code

For landing pages in all frameworks:

  1. Make a catchall route.
  2. Check for a page at the current route. If one doesn't exist — and you're not actively previewing or editing — display a 404.

Add this as a catchall page; for example, pages/[...page].tsx (or .tsx):

// pages/[...page].tsx import React from "react"; import { useRouter } from "next/router"; import { BuilderComponent, builder, useIsPreviewing } from "@builder.io/react"; import { BuilderContent } from "@builder.io/sdk"; import DefaultErrorPage from "next/error"; import Head from "next/head"; import { GetStaticProps } from "next"; // Replace with your Public API Key builder.init(YOUR_API_KEY); // Define a function that fetches the Builder // content for a given page export const getStaticProps: GetStaticProps = async ({ params }) => { // Fetch the builder content for the given page const page = await builder .get("page", { userAttributes: { urlPath: "/" + ((params?.page as string[])?.join("/") || ""), }, }) .toPromise(); // Return the page content as props return { props: { page: page || null, }, // Revalidate the content every 5 seconds revalidate: 5, }; }; // Define a function that generates the // static paths for all pages in Builder export async function getStaticPaths() { // Get a list of all pages in Builder const pages = await builder.getAll("page", { // We only need the URL field fields: "data.url", options: { noTargeting: true }, }); // Generate the static paths for all pages in Builder return { paths: pages.map((page) => `${page.data?.url}`).filter(url => url !== '/'), fallback: 'blocking', }; } // Define the Page component export default function Page({ page }: { page: BuilderContent | null }) { const router = useRouter(); const isPreviewing = useIsPreviewing(); // If the page content is not available // and not in preview mode, show a 404 error page if (!page && !isPreviewing) { return <DefaultErrorPage statusCode={404} />; } // If the page content is available, render // the BuilderComponent with the page content return ( <> <Head> <title>{page?.data?.title}</title> </Head> {/* Render the Builder page */} <BuilderComponent model="page" content={page || undefined} /> </> ); }

Tip: If you don't have an index route, such as pages/index.tsx , use pages/[[...page.tsx]] with two sets of square brackets. The two square brackets means that Builder handles the app's home page.

The single set of square brackets, in this tutorial, assumes that you are keeping your home page.

For more detailed instructions, visit Integrating Pages.

Enter some text...