Mehrere Termine eines Kurses lassen sich zu einem Block zusammenfassen, den Teilnehmer als Ganzes buchen. Die Funktion wird je Mandant freigeschaltet.
Neues optionales Argument eventBlock: EventBlockInput bei addEventsV2 und createCourse — ist es gesetzt, entstehen die Termine als Block. Höchstens 20 Termine
Neues Feld eventBlockId: ID bei AddEventsV2Result
Neue Query getEventBlock(eventBlockId: ID!): EventBlock
Neue Query getEventBlocks(mandantIds: [ID!], offset: Int, limit: Int, fromDate: Date, toDate: Date): EventBlocksResult! — Blöcke, die den Zeitraum überschneiden, sortiert nach dem ersten Termin, höchstens 50 je Seite
Neue Mutation updateEventBlock(eventBlockId: ID!, eventBlock: EventBlockInput!, events: EventBlockEventsInput): EventBlock! — ersetzt die Block-Einstellungen, optional auch die gemeinsamen Termin-Einstellungen
Neue Mutation releaseEventBlock(eventBlockId: ID!): Boolean! — gibt die Restplätze einzeln frei und beendet den Blockverkauf; automatisch über autoReleaseDaysBefore
Neue Mutation extendEventBlock(sourceEventId: ID!, dates: [CopyEventDateInput!]!, numPlaces: Int, credits: Int, suppressNotifications: Boolean): [Event!]! — trägt Termine nach; bestehende Blockbucher bekommen sie ohne Aufpreis
Neue Typen EventBlock, EventBlocksResult, EventBlockInput und EventBlockEventsInput
Neues Feld eventBlock: EventBlock beim Typ Event
Neue Felder beim Typ Mandant: eventBlocksEnabled: Boolean (darf Blöcke anlegen) und hasEventBlocks: Boolean! (hat mindestens einen Block)
copyEvent legt bei einem Block-Termin einen Einzeltermin außerhalb des Blocks an
Neu
Blockbuchung: buchen, bezahlen, stornieren
Teilnehmer buchen einen Block mit einem Aufruf: Alle künftigen Termine werden auf einmal gebucht, der Blockpreis wird einmal bezahlt — mit Punkten, online oder direkt beim Anbieter. Mitglieder einer Block-Flatrate buchen kostenlos.
Neue Mutation createEventBlockBooking(eventBlockId: ID!, paymentMethod: EventBlockPaymentMethod): CreateEventBlockBookingResult! — bei Onlinezahlung mit paymentUrl und invoiceId im Ergebnis
Neue Mutation createEventBlockBookingForUser(userId: ID!, eventBlockId: ID!, paymentMethod: EventBlockPaymentMethod, skipInvoice: Boolean, suppressNotifications: Boolean): CreateEventBlockBookingResult! — der Anbieter bucht für einen Teilnehmer
Neue Mutation deleteEventBlockBooking(eventBlockId: ID!): String! — Storno durch den Teilnehmer bis zum ersten Termin, mit Erstattung des Blockpreises in Punkten. Eine mit Geld bezahlte Blockbuchung storniert nur der Anbieter
Neue Mutation deleteEventBlockBookingForUser(userId: ID!, eventBlockId: ID!, refundCredits: Boolean): String! — der Anbieter nimmt einen Teilnehmer heraus, mit oder ohne Erstattung des Blockpreises
Neue Query availablePaymentMethodsForEventBlock(eventBlockId: ID!): [MolliePaymentMethod!]!
Am EventBlock: angebotene Zahlungsarten paymentMethods (leere Liste = kostenlos), Blockpreis in Punkten credits oder Geldpreis, Block-Flatrate über flatrateUsergroups, dazu bookingEligibility und myEventBlockBooking für den Betrachter
Neue Typen EventBlockBooking, EventBlockPurchase (Kaufbeleg), EventBlockRefund und CreateEventBlockBookingResult
Neue Enums PaymentMethod (free, credits, money, manual), EventBlockPaymentMethod (credits, money, manual), EventBlockBookingStatus und EventBlockBookingEndedBy
Neues Feld eventBlockBooking: EventBlockBooking beim Typ Booking
Neu
Blockbuchung: Absage, Ausfall und Protokoll
Anbieter sagen ganze Blöcke ab, lassen einzelne Block-Termine ausfallen oder verschieben sie auf einen Ersatztermin. Dazu kommen eine Anwesenheitsübersicht je Block, ein neuer Nachrichtentyp und Block-Einträge im Protokoll.
Neue Mutation cancelEventBlock(eventBlockId: ID!, futureEvents: EventBlockFutureEvents!, refundCredits: Boolean, hint: String, suppressAllNotifications: Boolean, suppressTrainerNotification: Boolean): Boolean! — sagt einen ganzen Block ab, wahlweise mit Erstattung des Blockpreises
Neues Enum EventBlockFutureEvents: cancel (künftige Termine fallen mit aus) oder continueAsSingleEvents (sie laufen als Einzeltermine weiter)
Neue Mutation refundEventBlockEvent(eventId: ID!): Boolean! — ein Block-Termin fällt aus, Einzelbucher bekommen ihren Terminpreis zurück
Neue Mutation createReplacementEvent(eventId: ID!, date: CopyEventDateInput!, numPlaces: Int): Event! — ein Block-Termin fällt aus und bekommt einen Ersatztermin, alle Buchungen wandern mit. Block-Termine fallen nur über diese beiden Wege aus, nicht über cancelEventV2
Neue Felder replacedByEvent: Event und replacementFor: Event beim Typ Event
Neues Feld attendanceOverview: EventBlockAttendanceOverview am EventBlock — Auslastung und Anwesenheit je Termin und Teilnehmer, nur für Anbieter und Trainer des Blocks
Neuer Wert eventBlockCancelled im Enum MessageType
Neue Felder eventBlock und eventBlockBooking beim Typ Log, neuer Filter eventBlockId in LogsSearchParams
Zwölf neue Werte im Enum LogType: zehn von eventBlockCreated bis eventBlockEventRefunded, dazu creditsAddedEventBlockBooking und creditsRemovedEventBlockBooking
Neu
Buchungsprofile mit Typ: Termin oder Block
Buchungsprofile haben jetzt einen Typ: event für Termine, block für Blöcke. Aufrufe ohne Typ verhalten sich wie bisher und sehen nur Termin-Profile.
Neues Enum BookingProfileType mit event und block
Neues Feld type: BookingProfileType! beim Typ BookingProfile
Neues optionales Argument type bei bookingProfilesOfMandant — ohne Angabe vorerst nur Termin-Profile. Geplant ist, dass ohne type künftig alle Profile kommen; Clients sollten type deshalb schon jetzt mitgeben
Neues optionales Argument type bei createBookingProfile (Standard: event) und updateBookingProfile (ohne Angabe bleibt der Typ)
Neue Query bookingProfileEventTemplateCount(bookingProfileId: ID!): Int! — wie viele Terminvorlagen ihr Profil verlieren, wenn es gelöscht wird
August 2026
Neu
Widerruf von Shop-Käufen
Käufer können einen Shop-Kauf innerhalb der Widerrufsfrist widerrufen. Terminkäufe sind gesetzlich vom Widerrufsrecht ausgenommen und erscheinen nicht in der Liste.
Neue Query getMyRevocablePurchases: [RevocablePurchase!]! — Käufe mit laufender Frist, inklusive revocationDeadline
Neue Mutation declareRevocation(invoiceId: ID!): Revocation!
Neue Typen RevocablePurchase und Revocation
Ein bereits widerrufener Kauf kann nicht erneut widerrufen werden
Neu
Shop-API für native Apps
Neue Felder rund um Buchung, Rechnung und Zahlung. Alle Änderungen sind additiv.
Neue Query availablePaymentMethodsForEvent(eventId: ID!): [MolliePaymentMethod!]!
Neue Felder invoiceId: ID und invoiceStatus: InvoiceStatus bei Booking — nur für den Buchenden selbst und Event-Admins, sonst null
Neues Feld invoiceId: ID bei CreateBookingV2Result
Neues Feld myBooking: Booking bei Event — liefert die eigene Buchung unabhängig von der Einstellung publicParticipantNames
Neue Felder molliePaymentStatus und molliePaymentMethod bei Invoice, beide null solange keine Online-Zahlung existiert
Neu
TLC-Charge nachträglich korrigieren
Der Betrag einer bestehenden TLC-Charge lässt sich jetzt korrigieren, ohne sie löschen und neu anlegen zu müssen. Gültigkeitszeitraum und Historie bleiben erhalten.
Neue Mutation updateTimeLimitedCredit(id: ID!, amount: Int!): Boolean! — der Wert wird absolut gesetzt, nicht addiert
Gültiger Bereich 1–10.000; unveränderte Werte werden abgelehnt
validFrom und validUntil bleiben unveränderlich
Neuer Log-Typ tlcEdited mit altem und neuem Wert
Neu
Freiplätze auf kostenpflichtigen Terminen
Admins können einen Teilnehmer auf einen kostenpflichtigen Termin buchen, ohne dass eine Rechnung entsteht — für Freiplätze, Gutscheine oder Sonderfälle.
Neues optionales Argument skipInvoice: Boolean bei createBookingForUserV2
Die Buchung entsteht wie eine kostenlose: keine Rechnung, keine Rechnungs-Mail, wasPurchased bleibt false
Nur auf dem Admin-Pfad wirksam; im Protokoll als invoice-skipped vermerkt
Juli 2026
Neu
Bild-Varianten und Logo-Upload
Hochgeladene Bilder werden nicht mehr auf 200×200 verkleinert, sondern in mehreren Größen gespeichert. Neu ist außerdem die Bildart logo mit erhaltener Transparenz. Alle Schema-Änderungen sind additiv — bestehende Clients funktionieren unverändert.
Neues Enum PictureKind mit coursePicture und logo
Neue Felder bei Picture: kind: PictureKind!, mediumUrl: String, width: Int, height: Int — bei Logos bleiben die Medium-Felder leer
Neues optionales Argument kind bei mandantPictures und uploadMandantPictureV2 (Standard: coursePicture)