How to build a team meeting scheduler with Replit
Build and host a scheduler for your whole team inside one Replit workspace. Use simple prompts to set up per-host availability, round robin and collective meetings, a booking write that cannot double-book, and Google Calendar sync, then deploy to a live web address.
Replit
$ Build a team meeting scheduler with a Postgres database in this workspace: each host’s hours in their own time zone, availability worked out on the server for one-on-one, round robin, collective and group meetings, one protected booking write, a hashed manage link, and Google Calendar sync.
- Database provisioned in the workspace
- Availability and booking built
- Ready for you to publish
What a team meeting scheduler actually is
A shared diary with a front door. It has to know who can take each kind of meeting, when each of them works in their own time zone, what their calendar already holds, and who else is booking right now, and be right about all four when a stranger picks a time.
Most small applications store what people type and give it back later. A scheduler is different, and the difference shapes every decision below: what it offers is somebody’s time, each slot exists once per person, and the answer to “is Thursday at ten free” depends on a calendar the app does not own and can change while the visitor is looking at the page.
It is also why most readers arrive already renting one, and paying for it by the head. The rate per person is modest on its own. What a growing team meets later is that the features which make it a team tool, handing bookings round and meetings that need two people at once, often sit a plan above the one they started on, so hiring and growing are both line items.
What makes it hard to build is not the grid of times. The grid is a conclusion: each host’s weekly hours in their own zone, minus their days off, minus the gaps around meetings they already have, minus anything inside your notice period, minus what their Google Calendar says, and then, for a team meeting, combined across hosts. That conclusion has to hold when two people act on it in the same second.
Hours belong to people, not to the business
A company-wide nine to five works until the first host lives somewhere else. Weekly hours are stored per person, in that person’s time zone, and turned into real moments for each date, so a Friday in London and a Friday in New York are two different sets of hours that happen to share a name.
The meeting type decides who is asked
One-on-one asks one host. Round robin asks every host in the rotation and picks one when the booking arrives. Collective asks every host and offers only the times they all share. A group session asks one host and counts seats. The visitor sees the same page each time, with four different questions underneath it.
The other calendar is the one people trust
Your hosts live in Google Calendar, not in your app. A dentist appointment added there this morning has to block the slot on your page this afternoon, and a booking made on your page has to appear there with its video link. Both directions fail quietly when they fail, so both deserve a test of their own.
Why time zones come first
Nearly a third
of meetings now span more than one time zone, up 35% since 2021, according to Microsoft’s June 2025 analysis of anonymised Microsoft 365 activity. That is measured across large organisations rather than small teams, but the shape travels: the moment one host or one client is somewhere else, a scheduler that thinks in a single zone is showing somebody the wrong hour.
Microsoft WorkLab, Work Trend Index special report, June 2025 · checked published June 2025
The parts every team scheduler is built from
One of these six is the product and the other five are built around it. If you read only one, read the first: it is where the build time goes and where the embarrassing failures come from.
Free times worked out from each host’s own rules
For each date, take the host’s weekly hours in their own time zone, drop the dates they marked off, cut what remains into start times at the interval you chose, then remove anything inside your notice period, anything that would run into one of their existing meetings once the gaps before and after are added, anything their Google Calendar marks busy, and any day where they have already reached the limit you set. What survives is what you may offer. Every one of those inputs lives on the server, so the answer does too, and the browser is told rather than asked.
A meeting type is a set of rules, not a name
A 15-minute intro call and a 90-minute workshop want different notice, different gaps either side, a different daily limit and different questions in the form. Put those rules on the meeting type rather than in one global setting, along with where the meeting happens, and the same host’s Tuesday produces a different set of times for each.
One write that cannot double-book a host
Two visitors pick the same 10am with the same host, and both press the button within a second. The server has to work the times out again inside the write rather than trusting what either page was shown, and the database should refuse two confirmed meetings that overlap for the same person whatever the code above it gets wrong. With both in place there is nothing to hold and nothing to sweep up afterwards: the second booking is simply told the time has gone.
Round robin with a rule you can explain
When a booking could go to any of four hosts, something picks one, and sooner or later a host asks why the last three went to somebody else. Fewest recent bookings first, or a fixed order of priority, are both defensible. What matters is that the rule is written down, a host can be taken out of the rotation for a fortnight, and each booking records who got it.
A link that manages the booking without an account
A client will want to move the meeting or call it off, and will not make an account to do it. The confirmation carries a link that does both. It stands in for a password, so it is long and random and stored only as a hash, and moving the meeting should update the invitation already in their calendar rather than sending them a second one.
A booking page that goes where your clients are
Most bookings start somewhere other than your booking page: a pricing page, a proposal, a signature in an email. An embed that sits inline on your own site, opens as a popup from a button, or hangs off a text link puts the same page wherever the client already is, with your logo and colour rather than somebody else’s.
Build it once or pay for every host
Scheduling tools price per person who can be booked, from $10 to $28 a user a month across the first three below. Count the hosts you expect next year, not this year, before choosing.
Build your own
An app you own has no meter on the team. Nobody counts your hosts, and round robin is a setting on the team page rather than a reason to change plan. With an AI coding tool writing the slot engine, the booking write and the access rules, that build is weeks rather than quarters.
- The sixth host joins the rotation without anybody reopening the budget
- Round robin, collective meetings and group sessions are parts of the app rather than parts of a pricing tier
- Your booking page lives on your own domain and inside your own site, not on a vendor’s subdomain
- Every booking, answer and cancellation reason sits in your own database, queryable without an export
- How round robin chooses, how much notice you need and how long a gap to leave are your rules to write
- The invitation a client receives carries your name and your reply-to address, and nobody else’s logo
Rent the scheduler
Calendly · Cal.com · SavvyCal · Chili PiperWhat renting buys is years of scheduling machinery, and some of it is genuinely tedious to reproduce: sync with Outlook and iCloud as well as Google, deposits, packages and invoices, routing that hands a lead to your CRM, and a support team for the week a calendar stops syncing.
- Working the day you sign up, with every calendar provider already connected and verified
- Outlook, Microsoft 365 and iCloud calendars, where this template connects Google Calendar only
- Deposits, packages, coupons and invoices, where this template takes the full price by card at booking
- Texts through any provider you like, where this template sends them through Twilio only
- CRM hand-offs and territory routing for a sales team, where deciding who takes the lead is the product
- Every one of the four bills per person, so the price moves each time the team does
The name most clients already recognise, and the clearest example of the tier gap: round robin and team scheduling are on Teams and Enterprise only, so the Standard seat does not cover a team that shares bookings. Free allows “One event type” and “One calendar connection”. Both positions of the billing toggle were read, and yearly billing saves 17% on Standard and 20% on Teams. Enterprise “Starts at $15k /yr” and at 50 seats.
calendly.com · checked September 2026
The closest match to this template. Its Teams plan lists “Round-robin scheduling”, “Managed & collective event types” and “Routing forms”, with a 14-day trial. Free is genuinely free for one person, with unlimited event types and calendars, so the meter starts the day a second person joins. The page prints yearly figures only and advertises a 25% saving on them, so the month-to-month rate is higher than the one quoted here, and we have not guessed at it.
cal.com · checked September 2026
Included because it removes the tier argument and leaves only the meter: Basic already carries “Team scheduling”, “Round Robin Mode” and “Group Mode”, so a team pays the entry rate for every person and nothing more. Custom domains and paid bookings are on Premium. There is no free plan, only a trial and a “30-day money back guarantee”. Both billing positions were read, and paying annually saves two months.
savvycal.com · checked September 2026
The other end of the market, where sending a lead to the right salesperson is the product rather than a feature. The entry plan includes “Up to 15 seats”, with “$45/seat/mo after that”, and the FAQ is plain about terms: “Monthly billing is not available at this time.” It is here to show what the category charges when distribution is the whole point. If that is your problem, the round robin in this template is a starting place rather than a replacement.
chilipiper.com · checked September 2026
Rule of thumb: if your hosts live in Outlook, your sessions are sold as packages or with deposits, or your leads have to reach a CRM the moment they book, rent. Those are real products, and none of the three is a weekend of describing. If what you need is one page for the team, bookings that reach the right person, and a bill that stays put when you hire, that is the half worth owning. One figure worth weighing either way, with its source in view: in a survey Calendly commissioned in mid-2024 of 1,244 workers in the US and UK, 43% said they spend at least three hours a week just scheduling meetings, up from 36% the year before. A scheduling vendor has an interest in that number, and it still describes a week most readers will recognise.
Why build with Replit
A real app needs somewhere durable to keep what people enter, rules about who’s allowed to see it, and a place to actually run once it’s built. Those are three separate problems, and most solo builds solve them badly, or not at all.
Replit’s Agent handles all three from one chat, in the same workspace the app ends up living in:
Describe
Tell the Agent what to build, in plain language.
Watch
It writes the code, sets up the database, and shows the app running live.
Try it
Use the real app in the preview rather than a mockup.
Publish
Take it live on Replit’s own hosting, or ask for the next change.
The build and the place it ends up running are the same workspace throughout, so there’s no separate hosting account to set up later.
One workspacebuilds, runs, and hosts it
Replit is the one tool here that also deploys what it builds. Publishing takes the same project live on Replit’s own infrastructure, with a working domain, uptime monitoring, and security scanning included.
Managed Postgres with 20GB included free
Ask the Agent to add a database and it creates the schema and wires your app to it. What you get is a real, fully-managed SQL database rather than a mocked one.
Up to 10 Agent sessions in parallel (Pro)
Core allows up to 2 parallel Agent sessions and Pro allows up to 10, so more than one part of the app can be worked on at the same time.
Pay a developer, or do it with AI
Commercial schedulers bill for every person on the booking page. Count the hosts you expect to have in two years, because that headcount is the line that drives your bill.
Hire a developer
Custom build, from scratch- Developer
- ~$12k-$46k
- Supabase (backend)
- Free tier · $25/mo (Pro plan)*
- Hosting
- $0 free tier
- Build time
- ~230 hrs of their work
~$12k-$46k to build, then from $25/mo after launch
Our ~230-hour estimate at market rates. The survey linked below puts senior US developers at $100-$150+ an hour and records agencies charging 20-40% above the freelancers they compete with, which is what makes $50/hr and $200/hr the honest ends of the range. Most of those hours sit where no screenshot shows them: the slot engine across hosts and time zones, the write that refuses a double booking, and the Google connection with its tokens kept on the server. That is the usual reason a quote for “a booking page” comes back at several times what the mockups suggest.
Build it with Replit
From scratch, with Replit- Replit
- Free (daily credits) to $25/month (Core) or $100/month (Pro)
- Database (built-in Postgres)
- Free to start · 20GB included
- Hosting (Replit Deployments)
- Billed separately, on top of the plan
- Your time
- ~110 hrs
Free to try the idea, ~$25-$100/month on Core or Pro while you build a real one, then whichever plan (plus any deployment cost) you keep using
Replit’s plan price and its credit grant are the same number, not a subscription plus a separate credit purchase: Core is $25/month for $25 of monthly credits (or $20/month billed annually), Pro is $100/month for $100 of monthly credits (or $95/month annually). Once you publish, Replit bills hosting through its own Deployments separately, on top of whichever plan you’re on. Budget for it as a second line, not folded into the $25 or $100.
* The free-tier line that matters here is the pause, not a storage number. Free gives you a 500 MB database, 1 GB of file storage and 5 GB of egress a month, and bookings are small enough that only your logo and cover image ever touch the storage figure. The pause is different: a free project stops after a week with no activity, and a booking page that has gone to sleep is a team that looks unavailable. From $25/mo, Pro removes the pause, raises egress to 250 GB (then $0.09 per GB), and keeps a daily backup for 7 days.
Neither column above grows with the team. The tenth host costs what the second one did, so after launch the only line that can move is an AI model you choose to call, and only if you add a feature that uses one.
Prices and rates from supabase.com, developex.com and replit.com, checked September 2026.
Decide before you build
Six things to settle in writing first. Each one is a promise to somebody who is about to arrange their day around your team, and each costs far less to decide now than to unpick once real meetings are in the calendar.
Whose hours a time comes from
Decide whether availability belongs to the business or to each person. One set of opening hours is simpler, and wrong the moment a host works different days. Weekly hours per person, each in that person’s own time zone, cost a little more to build and are the only version that survives a second office.
How round robin chooses
Fewest recent bookings first, a fixed order of priority, or both? Write the rule in one sentence before anything is built, because hosts will ask why the last three meetings went to somebody else. Whatever you choose, record who got each booking, so the answer is a query rather than an argument.
What happens when Google does not answer
Your page asks each host’s calendar before offering a time. When that call fails, you either stop offering times or offer ones Google could not confirm. Offering them keeps the page working and risks an occasional clash. Stopping is safer and looks broken. Choose deliberately, and log the failures either way.
How much notice, and how many a day
Minimum notice stops a booking landing ten minutes from now. A daily limit stops a host doing eight calls on one Tuesday. A gap before and after keeps them from running late. Set all three per meeting type, since a quick intro call and a two-hour workshop want very different ones.
Whose clock the invitation is in
Store every meeting as one absolute moment, draw it in the viewer’s zone, and let the visitor correct the zone the page guessed. Then test the awkward cases on purpose: a client six hours away, a host in another country, and the week one of them changes the clocks and the other does not.
What a guest can change without an account
Guests will want to move or cancel. Give them a link that does both, and decide how late is too late. That link stands in for a password, so it should be long, random and stored only as a hash, and a reschedule should update the original invitation instead of sending a second one.
Comparing your build options
Connecting separate databases, backend servers, and hosting eats up most development time. Compare three ways to launch: writing code from scratch, using a basic UI kit, or building inside Replit, where your database, server logic, and live site live in a single workspace.
The screens are the quick part. The slow part is the question behind every time on the page: is this person free, given their hours in their own time zone, the gap you want after their last call, the notice you asked for, what their Google Calendar says, and whoever else is pressing the same button this second. Round robin asks it once per host, and a collective meeting asks it of everyone at once.
A starter kit gives you a month grid, a form and a dashboard shell, which looks like most of a scheduler and is the part you would have finished anyway. Nothing in it knows whose hours apply, which host is next in the rotation, or that the 3pm on screen went to somebody else a minute ago. All of that is still yours to write.
One request at a time to the Agent, with the database, the server and every screen written inside the workspace that ends up hosting them. Sign-in belongs to you here as well, since on this tool the only thing able to tell the database who is asking is your own server.
Estimate your exact build timeframe
Not every team needs all six features. Untick what yours can do without, like charging for a session or syncing with Google Calendar, to see your real build time.
Your estimate
110 hrs
start to finish
Based on the 6 of 6 features you’ve selected, plus ~21h of groundwork. Toggle any on the left to watch the number move, and open the groundwork row to untick what you have already, such as a database that is already running or going live if you are only building a mock-up for now.
A rough estimate, not a quote. Real time depends on how much you customize and how clean your data is.
Let’s set up the tools you need
Replit runs entirely in the browser, and it’s the one tool here that also hosts what you build, so no GitHub account is required first. Before step 01: an account and a plan. A database comes later, the moment your app actually needs one, and GitHub whenever you want a copy of the code outside Replit.
Replit account
Sign up and you land in a workspace with an Agent chat, the code, and a live preview side by side, with nothing to install.
Sign up for ReplitReplit subscription
Starter’s free daily credits are enough to try an idea, not to finish one. Core is $25/month billed monthly, or $20/month billed annually, for $25 of monthly credits and up to 2 parallel Agent sessions. Pro is $100/month monthly, or $95/month annually, for $100 of monthly credits, more collaborators, and access to the strongest available models. The price you pay and the credits you get are the same number on both plans, so you have no separate subscription-plus-credits split to work out.
Compare Replit plansReplit database (Postgres)
Every Replit app includes its own managed Postgres database with 20GB of free storage. Ask the Agent to add one and it creates the schema and connects your app to it, with no separate account to create anywhere else.
Replit’s built-in database, Replit docsGitHub connection
Not needed to start, and not needed as an undo either, because Replit checkpoints the whole workspace as the Agent works. Connect a repository from the Git pane, free on every plan, and a copy of the real code lives outside Replit under your own account. Worth doing once the project is one you would hate to lose.
Using the Git pane, Replit docsThe first two are all you need to start. Everything here stays inside the one browser tab, the app included once you publish it, and the GitHub copy is the one deliberate exception.
Build your scheduler, one Agent message at a time
Zero complex setup required. The Replit Agent creates your code, provisions a built-in database, and configures user security, all through simple chat instructions.
- 01
One message for the app, the database, and the ground rules
Postgres is part of this workspace rather than an account you go and open, so it belongs in the opening request, together with the two constraints the rest of the build stands on.
PromptSet up the project and the databaseSet up a React 18 + Vite + TypeScript app with Tailwind and a server, and add a Postgres database to this Repl, the one Replit provisions, not anything outside. Write a short notes file at the project root recording three things. This is a team meeting scheduler. The words throughout are member, host, weekly hours, date off, meeting type, one-on-one, group, round robin, collective, slot, booking and manage link. And two standing rules: whether a time is free is worked out on the server from each host’s rules and existing bookings and worked out again inside the write that creates a booking, never taken from the client, and every moment is stored in UTC with each host’s weekly hours kept in that host’s own zone. Keep the database connection details in Replit’s Secrets rather than in the code.
Both rules go in the file, not only in this request. A time handled “in the browser for now” is what any assistant reaches for once every test host sits in the same city, and on this app that shortcut is how a client in another country joins an empty call.
- 02
The team and the booking page, checked at a checkpoint
Schema and public pages in one go. Nothing writes anything yet, which makes this the inexpensive moment to discover your meeting types are organised the wrong way round.
PromptModel the team and build the booking pageDesign the schema and the server routes over it. Members: name, email, title, a colour, a role of admin or host, their own time zone, a round robin priority, and whether they are in the rotation. Weekly hours per member per weekday as one or more ranges in their zone, and dates off per member. Meeting types: name, URL slug, description, length, a kind of one-on-one, group, round robin or collective, seats for a group, a round robin rule of balance or priority, a location with a detail field, minutes of gap before and after, minimum notice, the interval between start times, a daily limit, and the members who host it. Questions per meeting type. One workspace row for the name, accent colour, logo and default zone. Seed three hosts across two time zones, one meeting type of each kind, and a host who is off on Fridays. Then the public side over it: a page listing meeting types, and a page per type with a month calendar, placeholder start times, and a time-zone picker that guesses the visitor’s zone. No accounts and no bookings in this message.
Open your own booking page in the preview before going further, and take the checkpoint while you are there. How you name and group meeting types is the one structural choice clients navigate with their thumbs, and a list that read well as words rarely survives becoming a page of cards.
- 03
Availability on the server, written by the Agent
The step that decides whether the times on screen mean anything. Ask for it on the server explicitly, and judge it on the starts it takes away rather than the ones it offers.
PromptWork out availability properlyBuild availability as a server module, not logic in a page. Given a meeting type and a range of at most 45 days, return only genuinely free starts. For each host and date: take that weekday’s hours in the host’s own zone and turn them into UTC moments for that date, drop dates off, cut the hours into starts at the meeting type’s interval, then remove any start inside the minimum notice, any whose meeting plus the gaps before and after overlaps one of that host’s confirmed bookings, and every start on a day where the host has reached the daily limit. Combine by kind: one-on-one and group use their one host, round robin offers a start if any host in the rotation has it, collective only if every host has it, and a group start already booked stays on offer until its seats are full. Expose it through one server route the page calls, reading the bookings at request time. Then, in the preview, print the working for one Wednesday for the round robin type (which rule removed each missing start) and show me the same week as a visitor in Tokyo would see it.
This is the step where checkpoints earn their keep. Availability reaches into the schema, and a rollback here offers to take the database along with the code, which is a gift while every row is seed data you made up and a decision worth pausing over once real bookings are in there.
- 04
The booking write, the manage link, and mail sent from your server
A booking Postgres refuses to duplicate, a client with no account who can still move it, and the three emails that tell everybody what happened.
PromptTake the booking in one protected writeBuild the booking side as one Postgres function called by a server route, never as separate inserts from the page. It takes the meeting type, the start, and the guest’s name, email, zone and answers. Inside one transaction: an advisory lock per host involved, the start worked out again with the availability module’s rules, the round robin host picked (balance is fewest confirmed bookings from seven days ago to thirty days ahead with priority breaking ties, priority is the highest-priority host who is free), seats and the daily limit checked, then the booking and a row per host inserted. Add an exclusion constraint so one host can never have two confirmed bookings that overlap. A manage token of 32 random bytes with only its SHA-256 hash stored, and a manage page to cancel with a reason or pick a new time, keeping the same calendar invitation id with its sequence increased. Confirmation, reschedule and cancellation emails through Resend from the server with an .ics attached, the key in Replit’s Secrets, and the email skipped with a log line when no key is set. A honeypot field rejects the submission when filled. Finally, show me two requests booking the same host and time at the same moment, and one of them refused.
Insist on that last demonstration as running code. On a tool where the preview, the database and the eventual host are all the same workspace it is tempting to trust what you can see working, and a booking form used by one person at a time is the one thing this bug cannot be caught by.
- 05
Sign-in your server owns, then rules that read what it says
Nothing hands this database an account id by itself, so the Agent builds both ends of the chain: the sessions your own server issues, and the policies that look for whichever identity it has just announced.
PromptAdd sign-in, roles, and access rulesBuild sign-up, login, logout, a password reset and a server-side session on email and password, linking each account to its member row by email, ignoring case. The first account on an empty database becomes the admin, under a lock so two sign-ups at once cannot both win, and a later sign-up whose email is not a member gets no access. Keep the role on the member row, with a trigger refusing changes to role, active, email, priority or the rotation flag unless an admin is asking and another refusing to remove the last admin. Then row-level security on every table: have the server declare the current member and their role as session-local settings at the start of every request, and write the policies to read them. A request with no member declared gets no policy at all, so the booking page keeps reading through the server routes from the last two steps. A host reads the bookings they are on and edits their own hours and dates off, and an admin reaches everything. Then show me how to prove, as a signed-in host, that another host’s booking comes back empty, that an undeclared request cannot read bookings, and that a host cannot make themselves admin.
Nothing hosted is handing Postgres an account id here, which leaves your own server as the only part of the system that knows who is asking. Prove the announcement works before writing a policy that depends on it: a policy with nothing to read does not complain, it simply behaves as if nobody special is asking, and you want to know which way that falls before a client’s answers are in the table.
- 06Destination
Google Calendar, the back office, and publishing
The calendar connection, the admin screens and the embed, then a week worked through the app and the release that puts it on a real address.
PromptConnect Google, add the back office, and publishThree things left. First, Google Calendar: an OAuth connection per host asking only for calendar.events and calendar.freebusy, a signed state on the callback, the client ID and secret in Replit’s Secrets, each refresh token encrypted with a key from Secrets before it is stored and never returned to the browser, and busy times from free/busy removed from the available starts (when Google errors, offer the times and log it). Write each booking to the first connected host’s calendar with the guest and other hosts invited, a Meet link for Google Meet, and delete it on cancellation. Second, the back office: bookings by week, month and list with a host cancel, the meeting type editor, each host’s hours and dates off, the team with invites and round robin settings, analytics over 7, 30 or 90 days, branding with the logo stored in object storage, and a share page that writes the embed snippet as inline, a popup button or a popup text link. Third, help me work a week: book each kind of meeting as a stranger, book round robin five times and check who got them, cancel and reschedule from the email link, add a busy event in Google, and when that holds, take me through Publishing and adding the published address to Google’s redirect list.
The Google redirect address has to match the published URL exactly, and the one the preview runs on is different. Add both before you test, and connect the calendar again from the published app once it is live, since a connection that only ever worked in the preview is the one that fails on the first real booking.
Protect the team calendar and your clients
A booking says who is meeting whom, when, and often why, in the answers to your questions. What follows are the database rules and server-side checks that keep each record with the people it belongs to.
Standard Password Protection
Sign-in is built into the app rather than delegated to a hosted identity service, so sessions live on your own server, which is also the only thing able to tell the database whether the member asking for a booking is one of its hosts. Only your team signs in, and the first account on a fresh database becomes the admin, so create yours before the address goes anywhere.
Separate Admin and Host Access
Two roles cover a team. An admin manages the meeting types, the team, the branding and every booking. A host manages their own hours and calendar and sees the bookings they are on. The visitor with no account has no table access at all: the booking page reads what it needs through server routes that return only what a booking page should show.
Automatic Double-Booking Protection
If the page posts “this time is free” along with the booking, the way to take a time that is not free is to change what the page posts. Your server works the times out again at the moment of the write and takes a lock per host, and Postgres itself refuses two confirmed meetings that overlap for the same person, so a race is lost at the constraint rather than discovered on the day.
Data Rules Protected from Tampering
What Replit provisions is ordinary Postgres, so its policies behave the way Postgres policies always behave. What differs is the source of identity. Nothing hosted is handing the database an account id here, so the Agent has your own server announce who is asking and in which role before each request touches a table, then writes every policy to read that announcement. Miss it and the policies do not complain, which is exactly why it is worth testing on purpose.
Strict Privacy for Guest Details
The template’s migrations declare 36 row-level security policies, which is a modest number for a reason: anonymous visitors are given none, so every policy decides which member of your team sees what. Take the bookings table. An admin sees every booking, a host sees the ones they are on, and a guest reaches theirs only through a server route that returns that one booking and nothing beside it.
Private & Secure Booking Links
Letting a guest move or cancel without an account means something in the link stands in for a password. Generate 32 random bytes for each booking, send them in the confirmation, and store only their SHA-256 hash, so a copy of the database is not a copy of anybody’s link. A booking number in a URL would be a page anybody could walk through by changing a digit.
Bot & Brute-Force Protection
The public booking form is the one route a stranger can call as often as they like. A hidden field real visitors never see, rejected when filled, stops the laziest bots, and that is the whole of the protection the template ships: there is no rate limit. If your page gets real attention, add one keyed by address, kept somewhere shared rather than in one process’s memory, since an Autoscale deployment can run more than one instance.
Prevent Unauthorized Admin Escalation
A role stored on a record its owner can edit is a role anybody can give themselves. Keep each person’s role on the team table, have a trigger refuse any change to it, or to their round robin settings, unless an admin is asking, and have a second one refuse to remove the last admin. That matters here because an admin reads every client’s name, email and answers.
Calendar Tokens Encrypted at Rest
Connecting Google Calendar hands your app a refresh token that can read and write that host’s calendar until somebody revokes it. Replit Postgres has no built-in vault, so encrypt each token with a key kept in Replit’s Secrets before it is stored, decrypt it only inside the server code that calls Google, never return it to the browser, and revoke it at Google when a host disconnects.
Guest Answers Treated as Personal Data
Booking questions invite people to write things down: why they want the call, a phone number, a company name. Decide who on the team may read them, how long you keep last year’s bookings, and what you do when somebody asks for theirs to be deleted, and remember that Google Calendar keeps its own copy of every event you write there.
Automatic Workspace Backups
The Agent checkpoints as it works (files, configuration, and optionally the database) so a bad change is a click back rather than an afternoon. Pro adds a 28-day database rollback on top. Worth having in place before the calendar is the only record of next month, because the invitations in your clients’ inboxes will not rebuild your database for you.
Review the access rules (row-level security policies) on every table. For each one, tell me in simple terms who can view, add, edit, and delete records, confirm that people can only reach their own data while the right roles can reach more, and flag anything left open that shouldn’t be.
Paste this into the chat before launch so the Agent checks nobody can see data they shouldn’t.
One rule outranks the rest here: the database connection, your Google client secret, the key that encrypts calendar tokens, and any AI provider key belong in Replit’s Secrets and nowhere else: not in the app, and not in a repository you push. Treat any of them that escapes as burned, and replace it the same day.
What speeds the build, and what slows it
Speeds the build
- One small, specific request per message, checked in the live preview before the next one
- Letting the Agent provision the database from the chat instead of wiring one up by hand
- Running two Agent sessions in parallel on unrelated parts of the app, once your plan allows it
- Rolling back to a checkpoint the moment a change goes wrong, instead of unpicking it by hand
- Reviewing what Publishing changed, meaning the domain, who can reach the app, and the machine it runs on, before the first release
Slows the build
- Asking for the whole app in one message instead of one piece at a time
- Building screens for data that isn’t in the database yet
- Running unrelated Agent sessions against the same files at the same time
- Letting several risky changes stack up before checking whether any of them actually broke something
- Publishing without checking who the app is visible to first
Connecting GitHub (Optional)
Every change in Replit is saved automatically without any technical setup. Checkpoints are the day-to-day undo. You only need to link GitHub if you want a private copy under your own control or plan to hand the codebase over to external developers.
Every milestone is already saved
Replit’s Agent creates a checkpoint automatically at key points as it works: a full snapshot of the files, the configuration, and even the AI conversation itself, not just the code.
Checkpoints and rollbacks, Replit docsRolling back restores the whole workspace
One click returns your project to an earlier checkpoint (files and configuration together, and optionally the database), which is broader than a typical code-only undo, so a rollback after real data has changed is worth a second look before you confirm it.
GitHub keeps a copy outside Replit
Connect a repository from the Git pane, free on every plan, and stage, commit, and push changes back to GitHub with a click, or pull in anything changed outside Replit.
Using the Git pane, Replit docsIt’s also how an existing project gets in
Point Replit at a public repository’s URL for a fast import, or use the guided import for a private one. Either way, Replit detects the stack and installs everything on its own.
Import from a provider, Replit docsYou rarely type git commands
The Git pane’s buttons cover staging, committing, and pushing. If you’d rather type them yourself, the workspace Shell stays in sync with whatever the pane just did.
Going live without external hosting
Skip third-party hosting and external database setup. Your database, backend, and domain live in the same Replit workspace. Just click Publish to go live.
| Host | Best for | Notes | Free tier |
|---|---|---|---|
| Autoscale | The booking page and the back office | Grows with traffic and shrinks back when nobody is booking, which suits this app well: bookings arrive around the hours your clients work and almost nothing happens overnight. It is the default choice for the app, and it is enough for everything a client or your team actually clicks. | Metered - billed with your plan |
| Reserved VM | Steady traffic all day | Dedicated compute that never sleeps. Worth comparing against Autoscale if your booking page is busy across several time zones through the whole day, or if the first booking after a quiet night has to load instantly. For most teams it is more than the app needs. | By machine size - billed with your plan |
| Scheduled | Nothing yet | Runs a job on a timer instead of answering requests. This build has no such job, because a booking is one protected write with nothing to sweep up afterwards. It becomes the right row the day you add a reminder email the day before each meeting, which is the addition most teams make first. | Metered - billed with your plan |
| Static | Not this app | Files only, with no server behind them. Listed to rule out: availability is computed on the server, the booking write runs in Postgres, the access rules need your server to declare who is asking, and the Google callback is a server route, so nothing in this build fits here. | Metered - billed with your plan |
All of these are Replit rather than a third party, so the choice is shape rather than vendor, and this build needs only one of them to serve the app. Review who the app is visible to before the first release, since Publishing is what sets it.
Calendar connections that stop working after a week are Google’s Testing mode, not a bug. While your Google Cloud consent screen is set to Testing, only the accounts you list can connect, and Google expires their refresh tokens after 7 days, so every host has to reconnect weekly and the page quietly stops checking their calendar in between. Publishing the app removes that, and because it asks to read and edit calendar events, Google asks for verification first. Start that before launch week, and add the published address to the OAuth client’s redirect list as well as the preview one.
Your database is already part of the workspace
Nothing to connect. The team, the meeting types and the bookings are small and will not trouble the included allowance for years. Your logo and cover image belong in object storage rather than in a table.
| Service | Best for | Notes | Free tier |
|---|---|---|---|
| Replit Postgres | Data, built in | Managed Postgres with 20GB included free, provisioned from the same chat that builds the app, and since it is ordinary Postgres, the booking function and its exclusion constraint from step 04 and the access policies from step 05 work exactly as they would anywhere else. What it does not include is a hosted identity service or an encrypted vault, which is why your own server declares who is asking and encrypts each calendar token before it is stored. | Free to start · 20GB included |
Where AI genuinely helps a team that takes meetings
Each of these is one more prompt once the scheduler is running, and each can be pasted in as written. They all reach the model through one server-side function, the only place your API key is kept.
Turn “any afternoon next week” into three real times
Plenty of meetings still start as an email that says roughly when somebody is free. Reading it, checking the team’s calendars and replying with options is the small daily tax this removes, and it never books anything without you.
Add a server-side ai function (one place, with my provider key only on it) and a screen where I paste a message from a client. Send the message to that function and get back a structured guess: which of my meeting types they seem to want, the window they are describing, and their time zone if the message gives one away. Then run that window through the real availability for that meeting type and show me the three closest free times as a draft reply I can copy, with a booking link for each. Never create a booking from the model’s output. Where the message is vague, say so rather than choosing for me: if it says “sometime next week”, I want to see that, not a Tuesday you picked.
A short brief before every meeting, from the answers in the form
Your booking questions already collect why somebody wants the call. A host reading three lines before it starts walks in prepared, and the model only ever sees what the client chose to write.
Add a “prepare” action on a booking that sends the meeting type, the scheduled time and the answers to my booking questions to my ai function, and returns a three-line brief for the host: what the client wants, what to have ready, and one question worth asking. Send no email address, no phone number and no name. Show the brief on the booking in the dashboard only, never write it to Google Calendar or into an email, and say plainly when the answers are too thin to brief from rather than padding them out.
Draft the reply when a client asks for a time you do not offer
A request for a Saturday, a time outside anybody’s hours, a third reschedule in a week. The words are the work here, and keeping them consistent across the team is worth more than writing them fast.
Add a “draft a reply” action that takes a client’s message and the meeting type it is about, and returns a short, polite reply I can edit before it goes anywhere. It may only offer times that the availability function actually returns, it must say when nothing fits rather than inventing an exception, and it never promises that a host will make time outside their hours, because that is a decision for the host and not for the model.
Find the pattern in a month of cancellations
The cancellation rate on the dashboard tells you how many. What you want to know is why: the same reason three times, always for the same meeting type, always booked more than a fortnight ahead.
Add a panel on the analytics page that groups the last period’s cancellation reasons by what they are actually about, using my ai function, and returns each theme with a count, one representative quote, and which meeting type and how far ahead the booking was made. Send the reason text only, with no names or email addresses. State counts as figures, print the period it covered beside the result, and where a theme rests on one or two cancellations, say so instead of presenting it as a trend.
Ask your own calendar whether round robin is fair
Round robin is supposed to share the work. Whether it does, once somebody has been off for a week and somebody else joined halfway through the month, is a question worth asking the data rather than the team.
Add a panel that answers questions about my own booking history through my ai function: bookings per host per week, how round robin meetings were shared out, cancellation rates by meeting type and by host, and which hours of the week fill first. Have it compute every figure with queries and use the model only to explain what they suggest, so no number is invented. Every answer states the period and the sample size, and where a pattern is thin it says the pattern is thin. Send no client names or contact details at all.
A cheap model is plenty for most of the prompts above. Save Pro’s stronger models for the one or two spots where the extra reasoning actually pays for itself. Add any provider key through Replit’s own Secrets tool rather than hard-coding it, and keep every AI feature behind one server-side function so a single key covers the whole app.
Get a head start with our template
Every route above begins at an empty folder, which is not the only place a scheduler can begin. This one exists, runs, and takes bookings, so the weeks that the slot engine, the booking write and the calendar connection would have cost turn into an afternoon of adding your team and your hours.
Meeting Scheduler like Calendly
The exact scheduler this guide builds, packaged so you can open it, point it at your own backend, and make it yours from there. A scheduling app for teams that meet clients. People choose a time on your booking page or on your own website, answer your questions, pay by card when the session has a price, and get a calendar invitation by email and a reminder before the meeting. Round robin hands each booking to whoever is free, a collective meeting only offers times when every host can make it, and group sessions stay open until the seats run out.
The key benefits of starting with a template
The times on the page already come from each host’s own hours and calendar, and the database already refuses to give two people the same host at once. That is most of what this saves you. Behind it, the four meeting kinds, the manage link, the emails, the dashboard and the embed are done too.
Building the core from scratch
~110 hrs
Opening the template, already built
~1 hr
~109 hrs of building you skip
Two different measurements, on purpose. Building the application is the ~110 hrs, and that figure covers the six rows above, while the template also ships reminder workflows, a routing form and a contacts list that the calculator does not count. The ~1 hr is what adopting the built one costs: connect a database of your own, load the sample team or your own, and set your hours. Setting up a Google Cloud project for the calendar connection sits outside both figures.
Availability that already handles four kinds of meeting
A server-side slot engine works out free times from each host’s weekly hours in their own time zone, dates off, gaps before and after, minimum notice, the start-time interval and a daily limit, then combines hosts for round robin and collective meetings and counts seats for group sessions. It is shared code with unit tests of its own, so the rule you are most likely to change is the one with the best cover.
A booking write the database itself protects
Every booking is a single database call that takes a lock per host, works the times out again, and inserts under an exclusion constraint refusing two meetings that overlap for the same person. A free booking is confirmed in that one write. A paid one holds the time for 15 minutes while the client pays, and the scheduled job that sends reminders also frees any hold that ran out.
Two roles across 36 declared policies
Admin and host, with the role guarded by a trigger so nobody can promote themselves, and 36 row-level security policies of which none admits an anonymous visitor. Around them, 14 server functions for the work that has to outrank the person asking: the public page, free times, booking, payment and the Stripe webhook, managing a booking, a host’s cancellation, the routing form, the workflow runner, the invitation file, the calendar connection and team invites.
Google Calendar and email, both directions
Hosts connect Google Calendar, busy time is checked before any time is offered, and each booking is written to the host’s calendar with the client and any other hosts invited and a Meet link when the meeting is on Google Meet. Clients get a confirmation, a reschedule notice or a cancellation by email through Resend, each with an .ics attached and a link to manage the booking, and workflows add reminders and follow-ups by email or by text through Twilio.
A back office and a page that travels
Meeting types with an editor for details, limits, questions and hosts, a bookings calendar by week, month or list, each host’s hours and dates off, the team and round robin settings, analytics over 7, 30 or 90 days, branding with your logo, colour and layout, and an embed for your own site inline, as a popup or behind a text link. A sample team loads in one click so there is something to look at on day one.
Common questions
Google Calendar, and only Google Calendar. Each host connects their own account, their busy time is checked before a time is offered, and new bookings are written back with the client invited. Outlook, Microsoft 365, iCloud and CalDAV calendars are not included. Adding Microsoft is a described change rather than a rebuild, but it brings its own sign-in, its own tokens and its own verification with Microsoft, so plan it as a project of its own.
Yes. Workflows send an email or a text at a time you choose: when a meeting is booked, a set time before it starts, a set time after it ends, on a no-show or on a cancellation, with the client’s name, the time and the manage link filled in. One scheduled job runs them every five minutes, and you switch it on with a short SQL snippet from the setup guide. Emails go through Resend and texts through Twilio. Without those keys the messages are logged instead of sent and bookings still work, which is useful while you build and a surprise if you forget it at launch.
Yes, through Stripe. Give a meeting type a price and the client pays by card on the booking page while the time is held for them for 15 minutes. A cancellation by the host is refunded in full, and so is one by the client made before the refund window you set (24 hours unless you change it). Payment covers the full price at booking only, so deposits, packages, coupons and invoices are additions. Without Stripe keys a paid meeting is still booked, with the payment due at the appointment.
Three things, in order. Free times are worked out on the server from each host’s rules and their existing meetings, so a taken time is never offered. The booking is written by one database call that takes a lock per host and works the times out again inside it, so a time that went while somebody was typing is refused. And the database carries a constraint refusing two confirmed meetings that overlap for the same host. The check worth asking your AI tool to demonstrate is the race: two bookings for the same time at the same moment, and one of them refused.
By one of two rules you choose per meeting type. Balance gives it to whoever has the fewest confirmed bookings from seven days ago to thirty days ahead, and uses priority to break a tie. Priority gives it to the highest-priority host who is free. Either way the page offers a time if any host in the rotation is free then, and a host can be taken out of the rotation without being removed from the team. The booking records who got it, so a question about fairness is a query.
A collective meeting needs every host on it, so the page offers only the times they all share, and every one of them is attached to the booking. A group session has one host and a number of seats: the same start time stays on offer until the seats are taken, and while it is running that host cannot be booked for anything else that overlaps it. Both are settings on the meeting type rather than separate features.
Every meeting is stored as one absolute moment. Each host’s weekly hours are kept in that host’s own zone, and the booking page guesses the visitor’s zone and lets them change it. That is the right shape, and it still needs testing: book a meeting with your computer set to another zone and check the time in the invitation, and do it again in the weeks when Europe and the US change their clocks on different dates.
Yes. One script tag gives you three ways to show it: inline in the page, as a popup opened by a floating button, or as a popup behind any text link you choose. The embedded page resizes itself to fit, so it does not sit in a scrolling box inside your site. The share page in the dashboard writes the snippet for each meeting type, so there is nothing to assemble by hand.
Only for the calendar connection, and yes, it has to be your own. You create a Google Cloud project, an OAuth client and a consent screen, and put the client’s ID and secret in Replit’s Secrets. While the consent screen is in Testing, only listed accounts can connect and their tokens expire after seven days, and publishing it means going through Google’s verification, because the app reads and edits calendar events. Everything else in the scheduler works without it.
No. The tables, the sessions, the access rules, the availability module, the booking function and its constraint, the manage link and the calendar connection all get written from plain-language prompts, and the Postgres they write into is created inside this workspace when you ask. Nothing needs opening anywhere else first, though sign-in is worth a specific question, since this workspace provides the database without a hosted identity service to go with it.
Your Replit plan, plus what you publish. Core starts at $25/month, or $20/month billed annually, and includes 20GB of Postgres. The team, the meeting types and the bookings are small, and your logo is the only file. Publishing is billed separately on top, and this build publishes once, since nothing in it runs on a timer. Email works on Resend’s free tier for most small teams, and the Google calendar connection costs nothing. Nothing scales with how many hosts you have.
Nothing here is proprietary. Replit provisions ordinary PostgreSQL, so a standard dump gives you your team, meeting types, hours and bookings in a form any Postgres host accepts, and your logo is an ordinary file in object storage. That is worth more than it sounds in this category: the history of who met whom is the record of your client relationships, and it is exactly what makes a scheduling platform awkward to leave.
Yes, and it is worth doing before the link goes anywhere. The replit.app subdomain the app starts on can be replaced with your own through Publishing, HTTPS included. Do it before the booking link goes into your email signature, your proposals and your website, because it also becomes the address in every confirmation email and the redirect address your Google OAuth client has to list.
No. You describe what you want in the chat, and the Agent handles the rest: the code, the database, and a live version of the app right there in the workspace. The setup section above covers the account and plan you need first.
Replit hosts it. Publishing takes the same project live on a Replit domain, or your own if you connect one, with monitoring and access controls included, so you never open a separate hosting account.
Starter’s daily credits and a paid plan’s monthly grant both refill on their own schedule. Hitting either limit mid-build doesn’t touch what you’ve already made. Move up a plan for more headroom right away, or wait it out.
References
Sources checked September 2026- 01Breaking down the infinite workday, meetings across time zones (Microsoft WorkLab, June 2025). microsoft.com (published June 2025)
- 02The State of Meetings 2024, hours spent scheduling (Calendly, commissioned survey). calendly.com (survey fielded June to July 2024)
- 03Pricing (per-seat tiers, round robin on Teams), Calendly. calendly.com
- 04Pricing (Teams and Organizations per user, yearly), Cal.com. cal.com
- 05Pricing (Basic and Premium per user, both billing bases), SavvyCal. savvycal.com
- 06Pricing (annual plans, included seats), Chili Piper. chilipiper.com
- 07Pricing (Pro plan, free-tier limits, project pausing), Supabase. supabase.com
- 08Web developer hourly rates 2026 (freelance and agency benchmarks). developex.com
- 09Using OAuth 2.0 to access Google APIs (refresh token expiry in Testing), Google. developers.google.com
- 10Calendar API scopes and app verification, Google. developers.google.com
- 11Pricing (Starter, Core, Pro), Replit. replit.com
- 12Built-in database, Replit docs. docs.replit.com
- 13Publishing overview, Replit docs. docs.replit.com
- 14Deployment types, Replit docs. docs.replit.com
- 15Checkpoints and rollbacks, Replit docs. docs.replit.com
- 16Using the Git pane, Replit docs. docs.replit.com
- 17Import from a provider, Replit docs. docs.replit.com
- 18Secrets, Replit docs. docs.replit.com
This guide is general information, not legal advice. What you may keep about a client, how long you may keep a record of who met whom, and what you must tell people before you write their details into somebody’s calendar vary by country and by state, so check your own rules before you collect anything. Third-party prices, plan terms, and market rates are quoted from the sources above and were last checked on the date shown. Vendors change them without notice, so confirm before you budget. Build hours and the cost estimates derived from them are our own estimates, not quotes. Replit is a product of Replit, Inc. Verify current capabilities and pricing before relying on them.