Skip to content

Give me a booking link

Status planned

Say "give me a booking link" and get a link at your domain that books calls into the hours you keep free, with reminders sent.

Send one link, and people book a call in the hours you keep free. Its status is planned: your agent tells you so and runs nothing yet.

Needs Startup

What you get

  • 1booking link at your DomainMeeting Type
  • 1set of weekly hours, less what your calendar already holdsAvailability
  • 1Meeting per booking, with a join link and a reminderMeeting

Your agent does

Availability.set then MeetingType.create then MeetingType.publish
You, to your agent

Give me a booking link.

Send them my booking link.

Let people book a call with me.

# Look up the Human: Human.list
WORKER=$(curl "https://api.sb/leaseline.app/humans?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.humans[0]["$id"] | split("/") | last')

# 1. Availability.set
AVAILABILITY=$(curl -X POST https://api.sb/leaseline.app/availabilities/set \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"worker":"'"$WORKER"'","hours":{"tue":["09:00-12:00"],"thu":["13:00-17:00"]},"timezone":"America/Chicago"}' | jq -r '.availability["$id"] | split("/") | last')

# 2. MeetingType.create
MEETING_TYPE=$(curl -X POST https://api.sb/leaseline.app/meeting-types \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Intro call","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'"}' | jq -r '.meetingType["$id"] | split("/") | last')

# 3. MeetingType.publish
curl -X POST https://api.sb/leaseline.app/meeting-types/$MEETING_TYPE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const [worker] = await $.Human.list({ limit: 1 })
const availability = await $.Availability.set({ worker: worker.$id, hours: { tue: ['09:00-12:00'], thu: ['13:00-17:00'] }, timezone: 'America/Chicago' })
const meetingType = await $.MeetingType.create({ name: 'Intro call', duration: 20, medium: 'video', availability: availability.$id })
await $.MeetingType.publish({ meetingType: meetingType.$id })
WORKER=$(npx startup-builder do Human.list --json '{"limit":1}' | jq -r '.humans[0]["$id"] | split("/") | last')
AVAILABILITY=$(npx startup-builder do Availability.set --json '{"worker":"'"$WORKER"'","hours":{"tue":["09:00-12:00"],"thu":["13:00-17:00"]},"timezone":"America/Chicago"}' | jq -r '.availability["$id"] | split("/") | last')
MEETING_TYPE=$(npx startup-builder do MeetingType.create --json '{"name":"Intro call","duration":20,"medium":"video","availability":"'"$AVAILABILITY"'"}' | jq -r '.meetingType["$id"] | split("/") | last')
npx startup-builder do MeetingType.publish --json '{"meetingType":"'"$MEETING_TYPE"'"}'
{
  "name": "do",
  "arguments": {
    "code": "const [worker] = await $.Human.list({ limit: 1 })\nconst availability = await $.Availability.set({ worker: worker.$id, hours: { tue: ['09:00-12:00'], thu: ['13:00-17:00'] }, timezone: 'America/Chicago' })\nconst meetingType = await $.MeetingType.create({ name: 'Intro call', duration: 20, medium: 'video', availability: availability.$id })\nreturn await $.MeetingType.publish({ meetingType: meetingType.$id })"
  }
}

Change it

  • Make it 30 minutes.
  • Only offer Tuesday and Thursday mornings.
  • Ask what they want to talk about before they book.

Under the hood

Systems
Scheduling, CRM
Nouns
Meeting Type, Availability, Meeting
Events
MeetingType.published, Meeting.booked

Each booking calls Meeting.book and raises Meeting.booked, which starts Prepare and follow up a call. A Meeting Type with an Offer takes payment before the time is held.