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 #

EgenskapDetaljer
TypString
LängdRekommenderas att hållas under 1024 tecken för optimal prestanda.
FormatValfritt, 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 #

📋
Webhook Payload (JSON)
Kopiera till urklipp
{
  "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ältnamnBeskrivningVarför är det viktigt?
messageIdID för det ursprungliga meddelandet.Används för att se vilket specifikt utskick kunden svarar på.
senderMottagarens telefonnummer (MSISDN).För att veta vilken kund som klickade så att du kan uppdatera rätt profil.
typeTyp av händelse.I detta fall SUGGESTION_RESPONSE, vilket betyder att en knapp har tryckts.
postbackDataDen dolda strängen.Det är denna du använder i din if– eller switch-sats för att trigga logik.
textDen synliga texten på knappen.Kan användas för loggning, men bör inte användas för affärslogik.
timestampTidpunkt 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.

🔷
Modell Webhook (C#)
Kopiera till urklipp
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.

🔷
Controller (C#)
Kopiera till urklipp
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 */ }
}