# Ad studio (https://docs.superpractice.com/ad-studio)
**Grow > Ad studio** is where your firm makes ads for Facebook, Instagram, and LinkedIn. You write the ad with the assistant, see it the way each placement shows it, and export the pictures and words to paste into Meta Ads Manager or LinkedIn Campaign Manager.
Ad studio never posts an ad or spends any money. Your ads stay drafts here until you export them. It's on for every firm, and it uses your firm's Social accounts and Media.
Ad studio has three tabs: **Create**, **Inspiration**, and **Competitors**.
## Create [#create]
**Create** lists your firm's ads, the most recently changed first, with where each one runs, the ad it was inspired by, and when it was last changed. Click a row to open the ad.
Click **New ad** to start one. You can start from a blank ad or a picture you already have, or from an ad you saved in [Inspiration](#inspiration).
### Make the ad [#make-the-ad]
An ad opens in the same full-page editor as a social post. See [The post editor](./social.mdx#the-post-editor). A few things are different:
* **Add placement** adds Facebook, Instagram, or LinkedIn. **Run as** picks **Feed**, **Story**, or **Reel** for each one. LinkedIn ads run in the feed only.
* The previews show **Sponsored** on Facebook and Instagram, and **Promoted** on LinkedIn, the way the ad will look.
* The headline, description, and button are written in the preview itself. Facebook and Instagram offer **Learn more**, **Book now**, **Call now**, and **Contact us**. LinkedIn offers **Learn more**, **Sign up**, and **Register**.
* The assistant beside the ad starts with **Write 3 hooks**, **Shorter headline**, and **Check bar rules**.
### Ad settings [#ad-settings]
The **Ad settings** tab holds the rest of the ad:
* **Destination**: the page the ad sends people to, such as **harborpike.com/consultation**. Each placement gets its own tracked link, so the contacts it brings in count for this ad.
* **Objective**: **Leads**, **Traffic**, or **Awareness**.
* **Second look**: the same bar-rule check social posts get. See [Second look](./social.mdx#second-look).
* **Delete ad**: removes the draft for good. Nothing about it ever ran.
### Export [#export]
Under **Export** in **Ad settings**, each placement has its own row with the picture's size, such as **Facebook · Feed** at **1080 × 1350**.
* **Download pictures** saves the picture cut to each placement's size. Stories and Reels are 1080 × 1920. A video downloads as it is.
* **Copy the words** copies each placement's text, headline, description, button, and tracked website link, ready to paste into Ads Manager and Campaign Manager.
## Inspiration [#inspiration]
**Inspiration** holds the competitor ads your firm saved with the bookmark on [Competitors](./social-competitors.mdx#save-an-ad-for-later), the newest first. Everyone at your firm sees the same ones.
* Click an ad to open it, with its read and details.
* **Use as inspiration** starts a new ad from it. The assistant drafts your firm's own version in your voice, and the ad notes what it started from.
* Click the filled bookmark to take an ad out of Inspiration. You can **Undo** it.
## Competitors [#competitors]
The **Competitors** tab opens [Grow > Social > Competitors](./social-competitors.mdx), where you see every ad your competitors run. Inspiration and Competitors show when your firm has competitor ads on, which it does to start with.
## Usage [#usage]
The words the assistant writes for an ad count toward your firm's AI credits, under **Social post writing** on the **Usage** tab of your firm's [Billing](https://app.superpractice.com/settings/billing) page.
# Agent activity (https://docs.superpractice.com/agent-activity)
## What Agent activity is for [#what-agent-activity-is-for]
[Agent activity](https://app.superpractice.com/agents/activity) lists every action your firm's AI agents took, newest first: the calls they answered and placed, the texts and emails they sent, the meetings they booked or moved, and the tasks they created. Use it to check what an agent said to a contact, and who approved it.
Open it from **Agents > Activity** in the sidebar. Every member of a firm that has Agents can see it.
## Read the list [#read-the-list]
| Column | What it shows |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| When | When the action happened. |
| Agent | The agent that acted. |
| Action | What it did, such as **Answered a call**, **Called**, **Texted**, **Got a text**, **Emailed**, **Booked a meeting**, **Moved a meeting**, or **Created a task**. |
| Contact | The contact it was about. |
| What it said | The words of a text, the subject of an email, or the first sentence of a call's summary. |
| For | The person at the firm the work was for, or **Firm**. |
| Outcome | What came of it, such as **Meeting booked**, **Message taken**, **Sent**, **Done**, or **Waiting for your yes**. |
| Approved by | Who approved the action, when it needed an approval. |
| Source | What started it, such as a voice agent or a procedure. |
**Waiting for your yes** means the action is held until someone approves it.
## Narrow the list [#narrow-the-list]
* The tabs split the list by kind of agent: **All**, **Voice agents**, **Procedures**, **AI tasks**, **Chat**, and **Voice chat**.
* Filter by **Date** (**Last 7 days**, **Last 30 days**, **Last 90 days**, or **All time**), **Action**, **Contact**, **For**, **Outcome**, and **Source**.
* Search finds a contact or an agent.
* Save a combination of filters as a view to come back to it.
## Open an action [#open-an-action]
Click a row to open it in a window over the page:
* A **call** opens the call window, with the recording, summary, and transcript. See [Call history](./call-history.mdx#inside-a-call).
* A **text** opens the contact on their SMS tab, so you see it in the conversation.
* An **email** opens in its own window. If the email is no longer there, the contact opens instead. See [Open one email in its own window](./email.mdx#open-one-email-in-its-own-window).
* A **meeting** opens the meeting.
* A **task** opens a window with the task linked in its rail. Click the task to open it in place.
* A **procedure email** shows who it was from and to, the subject, and the body. On a test run, the section is titled **What it would have sent**.
Each row has its own link, so you can send a teammate straight to one action.
## Related guides [#related-guides]
Every call the firm's phone agents handled.
Set up the agent that answers and places calls.
Work the tasks your agents create.
# Assistant (https://docs.superpractice.com/assistant)
## Open the assistant [#open-the-assistant]
There are two ways in:
* **Ask Superpractice**, at the bottom right of every page, opens the assistant in a small window over the page you are on. It can see which page you are reading.
* **Assistant**, in the sidebar, opens the full page with your conversation history. A grey count beside it shows how many of your chats have an answer you have not opened yet, and in your conversation history those chats sit first, under **Unread**, each with a teal dot, until you open them.
In the small window, **New chat** starts over, **Open as full page** moves the chat to the Assistant page, and the chat's title opens your history.
Ask a question or give a command in plain words, such as "Who are my hottest leads?" or "What's on my calendar today?". Type **@** to mention a contact.
## Add records to a message [#add-records-to-a-message]
Click **+** in the composer to choose what the assistant should look at:
* **Mention a contact**
* **Add task context**
* **Add contact context**
* **Add meeting context**
* **Add matter context**
* **Skills**
Search, or pick from the suggestions, such as today's meetings or tasks due soon. You can add up to 8 records to one message. Each one shows as a chip in your message. Click a chip to open that record.
The assistant reads each record from your firm's data when it answers. Contact notes that are hidden from AI are never included.
### Use a skill [#use-a-skill]
A skill is your firm's written way of doing something, such as an intake call or a follow-up after a meeting. Click **+**, then **Skills**, and pick one under **YOUR SKILLS**, or under **SUPERPRACTICE SKILLS** if your firm has any. You can add up to 3 skills to a message. Each shows as a chip, and the assistant follows it in its answer.
You don't have to attach a skill. When a request matches one of your published skills, the assistant uses it on its own. Either way, the steps it shows include **Used skill** with the skill's name. To read a skill's text, open it on the [Skills](./skills.mdx) page.
A skill can name the other skills it goes with. The assistant gets that list with the skill and reads each related skill when the work reaches it, so it follows "Intake call" and then "Conflict check" in the order the skill says. See [Related skills](./skills.mdx#related-skills).
## Reply to an earlier message [#reply-to-an-earlier-message]
Click **Reply** under one of the assistant's messages. A **Replying to Assistant** row, with the message's first line, sits above the box; click **×** to drop it. Once sent, a short quote sits above your message, and clicking it jumps back to the original.
## Get help with a task [#get-help-with-a-task]
On an open task, click **Work on task**. A new chat starts with the message "Help me with this task", and the task's steps stay pinned at the top of the chat: the task name, how many steps are done, and a progress line. The steps start folded; click the arrow to open them, and tick any step right there. In the popup they sit under the header. The assistant works the steps in order, ticks each one it finishes, and puts what it found or wrote in a note on the task, so everything about the task stays on the task. It never creates other tasks while working one. For steps only you can do, it gives you a checklist or a draft and offers to take the next step. It never marks the task done by itself.
Skills linked in the task's details come along: the assistant follows each one as it reaches that part of the work. See [Skills in tasks](./skills.mdx#skills-in-tasks).
Once you have a chat for the task, the button reads **Open Assistant** and reopens it. Each person has their own chat for a task. See [Tasks](./tasks.mdx#open-and-work-a-task).
## Attach files [#attach-files]
Click **Attach files**, or drop files onto the composer. The assistant accepts:
* pictures: JPG, PNG, HEIC, and WebP, up to 4 at a time
* PDFs
* Word, Excel, CSV, and text files
Each file can be up to 4 MB, with up to 10 files in a message. The assistant looks at pictures and PDFs. From Word, Excel, CSV, and text files it reads only the text. The original file is kept privately with the chat, so a task you create from the message gets the file itself. Files with macros are refused.
## Send more while it is answering [#send-more-while-it-is-answering]
You can keep typing while the assistant works.
* **Enter** queues your message. Queued messages wait in a tab above the composer, where you can edit, copy, or delete them. When the answer finishes, everything queued is sent together.
* **Steer**, or **⌘Enter**, sends a queued message now. It stops the current answer and redirects it.
* **Stop**, or **Esc**, stops the answer. Your queue stays.
While a new message is waiting, nothing that reaches outside the firm is sent. Any card asking for your approval says it is reading your new message first.
## Talk instead of typing [#talk-instead-of-typing]
Click the voice button, or press **⌥Space**, to talk to the assistant. The bar shows whether it is listening, thinking, or speaking, with **Mute**, **Type instead**, and **End**.
* The conversation keeps going as you move between pages, and between the small window and the full page. Reloading the page or closing the tab ends it.
* If the connection drops, it reconnects with everything said so far. If it can't, the chat keeps everything that was said, so you can carry on typing.
* When you ask for a table or a chart, it puts it in the chat and tells you it is there.
## Read the answer [#read-the-answer]
* While it works, the assistant shows a short trail of what it is doing. When it is done, the trail folds to a single line. Click it to see the steps.
* Charts and tables have an **Open larger** button. Larger tables can be sorted, and names in them open the contact, matter, task, meeting, or call.
* Charts that compare two periods name both in the title, such as "Oct 1–9 vs Sep 1–9".
* Links such as **Open in Mission Control** open that page in a new tab. Links to a record open the record's window.
* When it creates or changes a task, a line such as "Task created" with the task's title confirms it was saved. Click the title to open the task. A new task's card lists its steps.
* A task it creates is attached to the contact and the matter it is about, whatever the task type. If two contacts fit the name, it asks which one you mean instead of guessing.
* If the answer depends on something only you know, it asks one question with a few options and marks the one it suggests. You can also write your own answer.
* After it finds options or writes a draft, it offers to take the next step itself, such as booking or sending. It does not act until you say yes.
* Ask for your booking link ("send Jordan our booking link", "what is our scheduling link") and it reads your meeting types, picks the one whose description fits, and shares that meeting type's booking page in the message or the answer. The same works in the voice assistant and the executive assistant. Internal meeting types are never sent to a contact.
## Superpractice jobs [#superpractice-jobs]
For bigger pieces of work, the assistant hands the request to a Superpractice job. A job works through it step by step, using your firm's data and the methods your Superpractice team has set up for that kind of work, then reports back in the chat.
| Job | What it does |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Google Ads** | Audits, wasted spend, keywords, ad copy, budgets, and new paused campaigns. See [Google Ads](./google-ads.mdx#ask-the-assistant-about-google-ads). |
| **Voice agent build** | Sets up, fixes, or reviews a voice agent and its calls. See [Create a voice agent](./voice-agent-setup.mdx). |
You don't pick a job: just ask. Quick questions, such as last week's ad spend, are answered directly without a job.
The job's step in the answer names it and what it cost, such as **Ran the Google Ads job · 41 credits**. If a change needs an owner's or admin's OK, it stops and reads **Ran the Google Ads job · waiting for an approval**, with the approval card below. Jobs show on the **Usage** tab of Billing as **Superpractice jobs**. A job can only do what you could do yourself: it uses your permissions, and only your firm's data.
Connected AI tools, such as Claude, can hand work to the same jobs. See [Connect your AI tools](./mcp.mdx#superpractice-jobs).
## Approvals [#approvals]
Before the assistant does something that can't be taken back, it shows a card with what it is about to do and asks you to **Approve** or **Cancel**. Replying that you agree, in your own words, such as "yes", "go ahead", "send it", or "looks good", approves the one card that is waiting, exactly as it shows on screen, including your edits. Your reply is read in the context of the card: a question about it, or a reply that could be read two ways, approves nothing, and the card keeps waiting. Typing "no" or "cancel that" cancels it, and the card says **Cancelled. Nothing was sent.** If more than one card is waiting, it asks which you mean.
**Emails and texts to contacts.** In the app, the assistant never sends an email or text to a contact on its own. It shows a draft card: check the words, then click **Send email** or **Send text**, or type yes. An email or text set up to go later shows **Approve email** or **Approve text** with when it goes. You approve it once, and only those exact words go out at that time. A text still waits for the contact's texting hours, and nothing goes to a contact who opted out.
The card asks which contact you mean first, showing the full number or address, when:
* the name you said was only a close match, or matches two contacts
* another contact has a similar name, such as Jon and John Hale
* the contact was added today
* the number or address is not the one on file, or not the one your last message to them went to
* you did not name the contact yourself
After a text is sent, its card says **Sent to …**, then **Delivered to …** once the carrier confirms, or **Not delivered:** with the reason. The assistant tells you about a failed text first in its next answer.
By voice, it puts an email's draft card in the chat and offers to read it to you, then asks for your go-ahead. A bare "okay" or "right" while it is talking only shows you are listening, so it asks again; say yes or tell it to go ahead. Say "no, just send it" to skip the reading. A spoken change makes a new draft. Payments, deletes, sends to many contacts, and commitments made for the firm always ask.
### The email draft card [#the-email-draft-card]
* **To** and **CC** take contacts and teammates, grouped under **Contacts** and **Your team**. A full address that isn't a contact shows **Not in your contacts** with **Add as a contact**. **Send email** stays off until **To** has a contact.
* **Regenerate** writes a new draft. Hover over it, or tap it, for **Steer**: add a note such as "Shorter, and ask about Thursday instead", and click **Regenerate**. The note shows on the card but is never sent. Steer works on text drafts too.
* The arrow beside **Send email** opens **Send later**: **Later today**, **Tomorrow morning**, **Monday morning**, or **Pick date & time**, in your own time zone. A scheduled email shows **Scheduled** with the time, plus **Change** and **Cancel**. If it can't go, the card says **Not sent:** with the reason, and the bell tells you.
* **Discard** throws the draft away.
## SEO in the assistant [#seo-in-the-assistant]
The assistant can check whether keywords are tracked, add them to the [Keyword Tracker](./seo-keyword-tracker.mdx), read your rankings and AI visibility, and add a competitor, which starts the same sync as the Competitor Intel page.
**It always asks before paid work**, even when you asked for it. Paid work includes writing, rewriting, or optimizing an article, refreshing a page, keyword and domain research, backlink scans, AI visibility scans, site audits, and adding or analyzing a competitor. The card says what it will do and that it uses paid research or AI. Reading tracked keywords, rankings, and AI visibility that is already measured costs nothing and does not ask.
## Web browsing [#web-browsing]
The assistant can look things up on the web, and work through a website for you, such as finding times for a booking. A live view of the page and screenshots appear in the chat, and only you can open them. For a long task, the chat says it is still browsing, and the result arrives in the same chat. Click **Stop** to end it.
It can also tell you whether a page has a chat widget, a booking or contact form, a tracking tag, or another script installed, because it reads the page's source as well as its text. Ask with the page's address, for example "Is the chat widget on example.com/contact?"
It never sends a form on a website until you approve it on a **Send this form?** card.
**Turn it off for your firm.** Owners and admins can switch off **Web browsing and search** under [Settings > AI Personalization](https://app.superpractice.com/settings), in **Your firm**. It is on by default. When off, your assistants never search or visit websites, and nothing is sent to search or browsing services. Company research, SEO data, and syncing your own site are not affected. The assistant's steps then say **Web search is off for your firm** or **Web browsing is off for your firm**. See [Data retention & AI privacy](./data-retention.mdx#features-outside-zero-data-retention) for what is shared when it browses.
## Have an agent call a contact [#have-an-agent-call-a-contact]
Ask the assistant to have your firm's voice agent call one of your contacts, for example "call Dana and find a time this week". It shows a card naming the contact, the number and what the call is about, and calls only after you approve. When the call ends, the result comes back to the chat and to your notifications.
**Calling hours.** A call reaches a contact only inside the hours the law allows calls where they are, on their own clock. Outside them, the assistant tells you before asking for your approval, with the next allowed time in your time zone. It then offers what it can do instead, such as calling at that time or sending a text. See [When procedures text and call](./procedure-hours.mdx) for the hours in each state.
## Call a business for you [#call-a-business-for-you]
Ask the assistant to call a restaurant, shop, or office for you, for example to ask a question or make a reservation. It shows a card naming the business and calls only after you approve. The call is placed by your firm's voice agent that makes outbound calls, to US numbers only. It never uses this to call one of your contacts. The result comes back to the chat.
With web browsing and search off, it can't look up a business's number, but it can still call a number you give it.
If no agent places outbound calls, the assistant says so. An owner can turn on outbound calls for an agent under **Agents**. See [Let the agent place calls](./voice-agent-setup.mdx#let-the-agent-place-calls).
## When you have left the app [#when-you-have-left-the-app]
If an answer finishes after you have left, the assistant tells you once per chat:
* a notification in the bell, "Your answer about … is ready"
* a browser notification, if you turned it on
To turn on browser notifications, open [Settings > Notifications](https://app.superpractice.com/settings?tab=notifications), find **Browser notifications for assistant answers** under **Assistant**, and click **Turn on**. It is off by default, is set for each browser separately, and shows only the chat's name. On iPhone, add Superpractice to your Home Screen first. **Play sounds** in the same section plays a soft sound when the assistant reacts to a message, finishes a reply while you are in another tab or window, or something new lands in the notifications bell.
## Your time zone [#your-time-zone]
"Today", "yesterday", and "this month" in the assistant's answers follow your own time zone. Firm dashboards and reports still count days in the firm's time zone.
## Delete a chat [#delete-a-chat]
In your conversation history, right-click a chat and choose **Delete**, then **Delete forever**. The chat, its messages, and the files you added to it are removed permanently. Tasks it created, messages it sent to contacts, and saved memories stay.
## Related guides [#related-guides]
Open a task in the assistant, or have it create tasks for you.
Write down how your firm does something, so the assistant follows it.
Use Superpractice from other AI tools.
How the assistant handles your firm's data.
# Event types & booking pages (https://docs.superpractice.com/booking-event-types)
## Quick links [#quick-links]
Create and edit event types, view bookings.
Connect the calendar and Zoom accounts event types rely on.
## What an event type controls [#what-an-event-type-controls]
Each event type is one kind of meeting clients can book — an initial consultation, a case review, a signing appointment. The editor lists its sections down the left, in three groups:
* **Setup** — **Basics** (the name clients see, the booking link, a short description, the duration, and the color), **Location**, **Hosts**, **Availability**, and **Notice and buffers** (minimum notice, how far ahead clients can book, buffers before and after each meeting, and how often a start time is offered).
* **Booking page** — **Layout and look** (covered below), **Questions and screening** (also below), **Guests and repeats**, and **After booking**.
* **Reach clients** — **Notifications** and **Share and embed**.
**Next** and **← Back** at the bottom of each section move through them in order. The round **←** button beside the event type's name returns to all event types; it asks first if you have unsaved changes. As you scroll, the top bar stays in view with the **Accepting bookings** switch, **View page**, and the **⋯** menu.
## Location options [#location-options]
The Location setting decides where the meeting happens. The link or address lands on the calendar invite, confirmation email, and reminders automatically.
* **Calendar default** — follows the host calendar's meeting-room setting.
* **Google Meet / Teams** — always creates a meeting room. The provider follows the host's connected calendar: Google calendars create Meet rooms, Outlook creates Teams meetings.
* **Zoom** — creates a unique Zoom meeting on the host's account for every booking. With the Meeting Agent on, the meeting is cloud-recorded and the post-call report is written from Zoom's recording. See [the Zoom guide](./zoom.mdx) for setup.
* **In person** — enter your street, city, state, and ZIP; the address becomes the meeting location on the invite. Optional arrival info (parking, check-in) rides along in the invite description and under the location line in confirmation and reminder emails.
* **Phone call** — choose who places the call. *We call the client*: attendees see "Phone call — we'll call you at the number you provided." *Client calls us*: the number you enter becomes the meeting location.
* **Custom link** — one static URL (a personal meeting room) used for every booking of this event type.
* **No video link** — a clean invite with no meeting link at all.
## Team scheduling [#team-scheduling]
* **Single host** — one person hosts every booking of this event type.
* **Round robin** — bookings rotate across a host pool. The rotation picks the host the moment a slot is booked, from the hosts who are free at that time. Choose the **Round robin order**:
* **Share by priority** — give each host a priority of **High**, **Medium** or **Low**. Over time, a High host gets about 3 meetings for every 2 a Medium host gets and 1 a Low host gets. Hosts with the same priority share meetings evenly, and every host starts at Medium.
* **Whoever is free first** — clients see the most open times, so hosts with busier calendars get fewer meetings. Priority is hidden here; it only breaks a tie between hosts with the same open time.
* **Collective** — all selected hosts attend every booking; the primary host's calendar and Zoom account are used for the invite and meeting link.
### How Share by priority counts [#how-share-by-priority-counts]
Each pick goes to the free host who is furthest behind their share of this event type's meetings booked in the last 30 days. Cancelled meetings don't count. A host who is busy at the chosen time is skipped and catches up on later bookings. When you add someone new to this event type, everyone's count starts again from that moment, so the new host gets their share straight away instead of taking a run of bookings to catch up. Removing a host and adding them back later doesn't restart the count.
### Managing hosts [#managing-hosts]
Each host is a row in the **Hosts** list: remove a host with the cross on their row, and add one with **Add host** at the bottom. In Share by priority, each row has a **Priority** menu. A row shows **Connect a calendar** when that host has none.
Hosts need a connected calendar to receive bookings — and, for Zoom event types, a connected Zoom account. Team members without a calendar show in the **Add host** list but can't be picked until they connect one.
## Custom availability [#custom-availability]
By default, booking pages offer times when the host's calendar is free. Custom Availability adds this event type's own weekly hours on top — for example, keeping consultations to Monday–Friday mornings even when the calendar is otherwise open. Set per-day time ranges in the timezone of your choice; days toggled off are never offered.
## Page layout: Calendar first vs Form first [#page-layout-calendar-first-vs-form-first]
**Page layout**, under **Layout and look**, controls how the booking page collects details and shows times.
* **Calendar first** (the default) — clients pick a date and time first, then fill out the details form. Every existing event type works exactly this way until you change it.
* **Form first** — the form comes first: phone number and name before any time slot is shown. The calendar sits beside the form, visibly locked, with "Please fill out the form before choosing your time slot."
The reason to use Form first: **the lead is saved as a contact the moment they submit their phone and name** — before they ever pick a time. A visitor who fills in their number and then gets pulled into a meeting is no longer a lost lead; they're in your Contacts, phone in hand, ready for follow-up.
**To enable it:**
1. Open the event type and go to **Layout and look**.
2. Under **Page layout**, select **Form first**.
3. Optionally set a **Headline** ("Book Your Free Consultation" — blank uses the event type name), up to six **Reasons to book** shown under it, and your own **Consent text**. **Compact layout** keeps the booking steps in a smaller space.
4. Save. The booking page and embeds switch immediately.
**What the client experiences:** phone number and name first; the remaining fields — email, your custom questions, the text-message consent box — appear instantly as they start typing their name. One Continue unlocks the calendar. Clicking a time shows a **Confirm** button directly under it; nothing books until they click it, and they can freely change the date or time until they do.
**How partial leads behave.** A lead who starts but never books becomes a contact with status *Touchpoint*, marked internally as a booking partial:
* They do **not** trigger lead alerts, outbound webhooks, or email sequences — those fire once, only if the booking completes.
* They have **not** agreed to texts (the consent box comes later in the form), so they never enter text sequences.
* If the same person later completes a booking — even weeks later — the same contact is updated, not duplicated, and your usual new-lead notifications fire at that point.
URL-parameter prefill from your landing pages (`?phone=…&first_name=…&email=…`) works on both layouts; a link carrying phone and name captures the lead on page load.
## Custom questions [#custom-questions]
Ask qualifying questions on the booking page itself. Answers are saved on the booking and shown to your team — no separate intake form needed.
**To add questions:**
1. Open **Questions and screening**. Under **Add questions**, click **Add question**. Name, email, and phone are always asked, so you don't need to add them.
2. Write the question label and pick an **Answer type**: **Dropdown**, **Radio buttons**, **Checkboxes**, **Short text**, **Long text**, or **Website URL**.
3. Toggle **Required** as needed, and reorder with the arrows.
4. For choice questions, add the answer options.
On the Calendar first layout, questions appear on the details form after a time is picked; on the Form first layout they appear in the first-step form.
**Disqualifying answers.** Any option on a choice question can be flagged **Disqualifies**. A lead who picks it is stopped before booking, and you choose what they see per question: **Show a message** (your own copy — "We're built for firms at $10k+/month…") or **Send them to a page** at a URL of your choosing. The check runs on our servers, so it can't be bypassed by editing the page.
**Where answers go:** the booking's **Booking Answers** section in the meeting details view, and the meeting's tooltip on the contact's activity timeline. Answers are snapshotted with their labels at booking time, so editing a question later never rewrites history.
**Answers in the calendar invite.** Under **Calendar invite**, **Show answers in the calendar invite** is on by default. Each question and its answer is added to the invite's notes, and unanswered questions are left out. Everyone on the invite can read those notes, so turn it off to keep answers in Superpractice only.
## Screening rules ("Only allow booking for") [#screening-rules-only-allow-booking-for]
Three rules screen leads by their details, independent of any question. Each rule has its own blocked-lead outcome — a message or a redirect — and all of them are enforced server-side.
* **Phone number countries** — allow only (or block) specific countries, picked from a searchable flag dropdown. Checked the moment the lead submits their phone number.
* **Business email required** — blocks free and disposable mailbox providers (Gmail, Yahoo, Outlook, and thousands more). This one is also checked **live**: the moment a lead types `name@gmail.com`, your message appears under the email field so they can switch to their work address before submitting.
* **Timezones** — allow only (or block) bookings by the lead's detected timezone, picked from a searchable dropdown with live UTC offsets. Timezones match exactly, and neighboring zones exist (Detroit and New York are separate entries) — add the variants you care about; the search makes it quick.
On the Form first layout, a blocked lead sees the page advance to a locked calendar with your message overlaid — a clear, final state. With a redirect outcome they're sent straight to your URL.
## Guests [#guests]
Turn on **Guests** to let the person booking invite others — a spouse, a business partner, a co-counsel — up to the maximum you set (default 5).
Guests are added by email on the booking page and become real attendees on the calendar invite: they receive it in their inbox, can accept or decline, and stay on the event through reschedules. Guests never affect the lead record — the person who booked remains the contact.
## Repeats (recurring meetings) [#repeats-recurring-meetings]
Turn on **Repeats** to make one booking create a repeating calendar series — a weekly standing check-in, a monthly review on "the second Tuesday," and so on.
1. Toggle **Repeats** on and pick a preset — Daily, Weekly on the booked day, Monthly on the booked weekday or date, Annually, Every weekday — or choose **Custom** for any interval, specific days, and an end (never, after N occurrences, or on a date).
2. The booking page shows the schedule ("Repeats weekly") before the client books.
3. When they book, the host's calendar gets a single repeating series, and the invite reflects it.
**Requirements and behavior to know:**
* Recurring event types need **single-host scheduling** and a connected **Google or Outlook calendar**.
* Only the **first occurrence** is availability-checked at booking time; later occurrences follow the series even if something else lands on the calendar.
* Cancelling or rescheduling affects the **whole series**, not one occurrence.
## Notifications [#notifications]
The **Notifications** section lists each message the client gets, with an **Email** and a **Text** box for each:
* **Booking confirmation** — the time, the place, and how to reschedule. Sent the moment the booking is made, with the calendar invite.
* **Reminder** — the time again, with the link to join. Click **+ Add reminder** for as many as you need, each with its own timing (minutes, hours, or days before).
* **Cancellation notice** — confirms the meeting is off.
**Reschedules follow the Booking confirmation row.** When a meeting moves, the client gets the reschedule message by email, by text, or both, just as the confirmation is set. With both boxes off, no reschedule message is sent, and reminders for the new time are still scheduled. This holds however the meeting was moved: from the booking page, by the assistant, or by a voice agent.
### Require SMS consent to book [#require-sms-consent-to-book]
**Require SMS consent to book** is on for every event type unless you turn it off.
* **On** — clients must tick the text-message consent box to book.
* **Off** — the box is marked optional, and booking never waits on it. Clients who leave it unticked get every booking message by email instead.
Phone carriers can reject your texting approval while this is off, so leave it on unless you have a reason not to.
**Email always reaches the client.** Texts go only to clients who agreed to them. A client who can't be texted — no consent, or no mobile number — gets each message by email instead, even one set to **Text** only. A client never gets the same message twice, once by email and once by text. Every text ends with "Reply STOP to opt out."
### Message wording [#message-wording]
The wording of these messages is shared across your firm. **Edit message templates**, under the switch, opens **Settings > Notifications > Booking Notification Templates**. There, owners and admins can write their own email and text for the confirmation, reminder, cancellation, and reschedule, with a **Preview**. Saved wording applies on every event type; a message you leave blank uses the default. Templates change the words only, not which messages are sent or when.
## Share & embed [#share--embed]
Every event type has a Share & Embed tab with:
* **The booking link** — share it in email signatures, ads, or anywhere else.
* **Embed code** — drop the booking widget into your website as an inline section, a popup button, a floating button, or a plain iframe, with a configurable widget background.
* **Site widget** — a floating booking card for the corner of every page, with the host's photo, live openings, a booking button, and a call or text-me-a-link button. It has its own settings, preview, and install code; see [the Site widget guide](./booking-site-widget.mdx).
* **A live preview** — exactly how the widget renders for visitors, including the widget background color you set for embeds.
## After booking [#after-booking]
* **Accepting bookings** — the switch at the top of the editor. Turning it off hides the booking page immediately; bookings that already exist are unaffected and keep their invites, reminders, and links.
* **Require host confirmation** — bookings stay pending until the host approves them. The calendar invite and confirmation go out on approval.
* **Accept the organizer's calendar invite** — confirmed meetings go on the host's calendar as accepted, so the slot reads as busy without the host clicking anything.
* **After a booking** — **Confirmation page**, or **Send them to a page** of your own. Covered in depth in the next section.
## Redirect to your own confirmation page [#redirect-to-your-own-confirmation-page]
In **After booking**, set **After a booking** to **Send them to a page** and enter the **Page address**. Instead of the standard confirmation screen, clients land on your page, with the booking's details added as query parameters so you can build a personalized confirmation: greet the client by first name, show their time and meeting details, and offer cancel and reschedule links.
**Never in the address:** the client's email, phone number, last name and full name. A page address is read by every analytics and ad script on your page, so contact details stay out of it. If your page needs more than the first name, look the booking up by `bookingId`.
**Always included:**
| Field | Required | Notes |
| ----------- | -------- | ------------------------------------------------------------------------------------------------- |
| `bookingId` | Always | Unique ID of the booking. |
| `eventName` | Always | The event type name, e.g. Initial Consultation. |
| `startTime` | Always | ISO 8601 timestamp in UTC, e.g. `2026-08-04T15:30:00.000Z`. Convert for display using `timezone`. |
| `endTime` | Always | ISO 8601 timestamp in UTC. |
| `timezone` | Always | The client's IANA timezone chosen at booking, e.g. `America/Chicago`. |
| `duration` | Always | Meeting length in minutes. |
**Included when the booking has them.** Treat these as optional:
| Field | Required | Notes |
| ------------------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `inviteeFirstName` | Conditional | The client's first name as entered, ideal for greetings. |
| `meetingLink` | Conditional | Video meetings only: the join link. |
| `location` | Conditional | The meeting's "where", ready to display: in-person meetings send the address; phone meetings send the call details ("Phone call — we'll call you at the number you provided" or "Phone call — call (555) 123-4567"); video meetings send the video platform's name, or "Video call", alongside `meetingLink`. Matches the calendar invite exactly. |
| `locationNotes` | Conditional | In-person meetings with arrival info: parking, suite, check-in instructions. |
| `hostName` | Conditional | The host actually assigned to this booking: the single host, the **round-robin winner** for rotating teams, or the primary host for collective events. |
| `hostNames` | Conditional | Collective events with two or more hosts: the full comma-joined roster. |
| `organizationName` | Conditional | Your firm's display name. |
| `cancelUrl` | Conditional | Link the client can use to cancel. |
| `rescheduleUrl` | Conditional | Link the client can use to reschedule. |
**Example: video meeting with round-robin hosts.** The client booked with a rotating team; `hostName` is the host the rotation picked for this booking:
```text title="URL"
https://meridianlaw.com/thank-you
?bookingId=b7e9a2c4-5f31-4d8e-9a06-1c2d3e4f5a6b
&eventName=Initial%20Consultation
&startTime=2026-08-04T15%3A30%3A00.000Z
&endTime=2026-08-04T16%3A00%3A00.000Z
&timezone=America%2FChicago
&duration=30
&inviteeFirstName=Maria
&meetingLink=https%3A%2F%2Fmeet.example.com%2Fabc-defg-hij
&location=Video%20call
&hostName=Sarah%20Calloway
&organizationName=Meridian%20Law
&cancelUrl=https%3A%2F%2Fapp.superpractice.com%2Fbook%2Fcancel%3Ftoken%3D...
&rescheduleUrl=https%3A%2F%2Fapp.superpractice.com%2Fbook%2Freschedule%3Ftoken%3D...
```
**Example: in-person meeting.** No `meetingLink`; instead the address and arrival info arrive as `location` and `locationNotes`:
```text title="URL"
https://meridianlaw.com/thank-you
?bookingId=c8f0b3d5-6a42-4e9f-8b17-2d3e4f5a6b7c
&eventName=Estate%20Planning%20Session
&startTime=2026-08-06T19%3A00%3A00.000Z
&endTime=2026-08-06T20%3A00%3A00.000Z
&timezone=America%2FChicago
&duration=60
&inviteeFirstName=James
&location=500%20Main%20St%2C%20Suite%20210%2C%20Austin%2C%20TX%2078701
&locationNotes=Free%20parking%20in%20the%20rear%20lot.%20Check%20in%20with%20reception%20on%20the%202nd%20floor.
&hostName=Daniel%20Reyes
&organizationName=Meridian%20Law
```
**Example: phone call, "we call the client."** `location` carries the same message shown on the calendar invite; the client's number is never in the address:
```text title="URL"
https://meridianlaw.com/thank-you
?bookingId=d9a1c4e6-7b53-4f0a-9c28-3e4f5a6b7c8d
&eventName=Free%20Case%20Review
&startTime=2026-08-07T14%3A00%3A00.000Z
&endTime=2026-08-07T14%3A30%3A00.000Z
&timezone=America%2FNew_York
&duration=30
&inviteeFirstName=Dana
&location=Phone%20call%20%E2%80%94%20we%27ll%20call%20you%20at%20the%20number%20you%20provided
&hostName=Sarah%20Calloway
&organizationName=Meridian%20Law
```
**Building your page.** Read the parameters client-side or server-side. Values are URL-encoded — your framework's query parser decodes them for you. Times are UTC; convert using the `timezone` parameter. Treat every conditional parameter as optional:
```js title="JavaScript"
const params = new URLSearchParams(window.location.search)
const firstName = params.get("inviteeFirstName") ?? "there"
const startTime = params.get("startTime") // ISO 8601, UTC
const timezone = params.get("timezone") ?? "America/Chicago"
document.querySelector("#greeting").textContent = `You're confirmed, ${firstName}!`
if (startTime) {
document.querySelector("#when").textContent = new Date(startTime).toLocaleString("en-US", {
dateStyle: "full",
timeStyle: "short",
timeZone: timezone,
})
}
// Optional details — only render what arrived
const location = params.get("location")
if (location) document.querySelector("#where").textContent = location
const hostName = params.get("hostName")
if (hostName) document.querySelector("#host").textContent = `Meeting with ${hostName}`
```
Every value is computed on our servers at the moment the booking is made — the same source that writes the calendar invite and emails — so your confirmation page can never disagree with what the client sees elsewhere.
# Site widget (https://docs.superpractice.com/booking-site-widget)
## Quick links [#quick-links]
Open an event type, then Share & Embed → Site widget.
The firm-wide default for the card's second button.
Your photo, shown on the card next to your name.
## What the site widget is [#what-the-site-widget-is]
The site widget is a small card pinned to the corner of your website. Collapsed, it is a round launcher with a label that reads "Next opening Thu, Sep 10". Open, it shows the host's photo, name, and title, a one-line headline, a short description, the next opening and how many openings are left this week, a strip of the next open days, a booking button, and an optional second button to call the firm or get the booking link by text.
Everything on the card is real. The openings come from the host's calendar at the moment the page loads, the same source as your booking page. There is no countdown, no "only a few slots left", and no made-up number. A visitor who picks a day and clicks the button lands in the booking popup on that day.
Each event type has its own site widget, so a firm can run one card for consultations on the main site and a different one on a practice-area landing page.
## Install it [#install-it]
1. Open the event type under [Booking](https://app.superpractice.com/booking) and go to **Share & Embed → Site widget**.
2. Copy the install code at the bottom of the tab and paste it before `