feat: add calendly booking links
This commit is contained in:
parent
2757e36bdd
commit
614eded6b4
@ -2,6 +2,11 @@ export const publicCoachSite = {
|
|||||||
workspaceName: 'Coaching SaaS Workspace',
|
workspaceName: 'Coaching SaaS Workspace',
|
||||||
footerLine: 'Coaching beyond the session.',
|
footerLine: 'Coaching beyond the session.',
|
||||||
assessmentPath: '/intake/?package=leadership-assessment',
|
assessmentPath: '/intake/?package=leadership-assessment',
|
||||||
|
calendly: {
|
||||||
|
assessmentUrl: 'https://calendly.com/your-coach/coaching-assessment',
|
||||||
|
oneOnOneUrl: 'https://calendly.com/your-coach/one-on-one-coaching-session',
|
||||||
|
packageConsultUrl: 'https://calendly.com/your-coach/package-consult',
|
||||||
|
},
|
||||||
socialLinks: [
|
socialLinks: [
|
||||||
{
|
{
|
||||||
label: 'LinkedIn',
|
label: 'LinkedIn',
|
||||||
@ -46,7 +51,8 @@ export const publicCoachSite = {
|
|||||||
name: 'Leadership Assessment',
|
name: 'Leadership Assessment',
|
||||||
price: 'Intro',
|
price: 'Intro',
|
||||||
bookingLabel: 'Book assessment',
|
bookingLabel: 'Book assessment',
|
||||||
bookingPath: '/intake/?package=leadership-assessment',
|
bookingPath: 'https://calendly.com/your-coach/coaching-assessment',
|
||||||
|
intakePath: '/intake/?package=leadership-assessment',
|
||||||
copy: 'A focused first step for founders and senior leaders who want to clarify the coaching agenda.',
|
copy: 'A focused first step for founders and senior leaders who want to clarify the coaching agenda.',
|
||||||
items: [
|
items: [
|
||||||
'intake review',
|
'intake review',
|
||||||
@ -59,7 +65,8 @@ export const publicCoachSite = {
|
|||||||
name: 'Founder Coaching',
|
name: 'Founder Coaching',
|
||||||
price: 'Monthly',
|
price: 'Monthly',
|
||||||
bookingLabel: 'Book monthly coaching',
|
bookingLabel: 'Book monthly coaching',
|
||||||
bookingPath: '/intake/?package=founder-coaching',
|
bookingPath: 'https://calendly.com/your-coach/one-on-one-coaching-session',
|
||||||
|
intakePath: '/intake/?package=founder-coaching',
|
||||||
copy: 'Ongoing 1:1 coaching with session memory, commitments, resources, and between-session accountability.',
|
copy: 'Ongoing 1:1 coaching with session memory, commitments, resources, and between-session accountability.',
|
||||||
items: [
|
items: [
|
||||||
'two sessions per month',
|
'two sessions per month',
|
||||||
@ -72,7 +79,8 @@ export const publicCoachSite = {
|
|||||||
name: 'Executive Operating Rhythm',
|
name: 'Executive Operating Rhythm',
|
||||||
price: 'Custom',
|
price: 'Custom',
|
||||||
bookingLabel: 'Book package consult',
|
bookingLabel: 'Book package consult',
|
||||||
bookingPath: '/intake/?package=executive-operating-rhythm',
|
bookingPath: 'https://calendly.com/your-coach/package-consult',
|
||||||
|
intakePath: '/intake/?package=executive-operating-rhythm',
|
||||||
copy: 'A deeper engagement for leaders navigating delegation, decision rights, and team operating cadence.',
|
copy: 'A deeper engagement for leaders navigating delegation, decision rights, and team operating cadence.',
|
||||||
items: [
|
items: [
|
||||||
'leadership themes',
|
'leadership themes',
|
||||||
|
|||||||
30
frontend/src/components/BookingLink.tsx
Normal file
30
frontend/src/components/BookingLink.tsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import Link from 'next/link';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
type BookingLinkProps = {
|
||||||
|
href: string;
|
||||||
|
children: React.ReactNode;
|
||||||
|
className?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function BookingLink({
|
||||||
|
href,
|
||||||
|
children,
|
||||||
|
className,
|
||||||
|
}: BookingLinkProps) {
|
||||||
|
const isExternal = /^https?:\/\//.test(href);
|
||||||
|
|
||||||
|
if (isExternal) {
|
||||||
|
return (
|
||||||
|
<a href={href} className={className} target='_blank' rel='noreferrer'>
|
||||||
|
{children}
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Link href={href} className={className}>
|
||||||
|
{children}
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import BookingLink from './BookingLink';
|
||||||
import { publicCoachSite } from '../coachingSite';
|
import { publicCoachSite } from '../coachingSite';
|
||||||
|
|
||||||
const links = [
|
const links = [
|
||||||
@ -30,12 +31,12 @@ export default function PublicSiteNav() {
|
|||||||
))}
|
))}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<Link
|
<BookingLink
|
||||||
href={publicCoachSite.assessmentPath}
|
href={publicCoachSite.calendly.assessmentUrl}
|
||||||
className='rounded-none bg-[#35b7a5] px-5 py-2.5 text-sm font-semibold text-white transition hover:brightness-105'
|
className='rounded-none bg-[#35b7a5] px-5 py-2.5 text-sm font-semibold text-white transition hover:brightness-105'
|
||||||
>
|
>
|
||||||
Start assessment
|
Schedule assessment
|
||||||
</Link>
|
</BookingLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav className='mx-auto mt-2 flex max-w-6xl gap-4 overflow-x-auto border border-[#19192d]/10 bg-white px-4 py-3 text-sm font-semibold text-[#19192d] md:hidden'>
|
<nav className='mx-auto mt-2 flex max-w-6xl gap-4 overflow-x-auto border border-[#19192d]/10 bg-white px-4 py-3 text-sm font-semibold text-[#19192d] md:hidden'>
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import type { ReactElement } from 'react';
|
|||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import BookingLink from '../components/BookingLink';
|
||||||
import PublicSiteNav from '../components/PublicSiteNav';
|
import PublicSiteNav from '../components/PublicSiteNav';
|
||||||
import LayoutGuest from '../layouts/Guest';
|
import LayoutGuest from '../layouts/Guest';
|
||||||
import { getPageTitle } from '../config';
|
import { getPageTitle } from '../config';
|
||||||
@ -55,8 +56,11 @@ export default function AboutCoach() {
|
|||||||
{publicCoachSite.coach.aboutIntro}
|
{publicCoachSite.coach.aboutIntro}
|
||||||
</p>
|
</p>
|
||||||
<div className='mt-9 flex flex-wrap gap-3'>
|
<div className='mt-9 flex flex-wrap gap-3'>
|
||||||
<Link href={publicCoachSite.assessmentPath} className={`rounded-none px-7 py-4 font-semibold ${ui.button}`}>
|
<BookingLink href={publicCoachSite.calendly.assessmentUrl} className={`rounded-none px-7 py-4 font-semibold ${ui.button}`}>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
|
</BookingLink>
|
||||||
|
<Link href={publicCoachSite.assessmentPath} className='rounded-none border border-[#19192d]/10 bg-white px-7 py-4 font-semibold text-[#19192d]'>
|
||||||
|
Send intake
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href='/services/'
|
href='/services/'
|
||||||
@ -140,9 +144,9 @@ export default function AboutCoach() {
|
|||||||
Start with an assessment and bring context into the first call.
|
Start with an assessment and bring context into the first call.
|
||||||
</h2>
|
</h2>
|
||||||
<div className='mt-8 flex justify-center'>
|
<div className='mt-8 flex justify-center'>
|
||||||
<Link href={publicCoachSite.assessmentPath} className={`rounded-none px-8 py-4 font-semibold ${ui.button}`}>
|
<BookingLink href={publicCoachSite.calendly.assessmentUrl} className={`rounded-none px-8 py-4 font-semibold ${ui.button}`}>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
</Link>
|
</BookingLink>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import type { ReactElement } from 'react';
|
|||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import BookingLink from '../components/BookingLink';
|
||||||
import PublicSiteNav from '../components/PublicSiteNav';
|
import PublicSiteNav from '../components/PublicSiteNav';
|
||||||
import { publicCoachSite } from '../coachingSite';
|
import { publicCoachSite } from '../coachingSite';
|
||||||
import LayoutGuest from '../layouts/Guest';
|
import LayoutGuest from '../layouts/Guest';
|
||||||
@ -180,12 +181,18 @@ export default function Starter() {
|
|||||||
captures what makes your coaching yours, so clients stay connected
|
captures what makes your coaching yours, so clients stay connected
|
||||||
to the work between sessions.
|
to the work between sessions.
|
||||||
</p>
|
</p>
|
||||||
<div className='mt-9 flex justify-center'>
|
<div className='mt-9 flex flex-wrap justify-center gap-3'>
|
||||||
<Link
|
<BookingLink
|
||||||
href={publicCoachSite.assessmentPath}
|
href={publicCoachSite.calendly.assessmentUrl}
|
||||||
className={`rounded-none px-10 py-5 text-lg font-semibold ${ui.button}`}
|
className={`rounded-none px-10 py-5 text-lg font-semibold ${ui.button}`}
|
||||||
>
|
>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
|
</BookingLink>
|
||||||
|
<Link
|
||||||
|
href={publicCoachSite.assessmentPath}
|
||||||
|
className='rounded-none border border-[#19192d]/10 bg-white px-10 py-5 text-lg font-semibold text-[#19192d]'
|
||||||
|
>
|
||||||
|
Send intake
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<p className={`mt-5 text-lg ${ui.muted}`}>
|
<p className={`mt-5 text-lg ${ui.muted}`}>
|
||||||
@ -525,12 +532,12 @@ export default function Starter() {
|
|||||||
Designed for real client work.
|
Designed for real client work.
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<BookingLink
|
||||||
href={publicCoachSite.assessmentPath}
|
href={publicCoachSite.calendly.assessmentUrl}
|
||||||
className={`rounded-none px-6 py-3 text-center font-semibold ${ui.button}`}
|
className={`rounded-none px-6 py-3 text-center font-semibold ${ui.button}`}
|
||||||
>
|
>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
</Link>
|
</BookingLink>
|
||||||
</div>
|
</div>
|
||||||
<div className='grid grid-cols-1 gap-4 md:grid-cols-3'>
|
<div className='grid grid-cols-1 gap-4 md:grid-cols-3'>
|
||||||
{publicCoachSite.testimonials.map((item) => (
|
{publicCoachSite.testimonials.map((item) => (
|
||||||
@ -581,12 +588,12 @@ export default function Starter() {
|
|||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<BookingLink
|
||||||
href={publicCoachSite.assessmentPath}
|
href={publicCoachSite.calendly.assessmentUrl}
|
||||||
className={`mt-8 inline-flex rounded-none px-7 py-4 font-semibold ${ui.button}`}
|
className={`mt-8 inline-flex rounded-none px-7 py-4 font-semibold ${ui.button}`}
|
||||||
>
|
>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
</Link>
|
</BookingLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import Image from 'next/image';
|
|||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useRouter } from 'next/router';
|
import { useRouter } from 'next/router';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import BookingLink from '../components/BookingLink';
|
||||||
import { publicCoachSite } from '../coachingSite';
|
import { publicCoachSite } from '../coachingSite';
|
||||||
import LayoutGuest from '../layouts/Guest';
|
import LayoutGuest from '../layouts/Guest';
|
||||||
import { getPageTitle } from '../config';
|
import { getPageTitle } from '../config';
|
||||||
@ -139,6 +140,21 @@ export default function Intake() {
|
|||||||
Share what you want to work on. Your coach can review this, create
|
Share what you want to work on. Your coach can review this, create
|
||||||
a client record, and prepare the first session around your goals.
|
a client record, and prepare the first session around your goals.
|
||||||
</p>
|
</p>
|
||||||
|
<div className='mt-7 border border-[#19192d]/10 bg-white p-5'>
|
||||||
|
<p className='text-xs font-semibold uppercase tracking-[0.22em] text-[#35b7a5]'>
|
||||||
|
Prefer to book first?
|
||||||
|
</p>
|
||||||
|
<p className='mt-2 text-sm leading-6 text-[#72798a]'>
|
||||||
|
Use Calendly to schedule the first assessment, then send intake
|
||||||
|
context when you are ready.
|
||||||
|
</p>
|
||||||
|
<BookingLink
|
||||||
|
href={publicCoachSite.calendly.assessmentUrl}
|
||||||
|
className='mt-4 inline-flex rounded-none bg-[#35b7a5] px-5 py-3 text-sm font-semibold text-white transition hover:brightness-105'
|
||||||
|
>
|
||||||
|
Schedule on Calendly
|
||||||
|
</BookingLink>
|
||||||
|
</div>
|
||||||
<div className='mt-8 overflow-hidden border border-[#19192d]/10 bg-white'>
|
<div className='mt-8 overflow-hidden border border-[#19192d]/10 bg-white'>
|
||||||
<Image
|
<Image
|
||||||
src='/images/coaching/coaching-intake.jpg'
|
src='/images/coaching/coaching-intake.jpg'
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import type { ReactElement } from 'react';
|
|||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import BookingLink from '../components/BookingLink';
|
||||||
import PublicSiteNav from '../components/PublicSiteNav';
|
import PublicSiteNav from '../components/PublicSiteNav';
|
||||||
import LayoutGuest from '../layouts/Guest';
|
import LayoutGuest from '../layouts/Guest';
|
||||||
import { getPageTitle } from '../config';
|
import { getPageTitle } from '../config';
|
||||||
@ -76,8 +77,11 @@ export default function Services() {
|
|||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<Link href={item.bookingPath} className={`mt-7 inline-flex justify-center rounded-none px-6 py-4 font-semibold ${ui.button}`}>
|
<BookingLink href={item.bookingPath} className={`mt-7 inline-flex justify-center rounded-none px-6 py-4 font-semibold ${ui.button}`}>
|
||||||
{item.bookingLabel}
|
{item.bookingLabel}
|
||||||
|
</BookingLink>
|
||||||
|
<Link href={item.intakePath} className='mt-3 inline-flex justify-center rounded-none border border-[#19192d]/10 bg-white px-6 py-3 text-sm font-semibold text-[#19192d]'>
|
||||||
|
Send intake first
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
@ -125,9 +129,9 @@ export default function Services() {
|
|||||||
Start with intake, then convert the lead into a client workspace.
|
Start with intake, then convert the lead into a client workspace.
|
||||||
</h2>
|
</h2>
|
||||||
<div className='mt-8 flex justify-center'>
|
<div className='mt-8 flex justify-center'>
|
||||||
<Link href={publicCoachSite.assessmentPath} className={`rounded-none px-8 py-4 font-semibold ${ui.button}`}>
|
<BookingLink href={publicCoachSite.calendly.assessmentUrl} className={`rounded-none px-8 py-4 font-semibold ${ui.button}`}>
|
||||||
Book assessment
|
Schedule assessment
|
||||||
</Link>
|
</BookingLink>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user