meetergomeetergo Help

Kunden-Workspace mit Buchungsseite in 10 Minuten

Lege einen Kunden-Workspace aus einer Branchenvorlage an, passe ihn mit einem Workspace-Token an, bette die Buchungsseite ein und übergib ihn. Mit curl und Node.

Aktualisiert am 30. September 2026

Mit diesem Rezept bringst du einen neuen Kunden mit der Partner-API von der Bestellung zur fertigen Buchungsseite. Jeder API-Schritt steht mit curl und mit Node da. Ein komplettes Skript findest du am Ende.

Du wirst:

  1. einen API-Schlüssel erstellen
  2. den Kunden aus einer Branchenvorlage anlegen
  3. Buchungsseite und Terminarten auslesen
  4. einen Workspace-Token holen
  5. die Öffnungszeiten ändern
  6. eine Terminart ändern
  7. die Buchungsseite einbetten
  8. den Workspace übergeben

Bevor du startest

  • Du bist Admin einer freigegebenen Partnerfirma. Siehe Partner-API.
  • Für die Node-Beispiele brauchst du Node 18 oder neuer. Pakete brauchst du keine.

Die Node-Beispiele nutzen diese kleine Hilfsfunktion. Das Skript am Ende enthält sie.

const BASE = 'https://api.meetergo.com'

async function api(token, method, path, body) {
  const res = await fetch(BASE + path, {
    method,
    headers: {
      Authorization: `Bearer ${token}`,
      ...(body ? { 'Content-Type': 'application/json' } : {}),
    },
    body: body ? JSON.stringify(body) : undefined,
  })
  const text = await res.text()
  if (!res.ok) throw new Error(`${method} ${path}: ${res.status} ${text}`)
  return text ? JSON.parse(text) : null
}

1. API-Schlüssel erstellen

  1. Öffne Partnerportal > API und wähle API-Schlüssel erstellen.
  2. Kopiere den Schlüssel. Er beginnt mit mgp_ und wird nur einmal angezeigt.
  3. Speichere ihn auf deinem Server, zum Beispiel als MEETERGO_PARTNER_KEY.

2. Kunden aus einer Vorlage anlegen

Wähle einen templateKey: beauty, craftsmen, insurance oder consulting. Der Workspace startet mit den Terminarten, Öffnungszeiten und E-Mail-Erinnerungen der Branche, auf Deutsch.

curl -X POST https://api.meetergo.com/v4/partner/customers \
  -H "Authorization: Bearer $MEETERGO_PARTNER_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "requestId": "6f1c2a8e-3b4d-4e5f-8a9b-0c1d2e3f4a5b",
    "companyName": "Friseur Muster",
    "adminFirstName": "Max",
    "adminLastName": "Muster",
    "adminEmail": "max@friseur-muster.de",
    "language": "de",
    "timezone": "Europe/Berlin",
    "billingResponsibility": "partner",
    "suiteTier": "suite",
    "communicationOwner": "partner",
    "contactConsentConfirmed": true,
    "templateKey": "beauty"
  }'
import { randomUUID } from 'node:crypto'

const partnerKey = process.env.MEETERGO_PARTNER_KEY
const requestId = randomUUID() // mit der Bestellung speichern

const created = await api(partnerKey, 'POST', '/v4/partner/customers', {
  requestId,
  companyName: 'Friseur Muster',
  adminFirstName: 'Max',
  adminLastName: 'Muster',
  adminEmail: 'max@friseur-muster.de',
  language: 'de',
  timezone: 'Europe/Berlin',
  billingResponsibility: 'partner',
  suiteTier: 'suite',
  communicationOwner: 'partner',
  contactConsentConfirmed: true,
  templateKey: 'beauty',
})

3. Buchungsseite und Terminarten auslesen

Die Antwort, gekürzt:

{
  "customer": {
    "companyId": "3f2b...",
    "companyName": "Friseur Muster",
    "bookingPageUrl": "https://cal.meetergo.com/..."
  },
  "setupStatus": "ready",
  "adminInviteDelivery": "sent",
  "template": {
    "key": "beauty",
    "meetingTypes": [{ "id": "a91c...", "name": "...", "slug": "..." }]
  }
}
const { companyId, bookingPageUrl } = created.customer
const meetingTypes = created.template?.meetingTypes ?? []

Ist setupStatus gleich attention_required, nennt setupAttention, was du prüfen solltest.

4. Workspace-Token holen

Mit dem Workspace-Token änderst du genau diesen einen Kunden-Workspace über die Platform API. Er gilt 1 Stunde.

curl -X POST https://api.meetergo.com/v4/partner/customers/{companyId}/token \
  -H "Authorization: Bearer $MEETERGO_PARTNER_KEY"
const { token } = await api(
  partnerKey,
  'POST',
  `/v4/partner/customers/${companyId}/token`,
)

Nutze token (beginnt mit mgw_) in den nächsten Schritten. Sende dazu nicht den Header x-meetergo-api-user-id. Ist der Token abgelaufen, rufe diesen Endpunkt erneut auf.

5. Öffnungszeiten ändern

Liste die Wochenpläne auf und nimm den mit isDefault: true:

curl https://api.meetergo.com/availability \
  -H "Authorization: Bearer $MEETERGO_WORKSPACE_TOKEN"

Ändere dann die Tage, die du brauchst. Tage, die du weglässt, bleiben unverändert. So öffnest du samstags von 9 bis 13 Uhr:

curl -X PATCH https://api.meetergo.com/availability/{availabilityId} \
  -H "Authorization: Bearer $MEETERGO_WORKSPACE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "schedule": {
      "saturday": { "enabled": true, "hours": [{ "start": "09:00", "end": "13:00" }] }
    }
  }'
const schedules = await api(token, 'GET', '/availability')
const hours = schedules.find((s) => s.isDefault) ?? schedules[0]

await api(token, 'PATCH', `/availability/${hours.id}`, {
  schedule: {
    saturday: { enabled: true, hours: [{ start: '09:00', end: '13:00' }] },
  },
})

Zeiten stehen als HH:MM in der Zeitzone des Plans. Einen Tag schließt du mit { "enabled": false }.

6. Terminart ändern

Nimm eine id aus template.meetingTypes. Es ändern sich nur die Felder, die du sendest. So setzt du die Dauer auf 45 Minuten und eine neue Beschreibung:

curl -X PATCH https://api.meetergo.com/v4/meeting-type/{meetingTypeId} \
  -H "Authorization: Bearer $MEETERGO_WORKSPACE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "meetingInfo": {
      "duration": 45,
      "description": "Waschen, Schneiden, Föhnen."
    }
  }'
await api(token, 'PATCH', `/v4/meeting-type/${meetingTypes[0].id}`, {
  meetingInfo: { duration: 45, description: 'Waschen, Schneiden, Föhnen.' },
})

meetingInfo nimmt auch name. Alle Felder stehen in der OpenAPI-Spezifikation.

7. Buchungsseite einbetten

Füge die bookingPageUrl in die Website deines Kunden ein:

<div
  style="min-width:330px"
  class="meetergo-iframe"
  data-src="{bookingPageUrl}"
></div>
<script src="https://cdn.meetergo.com/v4/integration.js"></script>

Die Buchungsseite nimmt sofort Buchungen an, auch bevor sich der Kunde anmeldet.

8. Workspace übergeben

Der Admin deines Kunden hat in Schritt 2 eine Einladung per E-Mail bekommen und legt sein Passwort selbst fest. Du legst nie ein Passwort fest und teilst keins.

  • Ist adminInviteDelivery gleich failed, sende dieselbe Adresse an POST /v4/partner/customers/{companyId}/users. Siehe Probleme mit dem Partnerportal lösen.
  • Die Admins deines Kunden sehen deinen API-Zugang und deine letzten Änderungen unter Einstellungen > Entwickler. Sie können ihn jederzeit entziehen.

Der ganze Ablauf in einem Skript

Speichere es als setup-customer.mjs und starte es mit MEETERGO_PARTNER_KEY=mgp_... node setup-customer.mjs.

import { randomUUID } from 'node:crypto'

const BASE = 'https://api.meetergo.com'
const partnerKey = process.env.MEETERGO_PARTNER_KEY

async function api(token, method, path, body) {
  const res = await fetch(BASE + path, {
    method,
    headers: {
      Authorization: `Bearer ${token}`,
      ...(body ? { 'Content-Type': 'application/json' } : {}),
    },
    body: body ? JSON.stringify(body) : undefined,
  })
  const text = await res.text()
  if (!res.ok) throw new Error(`${method} ${path}: ${res.status} ${text}`)
  return text ? JSON.parse(text) : null
}

// Kunden anlegen. Im Echtbetrieb requestId vorher mit der Bestellung speichern.
const requestId = randomUUID()
const created = await api(partnerKey, 'POST', '/v4/partner/customers', {
  requestId,
  companyName: 'Friseur Muster',
  adminFirstName: 'Max',
  adminLastName: 'Muster',
  adminEmail: 'max@friseur-muster.de',
  language: 'de',
  timezone: 'Europe/Berlin',
  billingResponsibility: 'partner',
  suiteTier: 'suite',
  communicationOwner: 'partner',
  contactConsentConfirmed: true,
  templateKey: 'beauty',
})
const { companyId, bookingPageUrl } = created.customer
const meetingTypes = created.template?.meetingTypes ?? []

// Workspace-Token, 1 Stunde gültig.
const { token } = await api(
  partnerKey,
  'POST',
  `/v4/partner/customers/${companyId}/token`,
)

// Samstags von 9 bis 13 Uhr öffnen.
const schedules = await api(token, 'GET', '/availability')
const hours = schedules.find((s) => s.isDefault) ?? schedules[0]
await api(token, 'PATCH', `/availability/${hours.id}`, {
  schedule: {
    saturday: { enabled: true, hours: [{ start: '09:00', end: '13:00' }] },
  },
})

// Erste Terminart: 45 Minuten.
if (meetingTypes.length > 0) {
  await api(token, 'PATCH', `/v4/meeting-type/${meetingTypes[0].id}`, {
    meetingInfo: { duration: 45 },
  })
}

console.log('requestId:', requestId)
console.log('Admin-Einladung:', created.adminInviteDelivery)
console.log('Einbettungscode:')
console.log(
  `<div style="min-width:330px" class="meetergo-iframe" data-src="${bookingPageUrl}"></div>\n` +
    '<script src="https://cdn.meetergo.com/v4/integration.js"></script>',
)

Verwandte Artikel

War dieser Artikel hilfreich?

Lass uns wissen, ob dieser Artikel deine Fragen beantwortet hat.