# Add a waitlist component to React and Next.js > Mount a LaunchList form in React, Next.js, Vue or Svelte with one function call, or build a fully headless form against the capture endpoint. Source: https://getlaunchlist.com/help/docs/integrations/react --- In a single-page app the form's target element usually does not exist when the page loads, so mounting is explicit rather than automatic. You have two paths: **mount our form**, or **build your own and post to the endpoint**. ## Mount our form Load the runtime once in your app shell: ![Embed & API, Your website with React chosen, and the React snippet to copy under Add your signup form.](https://app.getlaunchlist.com/images/docs/integrations/react/01-embed-snippet.webp "Pick React to get the snippet for your app.") ```html ``` Then mount it from a component: ```jsx // frm_8Kd2Qm4Rp9 is an example ID; use your own from Embed & API → Your website import { useEffect } from 'react'; export function Waitlist() { useEffect(() => { window.LaunchList?.mount('#waitlist', { form: 'frm_8Kd2Qm4Rp9' }); }, []); return
; } ``` The form renders inside a **shadow root**, so it cannot collide with your app's CSS in either direction, and it takes the design you pick in the form editor, under **Design**. > [!NOTE] Mount after the element exists, not before > `mount()` needs a real DOM node. Calling it during render, or in a server component, finds > nothing. `useEffect` runs after commit, which is exactly the right moment. ### Next.js Load the runtime with `next/script` and mount in a client component: ```jsx // app/layout.tsx import Script from 'next/script'; export default function RootLayout({ children }) { return ( {children}