Skip to main content
Contacts are the people who interact with your scheduling pages. meetergo automatically creates a contact record each time someone books a meeting, and you can also create and manage contacts via the API.

How Contacts Are Created

SourceDescription
Automatic (booking)A contact is created or updated whenever someone books a meeting. The contact is matched by email address — existing contacts are enriched, new ones are created.
Manual (API)Create contacts directly via POST /crm for leads or customers who haven’t booked yet.
ImportBulk-create contacts via POST /crm/bulk (e.g. from a CSV import).

Contact Fields

FieldTypeDescription
iduuidUnique contact identifier
firstNamestringFirst name
lastNamestringLast name
emailstringEmail address (unique per company)
phoneNumberstringPhone number
tagsstring[]Labels like Lead, Enterprise, Recurring
notesstringInternal notes
crmCompanyIduuidAssociated CRM company
accountOwnerIduuidResponsible meetergo user
additionalDataobjectCustom booking form fields
noShowCountnumberNumber of times marked as no-show

Automatic Tags

meetergo adds these tags automatically:
TagWhen applied
RecurringContact has 2+ bookings
OptinContact completed double opt-in

Create a Contact

curl -X POST "https://api.meetergo.com/crm" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Anna",
    "lastName": "Müller",
    "email": "anna.mueller@example.com",
    "tags": ["Lead"]
  }'
Either email or phoneNumber must be provided. Both can be supplied.

Response

{
  "item": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "firstName": "Anna",
    "lastName": "Müller",
    "email": "anna.mueller@example.com",
    "phoneNumber": null,
    "tags": ["Lead"],
    "notes": null,
    "noShowCount": 0,
    "crmCompanyId": null,
    "accountOwnerId": null,
    "additionalData": {},
    "createdAt": "2024-06-01T10:00:00Z",
    "updatedAt": "2024-06-01T10:00:00Z"
  },
  "appointments": [],
  "nextAppointmentIso": null
}

Search Contacts

curl "https://api.meetergo.com/crm?searchTerm=anna&tags=Lead&page=1&limit=20" \
  -H "Authorization: Bearer YOUR_API_KEY"

Query Parameters

ParameterTypeDescription
searchTermstringSearch by name, email, or phone
tagsstring[]Filter by one or more tags
ownerIduuidFilter by account owner
sortBystringfirstName, lastName, email, or createdAt
sortOrderstringASC or DESC
pagenumberPage number (default: 1)
limitnumberResults per page (default: 20, max: 100)

Response

{
  "result": [...],
  "page": 1,
  "limit": 20,
  "total": 42,
  "totalPages": 3
}

Get Contact Details

Look up a contact by their ID or by an attendee ID from a booking:
# By contact ID
curl "https://api.meetergo.com/crm/details?contactId=550e8400-..." \
  -H "Authorization: Bearer YOUR_API_KEY"

# By attendee ID (from a booking webhook)
curl "https://api.meetergo.com/crm/details?attendeeId=660e8400-..." \
  -H "Authorization: Bearer YOUR_API_KEY"
The response includes the full contact record, all linked appointments, and form submission history.

Update a Contact

curl -X PATCH "https://api.meetergo.com/crm/550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tags": ["Lead", "Qualified"],
    "notes": "Interested in Enterprise plan"
  }'

Delete a Contact

curl -X DELETE "https://api.meetergo.com/crm/550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer YOUR_API_KEY"

Contacts and Webhooks

When a booking is created, you can look up the contact immediately using the attendeeId from the webhook payload:
app.post('/webhooks/meetergo', async (req, res) => {
  res.status(200).send('OK');

  const { event, data } = req.body;

  if (event === 'booking_created') {
    const attendeeId = data.attendees[0]?.id;

    // Fetch full contact record including form answers
    const response = await fetch(
      `https://api.meetergo.com/crm/details?attendeeId=${attendeeId}`,
      { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
    );

    const { item: contact } = await response.json();
    console.log('Contact:', contact.email, contact.additionalData);
  }
});

Best Practices

Use attendeeId lookups – When processing booking webhooks, look up the contact via attendeeId to get enriched data including all form field answers.
Check additionalData – Custom booking form fields (e.g., company name, job title) are stored in additionalData on the contact.
Use tags for segmentation – Tags are free-form strings; define a consistent set (e.g., Lead, Customer, Enterprise) to filter contacts efficiently.