postbackData är en osynlig sträng (payload) som du bifogar till varje interaktiv knapp (Suggestion) i ditt RCS-meddelande. När en användare klickar på en knapp, skickas denna sträng tillbaka till din server via en webhook.
Medan text-fältet på en knapp är det som användaren ser (t.ex. ”Ja tack!”), är postbackData det som din kod läser (t.ex. user_confirmed_subscription_v1).
Identifiering: Du kan exakt veta vilken knapp användaren klickade på, även om flera knappar har samma text (t.ex. ”Välj” under olika produkter i en karusell).
Språkoberoende: Du kan ändra knappens text från ”Köp” till ”Buy” utan att behöva ändra din logik i backend, eftersom postbackData förblir densamma.
Automation: Det gör det möjligt att trigga nästa steg i en konversation automatiskt (t.ex. skicka en bekräftelse direkt när klicket registreras).
Hur fungerar flödet? #
Sändning: Du skickar ett meddelande med en knapp där postbackData är satt till order_123_confirm.
Interaktion: Användaren ser knappen ”Bekräfta order” och klickar på den.
Retur: Mottagarens telefon skickar tillbaka strängen order_123_confirm till RCS-plattformen.
Webhook: iP.1 Networks skickar ett HTTP-anrop till din fördefinierade deliveryReportUrl med denna data.
Tekniska specifikationer #
| Egenskap | Detaljer |
| Typ | String |
| Längd | Rekommenderas att hållas under 1024 tecken för optimal prestanda. |
| Format | Valfritt, men ofta används JSON eller snake_case för enkel parsning. |
Exempel på användning #
Scenario A: Enkelt val (Ja/Nej) #
I ett meddelande om tidsbokning kan du ha två knappar:
- Knapp 1: Text: ”Ja”, postbackData:
appointment_confirm_id_888 - Knapp 2: Text: ”Nej, boka om”, postbackData:
appointment_reschedule_id_888
Scenario B: Karusell med produkter #
Om du skickar en karusell med tre olika tröjor kan du använda postbackData för att inkludera artikelnummer:
- Kort 1: postbackData:
sku_99_blue_large - Kort 2: postbackData:
sku_102_red_medium
Best Practices #
Använd unika ID:n: Inkludera alltid ett unikt referens-ID (t.ex. ett order-ID) i din postbackData så att du vet exakt vilken transaktion klicket rör.
Maskinläsbart format: Om du har mycket information, använd ett format som din server lätt kan läsa, t.ex: {"action": "verify", "user": "46700123456", "ver": 1}.
Loggning: Spara alltid den uniqueId du skickade i ursprungsmeddelandet tillsammans med förväntad postbackData i din databas för att kunna stänga loopen vid svar.
Exempel på Webhook-payload #
{
"messageId": "msg-123456789",
"conversationId": "conv-987654321",
"sender": "46700123456",
"agent": "Kundservice",
"brand": "Min-Butik-AB",
"type": "SUGGESTION_RESPONSE",
"postbackData": "track_package_click",
"text": "Spåra paket",
"timestamp": "2026-03-17T16:05:10Z"
}
Förklaring av webhook-fält #
| Fältnamn | Beskrivning | Varför är det viktigt? |
| messageId | ID för det ursprungliga meddelandet. | Används för att se vilket specifikt utskick kunden svarar på. |
| sender | Mottagarens telefonnummer (MSISDN). | För att veta vilken kund som klickade så att du kan uppdatera rätt profil. |
| type | Typ av händelse. | I detta fall SUGGESTION_RESPONSE, vilket betyder att en knapp har tryckts. |
| postbackData | Den dolda strängen. | Det är denna du använder i din if– eller switch-sats för att trigga logik. |
| text | Den synliga texten på knappen. | Kan användas för loggning, men bör inte användas för affärslogik. |
| timestamp | Tidpunkt för klicket. | För att kunna logga exakt när interaktionen skedde. |
Exempel på hantering av RCS Webhook (C#) #
I C# vill vi oftast ha en starkt typad modell för att kunna dra nytta av IntelliSense och undvika stavfel.
1. Skapa en modell för Webhook-datan #
Först skapar vi en klass som matchar JSON-strukturen vi får från iP.1 Networks.
public class RcsWebhookRequest
{
public string MessageId { get; set; }
public string ConversationId { get; set; }
public string Sender { get; set; } // Mottagarens telefonnummer
public string Agent { get; set; }
public string Brand { get; set; }
public string Type { get; set; } // T.ex. "SUGGESTION_RESPONSE"
public string PostbackData { get; set; }
public string Text { get; set; }
public DateTime Timestamp { get; set; }
}
2. Skapa din API Controller #
Här bygger vi logiken för att ”fånga” klicket och utföra rätt handling.
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/webhooks")]
public class RcsWebhookController : ControllerBase
{
[HttpPost("rcs-callback")]
public IActionResult HandleRcsInteraction([FromBody] RcsWebhookRequest request)
{
// 1. Logga inkommande klick för felsökning
Console.WriteLine($"Användare {request.Sender} klickade på: {request.Text}");
// 2. Kontrollera att det faktiskt är ett knapptryck (Suggestion)
if (request.Type != "SUGGESTION_RESPONSE")
{
return Ok(); // Vi svarar 200 även om vi inte hanterar just denna typ
}
// 3. Agera baserat på postbackData
switch (request.PostbackData)
{
case "track_package_click":
// Anropa din frakt-tjänst
bool success = NotifyShippingService(request.Sender);
break;
case "claim_offer_v1":
// Aktivera rabattkod i databasen
ActivateVoucher(request.Sender, "SPRING2026");
break;
case "confirm_appointment":
// Uppdatera bokningsstatus
UpdateCalendarStatus(request.Sender, true);
break;
default:
// Logga okänd postbackData för framtida uppdateringar
Console.WriteLine($"Okänd handling: {request.PostbackData}");
break;
}
// 4. Svara ALLTID 200 OK snabbt för att bekräfta mottagandet
return Ok(new { status = "received" });
}
// Exempel på interna metoder för affärslogik
private void ActivateVoucher(string msisdn, string code) { /* Din logik här */ }
private bool NotifyShippingService(string msisdn) { /* Din logik här */ return true; }
private void UpdateCalendarStatus(string msisdn, bool confirmed) { /* Din logik här */ }
}