Skip to main content
A booking is a scheduled meeting between a host and a client. See the API reference for the full resource shape.

List bookings

neetocal bookings list --type upcoming
neetocal bookings list --client-email oliver@example.com --sorting-key starts_at --sorting-order asc
FlagTypeRequiredDefaultDescription
--client-emailstringFilter by client email
--host-emailstringFilter by host email
--pageint0Page number
--page-sizeint0Items per page (max 100)
--sorting-keystringSort by field (created_at, starts_at)
--sorting-orderstringSort order (asc, desc)
--typestringFilter by type (upcoming, past, cancelled, incomplete)
Sample output (--json)
{
  "data": [
    {
      "id": "efb296a3-8205-419f-8ac4-1abfc46bc3c7",
      "sid": "8sqtzrs",
      "name": "Oliver Smith",
      "email": "oliver@example.com",
      "host_name": "Sam Smith",
      "host_email": "host@example.com",
      "starts_at": "2026-05-15T10:00:00.000Z",
      "ends_at": "2026-05-15T10:30:00.000Z",
      "time_zone": "America/New_York",
      "status": "confirmed",
      "meeting": { "name": "Product demo" }
    },
    {
      "id": "f1a3b5c7-9d2e-4f60-8b1a-2c3d4e5f6a7b",
      "sid": "9tru0as",
      "name": "Eve Smith",
      "email": "eve@example.com",
      "host_name": "Sam Smith",
      "host_email": "host@example.com",
      "starts_at": "2026-05-16T14:00:00.000Z",
      "ends_at": "2026-05-16T14:30:00.000Z",
      "time_zone": "America/New_York",
      "status": "confirmed",
      "meeting": { "name": "Product demo" }
    }
  ],
  "pagination": { "total_records": 2, "total_pages": 1, "current_page_number": 1, "page_size": 30 }
}
Mirrors List bookings in the API.

Show a booking

neetocal bookings show <id>
Sample output (--json)
{
  "data": {
    "booking": {
      "id": "efb296a3-8205-419f-8ac4-1abfc46bc3c7",
      "sid": "8sqtzrs",
      "name": "Oliver Smith",
      "email": "oliver@example.com",
      "host_name": "Sam Smith",
      "host_email": "host@example.com",
      "starts_at": "2026-05-15T10:00:00.000Z",
      "ends_at": "2026-05-15T10:30:00.000Z",
      "time_zone": "America/New_York",
      "status": "confirmed",
      "preferred_meeting_spot": "zoom",
      "meeting_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "meeting": { "name": "Product demo" },
      "meeting_outcome": null,
      "admin_booking_url": "https://spinkart.neetocal.com/admin/bookings/8sqtzrs",
      "client_booking_url": "https://spinkart.neetocal.com/booking/8sqtzrs"
    }
  }
}
Returns the full booking, including nested client, host, and meeting objects. Mirrors Get booking in the API.

Create a booking

neetocal bookings create \
  --meeting-slug demo \
  --name "Oliver Smith" \
  --email oliver@example.com \
  --slot-date 2026-05-15 \
  --slot-start-time 10:00 \
  --time-zone "America/New_York"
FlagTypeRequiredDefaultDescription
--emailstringYesClient email
--meeting-slugstringYesMeeting slug
--namestringYesClient name
--preferred-meeting-spotstringPreferred meeting spot
--slot-datestringYesSlot date (YYYY-MM-DD)
--slot-start-timestringYesSlot start time (HH:MM)
--time-zonestringYesTime zone
Sample output (--json)
{
  "data": {
    "booking": {
      "id": "efb296a3-8205-419f-8ac4-1abfc46bc3c7",
      "sid": "8sqtzrs",
      "name": "Oliver Smith",
      "email": "oliver@example.com",
      "host_name": "Sam Smith",
      "host_email": "host@example.com",
      "starts_at": "2026-05-15T10:00:00.000Z",
      "ends_at": "2026-05-15T10:30:00.000Z",
      "time_zone": "America/New_York",
      "status": "confirmed",
      "meeting": { "name": "Product demo" },
      "meeting_outcome": null
    }
  }
}
Pull valid slots first with neetocal meetings slots, then pass one to --slot-date / --slot-start-time. In --quiet mode this prints the new booking id.
Mirrors Create booking in the API.

Update a booking

Reschedule, cancel, approve, or reject a booking. Only the flags you set are sent.
# Reschedule
neetocal bookings update <id> \
  --slot-date 2026-05-22 --slot-start-time 14:00 --time-zone "America/New_York" \
  --reschedule-reason "Client conflict"

# Cancel
neetocal bookings update <id> --status cancelled --cancel-reason "No longer needed"

# Approve
neetocal bookings update <id> --status approved
FlagTypeRequiredDefaultDescription
--cancel-reasonstringCancellation reason
--emailstringClient email (optional; overrides the existing booking’s email when rescheduling)
--namestringClient name (optional; overrides the existing booking’s name when rescheduling)
--rejection-reasonstringRejection reason
--reschedule-reasonstringReschedule reason
--slot-datestringNew slot date (YYYY-MM-DD)
--slot-start-timestringNew slot start time (HH:MM)
--statusstringStatus (cancelled, approved, rejected)
--time-zonestringTime zone
Sample output (--json)
{
  "data": {
    "booking": {
      "id": "efb296a3-8205-419f-8ac4-1abfc46bc3c7",
      "sid": "8sqtzrs",
      "name": "Oliver Smith",
      "email": "oliver@example.com",
      "host_name": "Sam Smith",
      "host_email": "host@example.com",
      "starts_at": "2026-05-22T14:00:00.000Z",
      "ends_at": "2026-05-22T14:30:00.000Z",
      "time_zone": "America/New_York",
      "status": "confirmed",
      "reschedule_requested": false,
      "meeting": { "name": "Product demo" },
      "meeting_outcome": null
    }
  }
}
Rescheduling reuses the existing client details; pass --name / --email only to override them. Mirrors Update booking in the API.

Create a payment

neetocal bookings payments create <booking-id> \
  --payment-provider stripe --discount-code SUMMER25
FlagTypeRequiredDefaultDescription
--discount-codestringDiscount code
--identifierstringPayment identifier
--payment-providerstringYesPayment provider
Sample output (--json)
{
  "data": {
    "payment": {
      "id": "f46c9ddf-221d-4238-afb2-280c1c6b3185",
      "identifier": "ext-123",
      "status": "confirmation_pending",
      "amount": "100.0",
      "currency": "USD"
    }
  }
}
Mirrors Create payment in the API.

Update a payment

neetocal bookings payments update <booking-id> <payment-id> \
  --payment-provider stripe --status successful --notes "Paid in full"
FlagTypeRequiredDefaultDescription
--notesstringPayment notes
--payment-providerstringYesPayment provider
--statusstringYesPayment status (successful, rejected)
Sample output (--json)
{
  "data": {
    "payment": {
      "id": "f46c9ddf-221d-4238-afb2-280c1c6b3185",
      "identifier": "ext-123",
      "status": "successful",
      "amount": "100.0",
      "currency": "USD"
    }
  }
}
Mirrors Confirm payment in the API.