diff --git a/components/Shell.tsx b/components/Shell.tsx
index 312219c3..26b88ccc 100644
--- a/components/Shell.tsx
+++ b/components/Shell.tsx
@@ -3,7 +3,7 @@ import React, { Fragment, useEffect, useState } from "react";
 import { useRouter } from "next/router";
 import { signOut, useSession } from "next-auth/client";
 import { Menu, Transition } from "@headlessui/react";
-import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../lib/telemetry";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
 import { SelectorIcon } from "@heroicons/react/outline";
 import {
   CalendarIcon,
@@ -20,6 +20,7 @@ import classNames from "@lib/classNames";
 import { Toaster } from "react-hot-toast";
 import Avatar from "@components/Avatar";
 import { User } from "@prisma/client";
+import { HeadSeo } from "@components/seo/head-seo";
 
 export default function Shell(props) {
   const router = useRouter();
@@ -70,8 +71,18 @@ export default function Shell(props) {
     router.replace("/auth/login");
   }
 
+  const pageTitle = typeof props.heading === "string" ? props.heading : props.title;
+
   return session ? (
     <>
+      
       
         
       
diff --git a/components/seo/head-seo.tsx b/components/seo/head-seo.tsx
new file mode 100644
index 00000000..5155e704
--- /dev/null
+++ b/components/seo/head-seo.tsx
@@ -0,0 +1,101 @@
+import { NextSeo, NextSeoProps } from "next-seo";
+import React from "react";
+import { getBrowserInfo } from "@lib/core/browser/browser.utils";
+import { getSeoImage, seoConfig } from "@lib/config/next-seo.config";
+import merge from "lodash.merge";
+
+export type HeadSeoProps = {
+  title: string;
+  description: string;
+  siteName?: string;
+  name?: string;
+  avatar?: string;
+  url?: string;
+  canonical?: string;
+  nextSeoProps?: NextSeoProps;
+};
+
+/**
+ * Build full seo tags from title, desc, canonical and url
+ */
+const buildSeoMeta = (pageProps: {
+  title: string;
+  description: string;
+  image: string;
+  siteName?: string;
+  url?: string;
+  canonical?: string;
+}): NextSeoProps => {
+  const { title, description, image, canonical, siteName = seoConfig.headSeo.siteName } = pageProps;
+  return {
+    title: title,
+    canonical: canonical,
+    openGraph: {
+      site_name: siteName,
+      type: "website",
+      title: title,
+      description: description,
+      images: [
+        {
+          url: image,
+          //width: 1077,
+          //height: 565,
+          //alt: "Alt image"
+        },
+      ],
+    },
+    additionalMetaTags: [
+      {
+        property: "name",
+        content: title,
+      },
+      {
+        property: "description",
+        content: description,
+      },
+      {
+        name: "description",
+        content: description,
+      },
+      {
+        property: "image",
+        content: image,
+      },
+    ],
+  };
+};
+
+const constructImage = (name: string, avatar: string, description: string): string => {
+  return (
+    encodeURIComponent("Meet **" + name + "** 
" + description).replace(/'/g, "%27") +
+    ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
+    encodeURIComponent(avatar)
+  );
+};
+
+export const HeadSeo: React.FC = (props) => {
+  const defaultUrl = getBrowserInfo()?.url;
+  const image = getSeoImage("default");
+
+  const {
+    title,
+    description,
+    name = null,
+    avatar = null,
+    siteName,
+    canonical = defaultUrl,
+    nextSeoProps = {},
+  } = props;
+
+  const pageTitle = title + " | Calendso";
+  let seoObject = buildSeoMeta({ title: pageTitle, image, description, canonical, siteName });
+
+  if (name && avatar) {
+    const pageImage = getSeoImage("ogImage") + constructImage(name, avatar, description);
+    seoObject = buildSeoMeta({ title: pageTitle, description, image: pageImage, canonical, siteName });
+  }
+
+  const seoProps: NextSeoProps = merge(nextSeoProps, seoObject);
+
+  return ;
+};
diff --git a/lib/config/next-seo.config.ts b/lib/config/next-seo.config.ts
new file mode 100644
index 00000000..5689521a
--- /dev/null
+++ b/lib/config/next-seo.config.ts
@@ -0,0 +1,27 @@
+import { DefaultSeoProps } from "next-seo";
+import { HeadSeoProps } from "@components/seo/head-seo";
+
+const seoImages = {
+  default: "https://calendso.com/og-image.png",
+  ogImage: "https://og-image-one-pi.vercel.app/",
+};
+
+export const getSeoImage = (key: keyof typeof seoImages): string => {
+  return seoImages[key];
+};
+
+export const seoConfig: {
+  headSeo: Required>;
+  defaultNextSeo: DefaultSeoProps;
+} = {
+  headSeo: {
+    siteName: "Calendso",
+  },
+  defaultNextSeo: {
+    twitter: {
+      handle: "@calendso",
+      site: "@Calendso",
+      cardType: "summary_large_image",
+    },
+  },
+} as const;
diff --git a/lib/core/browser/browser.utils.ts b/lib/core/browser/browser.utils.ts
new file mode 100644
index 00000000..828c6ca1
--- /dev/null
+++ b/lib/core/browser/browser.utils.ts
@@ -0,0 +1,22 @@
+export const isBrowser = () => typeof window !== "undefined";
+
+type BrowserInfo = {
+  url: string;
+  path: string;
+  referrer: string;
+  title: string;
+  query: string;
+};
+
+export const getBrowserInfo = (): Partial => {
+  if (!isBrowser()) {
+    return {};
+  }
+  return {
+    url: window.document.location?.href ?? undefined,
+    path: window.document.location?.pathname ?? undefined,
+    referrer: window.document?.referrer ?? undefined,
+    title: window.document.title ?? undefined,
+    query: window.document.location?.search,
+  };
+};
diff --git a/package.json b/package.json
index f6124e05..91a33e25 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,7 @@
     "lodash.throttle": "^4.1.1",
     "next": "^10.2.3",
     "next-auth": "^3.28.0",
+    "next-seo": "^4.26.0",
     "next-transpile-modules": "^8.0.0",
     "nodemailer": "^6.6.3",
     "react": "17.0.2",
diff --git a/pages/404.tsx b/pages/404.tsx
index 2e339168..7de90082 100644
--- a/pages/404.tsx
+++ b/pages/404.tsx
@@ -3,7 +3,7 @@ import { BookOpenIcon, CheckIcon, CodeIcon, DocumentTextIcon } from "@heroicons/
 import { useRouter } from "next/router";
 import React from "react";
 import Link from "next/link";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 
 const links = [
   {
@@ -32,9 +32,14 @@ export default function Custom404() {
 
   return (
     <>
-      
-        404: This page could not be found.
-      
+      
       
         
           
diff --git a/pages/[user].tsx b/pages/[user].tsx
index f7a418d7..6773abba 100644
--- a/pages/[user].tsx
+++ b/pages/[user].tsx
@@ -1,5 +1,5 @@
 import { GetServerSideProps } from "next";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import Link from "next/link";
 import prisma, { whereAndSelect } from "@lib/prisma";
 import Avatar from "@components/Avatar";
@@ -48,59 +48,12 @@ export default function User(props): User {
   ));
   return (
     <>
-      
-        
{props.user.name || props.user.username} | Calendso
-        
-
-        
-        
-
-        
-        
-        
-        
-        
").replace(
-              /'/g,
-              "%27"
-            ) +
-            ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
-            encodeURIComponent(props.user.avatar)
-          }
-        />
-
-        
-        
-        
-        
-        
").replace(
-              /'/g,
-              "%27"
-            ) +
-            ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
-            encodeURIComponent(props.user.avatar)
-          }
-        />
-      
+      
       {isReady && (
         
           
diff --git a/pages/[user]/[type].tsx b/pages/[user]/[type].tsx
index e4988b18..b5b3df7a 100644
--- a/pages/[user]/[type].tsx
+++ b/pages/[user]/[type].tsx
@@ -6,16 +6,16 @@ import prisma from "@lib/prisma";
 import * as Collapsible from "@radix-ui/react-collapsible";
 import dayjs, { Dayjs } from "dayjs";
 import { GetServerSidePropsContext, InferGetServerSidePropsType } from "next";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import { useRouter } from "next/router";
 import { useEffect, useState } from "react";
 import Avatar from "@components/Avatar";
-import AvailableTimes from "../../components/booking/AvailableTimes";
-import DatePicker from "../../components/booking/DatePicker";
-import TimeOptions from "../../components/booking/TimeOptions";
-import PoweredByCalendso from "../../components/ui/PoweredByCalendso";
-import { timeZone } from "../../lib/clock";
-import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../../lib/telemetry";
+import AvailableTimes from "@components/booking/AvailableTimes";
+import DatePicker from "@components/booking/DatePicker";
+import TimeOptions from "@components/booking/TimeOptions";
+import PoweredByCalendso from "@components/ui/PoweredByCalendso";
+import { timeZone } from "@lib/clock";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
 import { asStringOrNull } from "@lib/asStringOrNull";
 
 export default function Type(props: InferGetServerSidePropsType) {
@@ -82,53 +82,14 @@ export default function Type(props: InferGetServerSidePropsType
-      
-        
-          {rescheduleUid && "Reschedule"} {props.eventType.title} | {props.user.name || props.user.username} |
-          Calendso
-        
-        
-        
-
-        
-        
-        
-        
-        " + props.eventType.description
-            ).replace(/'/g, "%27") +
-            ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
-            encodeURIComponent(props.user.avatar)
-          }
-        />
-
-        
-        
-        
-        
-        " + props.eventType.description
-            ).replace(/'/g, "%27") +
-            ".png?md=1&images=https%3A%2F%2Fcalendso.com%2Fcalendso-logo-white.svg&images=" +
-            encodeURIComponent(props.user.avatar)
-          }
-        />
-      
-
+      
       {isReady && (
         
           
-        
-          
-            {rescheduleUid ? "Reschedule" : "Confirm"} your {props.eventType.title} with{" "}
-            {props.user.name || props.user.username} | Calendso
-          
-          
-        
+        
 
         
           
diff --git a/pages/_app.tsx b/pages/_app.tsx
index a78372e6..beb8fda8 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,7 +1,8 @@
 import "../styles/globals.css";
 import AppProviders from "@lib/app-providers";
 import type { AppProps as NextAppProps } from "next/app";
-import Head from "next/head";
+import { DefaultSeo } from "next-seo";
+import { seoConfig } from "@lib/config/next-seo.config";
 
 // Workaround for https://github.com/zeit/next.js/issues/8592
 export type AppProps = NextAppProps & {
@@ -12,9 +13,7 @@ export type AppProps = NextAppProps & {
 function MyApp({ Component, pageProps, err }: AppProps) {
   return (
     
-      
-        
-      
+      
       
     
   );
diff --git a/pages/auth/error.tsx b/pages/auth/error.tsx
index cbd57cfe..2dc8028c 100644
--- a/pages/auth/error.tsx
+++ b/pages/auth/error.tsx
@@ -1,6 +1,6 @@
 import { useRouter } from "next/router";
 import { XIcon } from "@heroicons/react/outline";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import Link from "next/link";
 
 export default function Error() {
@@ -13,10 +13,7 @@ export default function Error() {
       aria-labelledby="modal-title"
       role="dialog"
       aria-modal="true">
-      
-        
{error} - Calendso
-        
-      
+      
       
         
           
diff --git a/pages/auth/forgot-password/[id].tsx b/pages/auth/forgot-password/[id].tsx
index 48fb72ff..413e082c 100644
--- a/pages/auth/forgot-password/[id].tsx
+++ b/pages/auth/forgot-password/[id].tsx
@@ -1,7 +1,6 @@
 import { getCsrfToken } from "next-auth/client";
-import prisma from "../../../lib/prisma";
-
-import Head from "next/head";
+import prisma from "@lib/prisma";
+import { HeadSeo } from "@components/seo/head-seo";
 import React, { useMemo } from "react";
 import debounce from "lodash.debounce";
 import dayjs from "dayjs";
@@ -122,10 +121,7 @@ export default function Page({ resetPasswordRequest, csrfToken }: Props) {
 
   return (
     
-      
-        
Reset Password
-        
-      
+      
       
         
           {isRequestExpired && 
}
diff --git a/pages/auth/forgot-password/index.tsx b/pages/auth/forgot-password/index.tsx
index ea7fc71b..fd2a90aa 100644
--- a/pages/auth/forgot-password/index.tsx
+++ b/pages/auth/forgot-password/index.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import Link from "next/link";
 import React from "react";
 import { getCsrfToken, getSession } from "next-auth/client";
@@ -71,11 +71,7 @@ export default function ForgotPassword({ csrfToken }) {
 
   return (
     
-      
-        
Forgot Password
-        
-      
-
+      
       
         
           {success && 
}
diff --git a/pages/auth/login.tsx b/pages/auth/login.tsx
index 5308c3d9..13152ea9 100644
--- a/pages/auth/login.tsx
+++ b/pages/auth/login.tsx
@@ -1,14 +1,11 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import Link from "next/link";
 import { getCsrfToken, getSession } from "next-auth/client";
 
 export default function Login({ csrfToken }) {
   return (
     
-      
-        
Login
-        
-      
+      
       
          
         Sign in to your account
diff --git a/pages/auth/logout.tsx b/pages/auth/logout.tsx
index a066723c..0b125e6f 100644
--- a/pages/auth/logout.tsx
+++ b/pages/auth/logout.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import Link from "next/link";
 import { CheckIcon } from "@heroicons/react/outline";
 
@@ -9,10 +9,7 @@ export default function Logout() {
       aria-labelledby="modal-title"
       role="dialog"
       aria-modal="true">
-      
-        
Logged out - Calendso
-        
-      
+      
       
         
           
diff --git a/pages/auth/signup.tsx b/pages/auth/signup.tsx
index c446fc85..d7cbc943 100644
--- a/pages/auth/signup.tsx
+++ b/pages/auth/signup.tsx
@@ -1,10 +1,10 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import { useRouter } from "next/router";
 import { signIn } from "next-auth/client";
-import ErrorAlert from "../../components/ui/alerts/Error";
+import ErrorAlert from "@components/ui/alerts/Error";
 import { useState } from "react";
-import { UsernameInput } from "../../components/ui/UsernameInput";
-import prisma from "../../lib/prisma";
+import { UsernameInput } from "@components/ui/UsernameInput";
+import prisma from "@lib/prisma";
 
 export default function Signup(props) {
   const router = useRouter();
@@ -54,10 +54,7 @@ export default function Signup(props) {
       aria-labelledby="modal-title"
       role="dialog"
       aria-modal="true">
-      
-        Sign up
-        
-      
+      
       
         
Create your account
       
diff --git a/pages/availability/index.tsx b/pages/availability/index.tsx
index 701dd74f..bf6a8a36 100644
--- a/pages/availability/index.tsx
+++ b/pages/availability/index.tsx
@@ -1,8 +1,7 @@
-import Head from "next/head";
 import Link from "next/link";
-import prisma from "../../lib/prisma";
-import Modal from "../../components/Modal";
-import Shell from "../../components/Shell";
+import prisma from "@lib/prisma";
+import Modal from "@components/Modal";
+import Shell from "@components/Shell";
 import { useRouter } from "next/router";
 import { useRef, useState } from "react";
 import { getSession, useSession } from "next-auth/client";
@@ -115,15 +114,7 @@ export default function Availability(props) {
 
   return (
     
-      
-        
Availability | Calendso
-        
-      
-      
+      
         
           
             
diff --git a/pages/availability/troubleshoot.tsx b/pages/availability/troubleshoot.tsx
index 2b82ab21..37f4ad37 100644
--- a/pages/availability/troubleshoot.tsx
+++ b/pages/availability/troubleshoot.tsx
@@ -4,9 +4,8 @@ import dayjs from "dayjs";
 import utc from "dayjs/plugin/utc";
 import { GetServerSideProps } from "next";
 import { getSession } from "next-auth/client";
-import Head from "next/head";
 import { useEffect, useState } from "react";
-import Shell from "../../components/Shell";
+import Shell from "@components/Shell";
 
 dayjs.extend(utc);
 
@@ -52,10 +51,6 @@ export default function Troubleshoot({ user }) {
 
   return (
     
-      
-        
Troubleshoot | Calendso
-        
-      
       
diff --git a/pages/bookings/index.tsx b/pages/bookings/index.tsx
index b835dfb5..3155b5c3 100644
--- a/pages/bookings/index.tsx
+++ b/pages/bookings/index.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
-import prisma from "../../lib/prisma";
+import prisma from "@lib/prisma";
 import { getSession, useSession } from "next-auth/client";
-import Shell from "../../components/Shell";
+import Shell from "@components/Shell";
 import { useRouter } from "next/router";
 import dayjs from "dayjs";
 import { Fragment } from "react";
@@ -36,10 +35,6 @@ export default function Bookings({ bookings }) {
 
   return (
     
-      
-        
Bookings | Calendso
-        
-      
       
         
           
diff --git a/pages/cancel/[uid].tsx b/pages/cancel/[uid].tsx
index 2d661e4f..bd177818 100644
--- a/pages/cancel/[uid].tsx
+++ b/pages/cancel/[uid].tsx
@@ -4,11 +4,11 @@ import isBetween from "dayjs/plugin/isBetween";
 import isSameOrBefore from "dayjs/plugin/isSameOrBefore";
 import timezone from "dayjs/plugin/timezone";
 import utc from "dayjs/plugin/utc";
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import { useRouter } from "next/router";
 import { useState } from "react";
-import prisma from "../../lib/prisma";
-import { collectPageParameters, telemetryEventTypes, useTelemetry } from "../../lib/telemetry";
+import prisma from "@lib/prisma";
+import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@lib/telemetry";
 
 dayjs.extend(isSameOrBefore);
 dayjs.extend(isBetween);
@@ -55,13 +55,12 @@ export default function Type(props) {
 
   return (
     
-      
-        
-          Cancel {props.booking && `${props.booking.title} | ${props.user.name || props.user.username} `}|
-          Calendso
-        
-        
-      
+      
       
         
           
diff --git a/pages/cancel/success.tsx b/pages/cancel/success.tsx
index cbb4f1f4..cb117b49 100644
--- a/pages/cancel/success.tsx
+++ b/pages/cancel/success.tsx
@@ -1,4 +1,4 @@
-import Head from "next/head";
+import { HeadSeo } from "@components/seo/head-seo";
 import prisma from "../../lib/prisma";
 import { useRouter } from "next/router";
 import dayjs from "dayjs";
@@ -19,12 +19,10 @@ export default function Type(props) {
 
   return (
     
-      
-        
-          Cancelled {props.title} | {props.user.name || props.user.username} | Calendso
-        
-        
-      
+      
       
         
           
diff --git a/pages/event-types/[type].tsx b/pages/event-types/[type].tsx
index 47d80676..80e6cea8 100644
--- a/pages/event-types/[type].tsx
+++ b/pages/event-types/[type].tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
 import Link from "next/link";
 import { useRouter } from "next/router";
-import Modal from "../../components/Modal";
+import Modal from "@components/Modal";
 import React, { useEffect, useRef, useState } from "react";
 import Select, { OptionBase } from "react-select";
 import prisma from "@lib/prisma";
@@ -331,11 +330,8 @@ const EventTypePage = (props: InferGetServerSidePropsType
-      
-        {eventType.title} | Event Type | Calendso
-        
-      
       
-      
-        Event Types | Calendso
-        
-      
       
-      
-        {getIntegrationName(props.integration.type)} App | Calendso
-        
-      
-
-      
+      
         
           
             
diff --git a/pages/integrations/index.tsx b/pages/integrations/index.tsx
index 25428e32..1aa3211a 100644
--- a/pages/integrations/index.tsx
+++ b/pages/integrations/index.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
 import Link from "next/link";
-import prisma from "../../lib/prisma";
-import Shell from "../../components/Shell";
+import prisma from "@lib/prisma";
+import Shell from "@components/Shell";
 import { useEffect, useState, useRef, useCallback } from "react";
 import { getSession, useSession } from "next-auth/client";
 import { CheckCircleIcon, ChevronRightIcon, PlusIcon, XCircleIcon } from "@heroicons/react/solid";
@@ -270,11 +269,6 @@ export default function Home({ integrations }: Props) {
 
   return (
     
-      
-        
App Store | Calendso
-        
-      
-
       
}>
         
           {integrations.filter((ig) => ig.credential).length !== 0 ? (
diff --git a/pages/settings/billing.tsx b/pages/settings/billing.tsx
index 1d28e233..63b574a4 100644
--- a/pages/settings/billing.tsx
+++ b/pages/settings/billing.tsx
@@ -1,15 +1,11 @@
-import Head from "next/head";
-import Shell from "../../components/Shell";
-import SettingsShell from "../../components/Settings";
-import prisma from "../../lib/prisma";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
+import prisma from "@lib/prisma";
 import { getSession } from "next-auth/client";
 
 export default function Billing() {
   return (
     
-      
-        Billing | Calendso
-      
       
         
           
diff --git a/pages/settings/embed.tsx b/pages/settings/embed.tsx
index 259a7a66..ae2b64b0 100644
--- a/pages/settings/embed.tsx
+++ b/pages/settings/embed.tsx
@@ -1,7 +1,6 @@
-import Head from "next/head";
-import prisma from "../../lib/prisma";
-import Shell from "../../components/Shell";
-import SettingsShell from "../../components/Settings";
+import prisma from "@lib/prisma";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
 import { getSession, useSession } from "next-auth/client";
 import Loader from "@components/Loader";
 
@@ -15,10 +14,6 @@ export default function Embed(props) {
 
   return (
     
-      
-        Embed | Calendso
-        
-      
       
         
           
diff --git a/pages/settings/password.tsx b/pages/settings/password.tsx
index cd4fd241..23308bcf 100644
--- a/pages/settings/password.tsx
+++ b/pages/settings/password.tsx
@@ -1,9 +1,8 @@
-import Head from "next/head";
 import { useRef, useState } from "react";
-import prisma from "../../lib/prisma";
-import Modal from "../../components/Modal";
-import Shell from "../../components/Shell";
-import SettingsShell from "../../components/Settings";
+import prisma from "@lib/prisma";
+import Modal from "@components/Modal";
+import Shell from "@components/Shell";
+import SettingsShell from "@components/Settings";
 import { getSession, useSession } from "next-auth/client";
 import Loader from "@components/Loader";
 
@@ -45,11 +44,7 @@ export default function Settings() {
   }
 
   return (
-    
-      
-        Change Password | Calendso
-        
-      
+