Skip to main content

Step 1

Start by opening the event type you want to configure. 1 Web

Step 2

Proceed by clicking on the “Advaced” tab and click on button to add “New Webhook”. Screenshot2025 07 02123422 Pn

Step 3

You can create webhooks to subscribe to specific events on Lunacal. The Subscriber URL should point to your API endpoint that will receive HTTP requests from our platform. If you our new to webhooks you can use API from webhook.site to try these webhooks. Lunacal currently supports the following webhook events:
  1. Booking Created — Triggered when a new booking is created by any user.
  2. Booking Cancelled — Triggered when a booking is cancelled.
  3. Booking Rescheduled — Triggered when an existing booking is rescheduled.
  4. Booking Requested — Triggered when a booking is created but requires organizer approval before confirmation.
  5. Booking Rejected — Triggered when a booking request is rejected by the organizer.
  6. Booking Payment Initiated — Triggered when a user initiates a payment for a paid event.
  7. Booking Paid — Triggered after successful payment for a booking.

Step 4

You can test your webhook using the Ping Test button. This will send sample data to your webhook endpoint to verify that it’s functioning properly. If everything is set up correctly, you will receive a 200 OK response with the following payload:
{ "ok": true, "status": 200, "message": "Webhook received" }
Screenshot2025 06 27172831 Pn

Response Format and Fields

{
  "triggerEvent": "BOOKING_CREATED",
  "createdAt": "2025-07-02T07:14:48.795Z",
  "payload": {
    "bookerUrl": "https://lunacal.ai",
    "type": "quint",
    "title": "quick chat between Ayush Gupta and Anupam.",
    "description": "",
    "additionalNotes": "",
    "customInputs": {},
    "startTime": "2025-07-16T23:30:00Z",
    "endTime": "2025-07-17T00:00:00Z",
    "organizer": {
      "id": 584,
      "name": "Ayush Gupta",
      "email": "[email protected]",
      "username": "ayush-gupta-57m",
      "timeZone": "Asia/Srednekolymsk",
      "language": {
        "locale": "en"
      },
      "timeFormat": "h:mma",
      "utcOffset": 660
    },
    "responses": {
      "name": {
        "label": "your_name",
        "value": "Anupam",
        "isHidden": false
      },
      "email": {
        "label": "email_address",
        "value": "[email protected]",
        "isHidden": false
      },
      "location": {
        "label": "location",
        "isHidden": false
      },
      "Please-share-anything-that-will-help-prepare-for-our-meeting-": {
        "label": "Please share anything that will help prepare for our meeting.",
        "isHidden": true
      },
      "guests": {
        "label": "Add Guests",
        "value": [],
        "isHidden": false
      }
    },
    "userFieldsResponses": {
      "Please-share-anything-that-will-help-prepare-for-our-meeting-": {
        "label": "Please share anything that will help prepare for our meeting.",
        "isHidden": true
      },
      "guests": {
        "label": "Add Guests",
        "value": [],
        "isHidden": false
      }
    },
    "attendees": [
      {
        "email": "[email protected]",
        "name": "Anupam",
        "firstName": "",
        "lastName": "",
        "timeZone": "Asia/Tashkent",
        "language": {
          "locale": "en"
        },
        "utcOffset": 300
      }
    ],
    "location": "",
    "destinationCalendar": null,
    "hideCalendarNotes": false,
    "requiresConfirmation": false,
    "eventTypeId": 975,
    "seatsShowAttendees": true,
    "seatsPerTimeSlot": null,
    "seatsShowAvailabilityCount": true,
    "schedulingType": null,
    "iCalUID": "[email protected]",
    "iCalSequence": 0,
    "uid": "r543Dk3BeyfTafREgkSU8v",
    "eventTitle": "quick chat",
    "eventDescription": "",
    "price": 0,
    "currency": "usd",
    "length": 30,
    "bookingId": 3899,
    "metadata": {},
    "status": "ACCEPTED"
  }
}
you can use https://webhook.site/ to test these webhooks without having to write any code.

Example

Here is a simple example of a server that receives HTTP webhook requests.
package main

import (
	"fmt"
	"io"
	"net/http"
)

func webhookHandler(w http.ResponseWriter, r *http.Request) {
	switch r.Method {
	case http.MethodGet:
		fmt.Println("Received GET request")
		for k, v := range r.URL.Query() {
			fmt.Printf("%s = %s\n", k, v)
		}
	case http.MethodPost:
		body, _ := io.ReadAll(r.Body)
		defer r.Body.Close()
		fmt.Println("Received POST request")
		fmt.Println("Body:", string(body))
	default:
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	w.WriteHeader(http.StatusOK)
}

func main() {
	http.HandleFunc("/", webhookHandler)
	fmt.Println("Listening on :8080")
	http.ListenAndServe(":8080", nil)
}
please use a service like ngrok if you are testing locally.