Inhaltsverzeichnis
Erste Schritte mit Herausforderungen im Zusammenhang mit der Treue
Wenn eine Challenge-Aufgabe, ein Meilenstein oder eine Challenge abgeschlossen und ein Belohnungswert konfiguriert wurde gibt die Plattform eine Belohnung aus, indem sie den HTTP-Endpunkt Ihres Belohnungsanbieters mit einer JSON-Payload aufruft. Eine Belohnungsdefinition beschreibt, welche Belohnung ausgegeben werden soll, und bietet einen JSONata-Ausdruck - rewardJsonata - der die genaue Payload formt, die Ihr Anbieter erwartet.
In diesem Handbuch wird beschrieben, wie Sie einen Belohnungsanbieter konfigurieren, Belohnungsdefinitionen erstellen, den rewardJsonata Ausdruck schreiben und verstehen, welcher Kontext zur Auswertungszeit für ihn verfügbar ist.
Modell mit zwei Ebenen
Die Belohnungen sind in zwei Stufen organisiert:
Reward Provider (endpoint, auth, headers)
└── Reward Definition (denomination, rewardJsonata)
└── Reward Definition
└── ...
Ein Belohnungsanbieter stellt ein einzelnes externes Belohnungssystem dar und enthält die URL des Versandendpunkts, die Authentifizierung und alle benutzerdefinierten HTTP-Kopfzeilen. Ein Anbieter kann mehrere Belohnungsdefinitionen besitzen, die jeweils einen anderen Belohnungstyp oder eine andere von diesem Anbieter angebotene Bezeichnung beschreiben (z. B. „50 Sterne“, „Doppelsterne“, „Gratis-Artikel„).
Eine Challenge verweist auf den Anbieter und die Definition per GUID. Wenn eine Belohnung ausgegeben wird, bewertet die Plattform den rewardJsonata Ausdruck der Definition und sendet das Ergebnis an den Endpunkt des Anbieters.
Belohnungsanbieter- und Definitionsfelder
| table 0-row-4 1-row-4 2-row-4 3-row-4 4-row-4 5-row-4 6-row-4 7-row-4 8-row-4 html-authored | |||
|---|---|---|---|
| Feld | Typ | Erforderlich | Beschreibung |
guid |
String |
Nein (vom System zugewiesen) | Eindeutige Kennung. Schreibgeschützt. |
name |
String |
Ja | Anzeigename, innerhalb der Organisation eindeutig. |
desc |
String |
Nein | Lesbare Beschreibung des Anbieters. |
enabled |
Boolean |
Nein | Wenn false, wird der VersandBelohnungen für alle Definitionen unter diesem Anbieter ausgesetzt. |
url |
String |
Ja | HTTP-Endpunkt, der die Belohnungs-Payload erhält. Die Plattform sendet die ausgewertete rewardJsonata an diese URL. |
additionalHeaders |
Object |
Nein | Benutzerdefinierte HTTP-Kopfzeilen, die in jede Versandanfrage werden sollen (z. B. API-Schlüssel Inhaltsüberschreibungen). |
maxRatePerSecond |
Integer |
Nein | Optionales Ratenlimit pro Anbieter (1-5000). Null bedeutet unbegrenzt. |
enableMTLS |
Boolean |
Nein | Ob der Endpunkt gegenseitiges TLS erfordert. |
| table 0-row-4 1-row-4 2-row-4 3-row-4 4-row-4 5-row-4 6-row-4 7-row-4 html-authored | |||
|---|---|---|---|
| Feld | Typ | Erforderlich | Beschreibung |
guid |
String |
Nein (vom System zugewiesen) | Eindeutige Kennung. Schreibgeschützt. |
name |
String |
Ja | Anzeigename, innerhalb des Anbieters eindeutig. |
denomination |
String |
Nein | Die Einheit der Belohnung, die in der Anzeige verwendet wird in Ausdrücken verfügbar ist als reward.denomination(z. B. "Stars", "Points", "Miles"). |
desc |
String |
Nein | Beschreibung der Belohnung, Ausdrücke als reward.desc verfügbar. |
enabled |
Boolean |
Nein | Wenn false, ist diese Definition inaktivgibt keine Belohnungen aus. |
isDefault |
Boolean |
Nein | Markiert dies als die Sandbox-weite Standard Belohnungsdefinition. Es kann immer nur eine Standarddefinition für alle Anbieter vorhanden sein. Wenn einen neuen Standard festlegen, wird der vorherige Standard gelöscht. Wird zum automatischen Ausfüllen von Belohnungsdetails für Herausforderungen zum Zeitpunkt der Veröffentlichung verwendet. |
rewardJsonata |
String |
Ja | JSONata-Ausdruck, der zum Zeitpunkt Belohnungsproblems ausgewertet wird Erhält den vollständigen und muss die JSON-Payload POST an den Anbieter zurückgeben. |
Der Belohnungskontext
Wenn rewardJsonata ausgewertet wird, erhält es ein einzelnes Stammobjekt, das alles über das Belohnungsereignis Bekannte enthält. Alle Pfade in Ihrem Ausdruck sind relativ zu diesem Stamm.
{
"rewardContext": {
"rewardValue": "50",
"source": "challenge"
},
"reward": {
"name": "500 Stars",
"desc": "Issue 500 Stars to the member",
"denomination": "Stars",
"enabled": true
},
"task": { ... },
"milestone": { ... },
"challenge": { ... },
"timestamp": "2026-02-10T00:29:22.538+00:00"
}
| table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 6-row-2 7-row-2 8-row-2 9-row-2 10-row-2 11-row-2 12-row-2 13-row-2 14-row-2 15-row-2 16-row-2 | |
|---|---|
| Feld | Beschreibung |
rewardContext.rewardValue |
Die Zeichenfolge des Belohnungswerts, die für die Herausforderung, Aufgabe oder den Meilenstein konfiguriert wurde, die/der diese Ausgabe ausgelöst hat. |
rewardContext.source |
Was die Belohnung ausgelöst hat: "task", "challenge" oder "milestone". |
reward |
Die Belohnungsdefinition selbst — name, desc, denomination. |
task |
Die abgeschlossene Aufgabe, einschließlich ihrer accumulators, schedule und reward. |
task.accumulators.spend |
Gesamtzahl der von der Aufgabe kumulierten qualifizierten Ausgaben. |
task.accumulators.qty |
Gesamtzahl der von der Aufgabe kumulierten qualifizierten Elemente. |
task.accumulators.item_list |
Alle qualifizierten Elemente, die auf die Aufgabe angewendet wurden. Jeder Eintrag hat item, transactionId, timestamp, utcOffset, locationId. |
task.accumulators.item_list[-1] |
Das zuletzt angewendete Element (JSONata-negativer Index). Nützlich für die Suche nach der letzten Transaktions-ID oder dem letzten Zeitstempel. |
task.schedule.currentStreak |
Aktuelle Anzahl aufeinander folgender Besuche (für Streak-Herausforderungen). |
task.schedule.currentVisits |
Besuchsanzahl insgesamt (für Besuchsherausforderungen). |
milestone |
Der Meilenstein, der diese Belohnung ausgelöst hat, oder null, wenn nicht eine Meilensteinbelohnung. Enthält count und reward.rewardValue. |
challenge.profileId |
Die Treue-ID des Mitglieds. |
challenge.kvpCustom |
Benutzerdefinierte Schlüssel-Wert-Paare, die für die Challenge konfiguriert sind. Ein gängiges Muster für die Übergabe von Kampagnen-IDs, Produktnamen oder anbieterspezifischen Metadaten. |
challenge.name |
Name der Herausforderung. |
challenge._id |
Challenge-ID. |
timestamp |
ISO 8601-Zeitstempel der Belohnungsausgabe. |
Schreiben des rewardJsonata-Ausdrucks
Der Ausdruck empfängt den Belohnungskontext als Eingabe und muss ein JSON-Objekt zurückgeben - die an den Endpunkt des Anbieters gepostete Payload. Die Form dieses Objekts hängt vollständig von der API des Anbieters ab. Sie ordnen Kontextfelder welcher Struktur auch immer der Anbieter erwartet.
Der einfachste Fall: Der Provider benötigt eine Punktzahl und eine Mitglieds-ID, die beide aus dem Kontext bekannt sind.
| code language-jsonata |
|---|
|
Ausgabe:
| code language-json |
|---|
|
rewardContext.rewardValueist immer eine Zeichenfolge. Verwenden Sie$number(), um sie zu konvertieren, wenn Ihr Anbieter einen numerischen Wert erwartet.
kvpCustom für anbieterspezifische MetadatenAnbieter benötigen häufig Felder wie Kampagnen-IDs oder Quellsystem-Codes, die für jede Challenge-Ausführung spezifisch sind. Speichern Sie diese beim Verfassen der Herausforderung in challenge.kvpCustom und referenzieren Sie sie dann im Ausdruck. So bleibt der Ausdruck kampagnenübergreifend wiederverwendbar.
| code language-jsonata |
|---|
|
Sie können auch reward.kvpCustom für Konstanten verwenden, die für einen bestimmten Belohnungstyp und nicht pro Herausforderung festgelegt sind.
Aufgabenakkumulatoren halten Aufzeichnungen über jedes qualifizierte Ereignis bereit. Verwenden Sie item_list[-1] , um auf das zuletzt angewendete Element zuzugreifen - seine transactionId und timestamp sind für Audit-Trails und Deduplizierung auf Anbieterseite nützlich.
| code language-jsonata |
|---|
|
Bei benachrichtigungsbasierten Anbietern (Slack, SMS, E-Mail) können Sie eine Nachrichtenzeichenfolge direkt mit dem & Verkettungsoperator von JSONata erstellen:
| code language-jsonata |
|---|
|
Ausgabe:
| code language-json |
|---|
|
Beispiele
Szenario: grundlegende Treuepunkte-API erwartet eine Mitglieder-ID und einen Punktbetrag.
Belohnungsdefinition:
| code language-json |
|---|
|
Formatierter Ausdruck:
| code language-jsonata |
|---|
|
Payload an Provider gepostet:
| code language-json |
|---|
|
Szenario: Anbieter benötigt einen strukturierten Prämiensatz, der Auditfelder, Kampagnenverweise und Mitgliederbeschreibungen enthält. Kampagnenspezifische Werte werden in challenge.kvpCustom gespeichert, sodass dieselbe Belohnungsdefinition über Kampagnen hinweg funktioniert, ohne den Ausdruck zu bearbeiten.
Challenge-kvpCustom (festgelegt bei der Bearbeitung der Challenge):
| code language-json |
|---|
|
Belohnungsdefinition:
| code language-json |
|---|
|
Formatierter Ausdruck:
| code language-jsonata |
|---|
|
Payload an Provider gepostet:
| code language-json |
|---|
|
Szenario: Streak Challenge gibt alle N Besuche eine Meilensteinbelohnung aus. Der Ausdruck enthält die Meilensteinanzahl und den aktuellen Stream für den anbieterseitigen Kontext.
Formatierter Ausdruck:
| code language-jsonata |
|---|
|
Payload an Provider gepostet (beim zweiten Meilenstein des Besuchs):
| code language-json |
|---|
|
Wenn
rewardContext.source"milestone"wird, wird dasmilestonemitcountundreward.rewardValuebefüllt. Wenn die Quelle"task"oder"challenge"ist, wirdmilestonenull.
API-Referenz
| code language-http |
|---|
|
Für alle Anfragen sind x-gw-ims-org-id und x-sandbox-name Kopfzeilen erforderlich.
Anbieter erstellen:
| code language-http |
|---|
|
| code language-http |
|---|
|
Erstellen Sie eine Belohnungsdefinition:
| code language-http |
|---|
|
Validierung von Ausdrücken
rewardJsonata Ausdrücke werden zum Zeitpunkt der Veröffentlichung auf Syntax überprüft. Wenn der Ausdruck ungültig ist, gibt die API einen 422 mit einer Beschreibung des Analysefehlers zurück.
Um einen Ausdruck vor der Veröffentlichung zu entwickeln und zu testen, verwenden Sie den JSONata Exerciser. Fügen Sie das Belohnungskontext-JSON als Eingabedokument und Ihren Ausdruck ein, um zu überprüfen, ob die Ausgabe mit den Erwartungen Ihres Anbieters übereinstimmt. Ein repräsentativer Belohnungskontext für jeden Trigger (task, milestone, challenge) wird in den obigen Beispielen gezeigt.
Häufige Fehler
rewardContext.rewardValue als Zahl ohne Konversion verwendet$number(rewardContext.rewardValue) umschließenchallenge.kvpCustom.someKey gibt null zurückkvpCustom vorhanden isttask.accumulators.item_list[-1] ist nulltimestamp aus dem Kontext .milestone Zugriff, wenn die Quelle "task" oder "challenge" istmilestone ist null; Ausdruck löst NULL-Felder aus oder erzeugt sierewardContext.source vor dem Zugriff auf milestone prüfen oder milestone nur in Definitionen verwenden, die an Meilenstein-Prämien angehängt sind{ "items": [...] }