Zum Inhalt

Microsoft Bookings Integration

Die MORELO Dealer Suite nutzt Microsoft Bookings als zentrale Terminverwaltung.

Microsoft 365 Business Premium erforderlich

Microsoft Bookings benötigt eine Microsoft 365 Business Premium Lizenz.


Warum Microsoft Bookings?

Vorteil Beschreibung
Keine eigene Buchungslogik MS Bookings übernimmt Kalender, Erinnerungen, Konflikte
Kundenportal inklusive Self-Service Buchungsseite für Kunden
Teams Integration Automatische Teams-Meetings für Online-Beratung
Outlook Sync Termine direkt im Outlook-Kalender der Mitarbeiter
Mobile Apps iOS/Android Apps für unterwegs

Architektur

┌─────────────────────────────────────────────────────────────────┐
│                    MORELO Dealer Suite                          │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                   MS Graph API                           │   │
│  │              /solutions/bookingBusinesses                │   │
│  └─────────────────────────────────────────────────────────┘   │
│                            │                                    │
│         ┌──────────────────┼──────────────────┐                │
│         ▼                  ▼                  ▼                │
│  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐          │
│  │  Bookings   │   │   Staff     │   │  Services   │          │
│  │ Appointment │   │   Members   │   │             │          │
│  └─────────────┘   └─────────────┘   └─────────────┘          │
│         │                                                      │
│         ▼                                                      │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │              Outlook Kalender + Teams                    │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

Graph API Endpoints

Base URL

https://graph.microsoft.com/v1.0/solutions/bookingBusinesses

Booking Business (Händler)

# Alle Booking Businesses auflisten
GET /solutions/bookingBusinesses

# Neues Business erstellen
POST /solutions/bookingBusinesses
{
    "displayName": "MORELO Händler Mustermann",
    "address": {
        "street": "Musterstraße 1",
        "city": "Musterstadt",
        "postalCode": "12345",
        "countryOrRegion": "DE"
    },
    "phone": "+49 123 456789"
}

# Business Details abrufen
GET /solutions/bookingBusinesses/{bookingBusinessId}

# Scheduling Page veröffentlichen
POST /solutions/bookingBusinesses/{id}/publish

Services (Dienstleistungen)

Typische MORELO-Services:

POST /solutions/bookingBusinesses/{id}/services
Content-Type: application/json

{
    "displayName": "Probefahrt",
    "defaultDuration": "PT2H",
    "defaultPrice": 0,
    "defaultPriceType": "free",
    "description": "Probefahrt mit einem MORELO Reisemobil",
    "isHiddenFromCustomers": false,
    "notes": "Bitte gültigen Führerschein mitbringen"
}
Service Dauer Preis
Probefahrt 2h Kostenlos
Kaufberatung 1h Kostenlos
Fahrzeugübergabe 3h Kostenlos
Service-Termin 1-4h Nach Aufwand
Saisoncheck 2h €199

Staff Members (Mitarbeiter)

POST /solutions/bookingBusinesses/{id}/staffMembers
{
    "displayName": "Max Mustermann",
    "emailAddress": "max@haendler.de",
    "role": "administrator",
    "availabilityIsAffectedByPersonalCalendar": true,
    "workingHours": [
        {
            "day": "monday",
            "timeSlots": [
                {"startTime": "08:00:00", "endTime": "18:00:00"}
            ]
        }
    ]
}

Rollen:

  • administrator - Volle Kontrolle
  • viewer - Nur lesen
  • externalGuest - Externe Mitarbeiter
  • scheduler - Kann Termine verwalten
  • member - Standard Mitarbeiter

Appointments (Termine)

# Termine in Zeitraum abrufen
GET /solutions/bookingBusinesses/{id}/calendarView
    ?start=2026-01-01T00:00:00Z
    &end=2026-01-31T23:59:59Z

# Neuen Termin erstellen
POST /solutions/bookingBusinesses/{id}/appointments
{
    "customerEmailAddress": "kunde@email.de",
    "customerName": "Hans Kunde",
    "customerPhone": "+49 170 1234567",
    "serviceId": "{serviceId}",
    "staffMemberIds": ["{staffId}"],
    "start": {
        "dateTime": "2026-01-20T10:00:00",
        "timeZone": "Europe/Berlin"
    },
    "end": {
        "dateTime": "2026-01-20T12:00:00",
        "timeZone": "Europe/Berlin"
    },
    "serviceNotes": "Interesse an MORELO Palace 90G"
}

# Termin aktualisieren
PATCH /solutions/bookingBusinesses/{id}/appointments/{appointmentId}
{
    "serviceNotes": "Kunde hat Finanzierungsfragen"
}

# Termin stornieren
POST /solutions/bookingBusinesses/{id}/appointments/{appointmentId}/cancel
{
    "cancellationMessage": "Termin wurde vom Kunden abgesagt"
}

Customers (Kunden)

# Kunden auflisten
GET /solutions/bookingBusinesses/{id}/customers

# Kunde erstellen/aktualisieren
POST /solutions/bookingBusinesses/{id}/customers
{
    "displayName": "Hans Kunde",
    "emailAddress": "hans@kunde.de",
    "phone": "+49 170 1234567",
    "addresses": [
        {
            "street": "Kundenstraße 5",
            "city": "Kundenstadt",
            "postalCode": "54321",
            "countryOrRegion": "DE"
        }
    ]
}

Berechtigungen (Permissions)

Permission Typ Beschreibung
Bookings.Read.All Delegated/App Buchungen lesen
Bookings.ReadWrite.All Delegated/App Buchungen verwalten
Bookings.Manage.All Delegated/App Volle Verwaltung
BookingsAppointment.ReadWrite.All Delegated Termine verwalten

MORELO Suite Integration

Sync-Strategie

// Webhook für Termin-Updates
app.post('/webhooks/ms-bookings', async (c) => {
  const notification = await c.req.json();

  // Termin in D1 spiegeln für Dashboard
  if (notification.changeType === 'created') {
    await db.insert(appointments).values({
      msBookingId: notification.resourceData.id,
      customerId: notification.resourceData.customerId,
      serviceType: notification.resourceData.serviceId,
      scheduledAt: notification.resourceData.start.dateTime,
      status: 'confirmed'
    });
  }

  return c.json({ status: 'ok' });
});

Dashboard Widget

Die Suite zeigt Termine aus MS Bookings an:

// Nächste Termine abrufen
const appointments = await graphClient
  .api(`/solutions/bookingBusinesses/${businessId}/calendarView`)
  .query({
    start: new Date().toISOString(),
    end: addDays(new Date(), 7).toISOString()
  })
  .get();

Self-Service Portal

MS Bookings generiert automatisch eine Buchungsseite:

https://outlook.office365.com/owa/calendar/MORELOHaendlerMustermann@domain.onmicrosoft.com/bookings/

Diese kann:

  • Im Dealer-Website eingebettet werden (iframe)
  • Als Link in E-Mails verschickt werden
  • Auf Facebook Business Page verknüpft werden

Referenzen