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.
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:
- einen API-Schlüssel erstellen
- den Kunden aus einer Branchenvorlage anlegen
- Buchungsseite und Terminarten auslesen
- einen Workspace-Token holen
- die Öffnungszeiten ändern
- eine Terminart ändern
- die Buchungsseite einbetten
- 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
- Öffne Partnerportal > API und wähle API-Schlüssel erstellen.
- Kopiere den Schlüssel. Er beginnt mit
mgp_und wird nur einmal angezeigt. - 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',
})
Erzeuge die requestId einmal pro Bestellung und speichere sie vor dem Aufruf. Läuft der Aufruf in einen Timeout, sende ihn mit derselben requestId und demselben Body erneut. Du bekommst denselben Kunden zurück, keinen zweiten Workspace.
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
adminInviteDeliverygleichfailed, sende dieselbe Adresse anPOST /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.