{"id":310,"date":"2026-05-30T05:00:35","date_gmt":"2026-05-30T05:00:35","guid":{"rendered":"https:\/\/www.plura.ai\/articles\/rcs-business-messaging-analytics"},"modified":"2026-09-02T05:34:40","modified_gmt":"2026-09-02T05:34:40","slug":"rcs-business-messaging-analytics","status":"publish","type":"post","link":"https:\/\/www.plura.ai\/articles\/rcs-business-messaging-analytics","title":{"rendered":"How to Track RCS Read Receipts and Webhook Events"},"content":{"rendered":"<p><em>Written by: Matt Beucler, CEO, Plura AI | Last updated: August 27, 2026<\/em><\/p>\n<h2 id=\"key-takeaways\">Key Takeaways<\/h2>\n<ul>\n<li>RCS Business Messaging analytics captures delivery, read, interaction, and conversion events via Google webhooks. Plura AI ingests these events and enriches them with campaign IDs and customer tokens.<\/li>\n<li>Events persist into Plura AI&#8217;s Stateful Conversation Database so every RCS touch inherits prior voice and SMS context across channels.<\/li>\n<li>Plura AI maps enriched RCS events to CRM objects in HubSpot, Salesforce, and Zoho. Operations teams see funnel-stage metrics and agent-health thresholds on custom dashboards.<\/li>\n<li>Compliance exports include unsubscribe and spam reasons plus consent timestamps for TCPA and DNC audit trails within a single U.S.-based infrastructure stack.<sup data-disclaimer-ids=\"22,23\" data-disclaimer-indexes=\"1,2\">1,2<\/sup><\/li>\n<li>Plura AI unifies RCS analytics, stateful conversation tracking, and CRM integrations in one platform. <a href=\"https:\/\/www.plura.ai\/plura-webchat\" target=\"_blank\">Book a live demo<\/a> to see the full workflow.<\/li>\n<\/ul>\n<h2>How to Track RCS Read Receipts: Step 1 &#8211; Register the Webhook Endpoint and Verify SSL<\/h2>\n<p>Google&#8217;s RBM platform delivers all user events, including <code>DELIVERED<\/code> and <code>READ<\/code> events, to a registered HTTPS endpoint. The endpoint returns an HTTP 200 response to acknowledge receipt.<\/p>\n<p>The following Python handler registers the endpoint and verifies the SSL handshake.<\/p>\n<pre><code>from flask import Flask, request, jsonify import json, hmac, hashlib, os app = Flask(__name__) WEBHOOK_SECRET = os.environ[\"RBM_WEBHOOK_SECRET\"] @app.route(\"\/rbm\/webhook\", methods=[\"POST\"]) def rbm_webhook(): sig = request.headers.get(\"X-Goog-Signature\", \"\") body = request.get_data() expected = hmac.new( WEBHOOK_SECRET.encode(), body, hashlib.sha512 ).hexdigest() if not hmac.compare_digest(sig, expected): return jsonify({\"error\": \"invalid signature\"}), 403 payload = json.loads(body) # hand off to event router route_event(payload) return jsonify({\"status\": \"ok\"}), 200 <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Use a dedicated subdomain with a certificate from a public CA. Google rejects self-signed certificates during verification.<\/p>\n<p><strong>Common failure modes:<\/strong> Slow responses can cause duplicate delivery, because Google retries. Use an async task queue such as Celery or Cloud Tasks so the endpoint acknowledges immediately and processes in the background.<\/p>\n<h2>RCS Webhook Events for Analytics: Step 2 &#8211; Parse the Event Payload and Enrich with Campaign ID and Customer Token<\/h2>\n<p>Once the endpoint is verified and receiving events, the next task is turning raw payloads into structured data that analytics tools can use.<\/p>\n<p><a href=\"https:\/\/developers.google.com\/business-communications\/rcs-business-messaging\/guides\/build\/events\/receive-events\" target=\"_blank\" rel=\"noindex nofollow\">Google&#8217;s RBM platform sends events<\/a> for delivery and read status, typing indicators, subscription changes, and suggestion responses. Event payloads include fields that identify the sender phone number, event type, and related IDs.<\/p>\n<figure style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/cdn.aigrowthmarketer.co\/1779338832429-847c53c76db5.png\" alt=\"Plura RCS messaging interface showing rich mobile communication with branded media, interactive messaging, and AI engagement tools.\" style=\"max-height: 500px\" loading=\"lazy\"><figcaption><em>Plura RCS enables rich mobile messaging with interactive media, branded customer experiences, and AI-powered conversational engagement.<\/em><\/figcaption><\/figure>\n<pre><code>import re, time CAMPAIGN_MAP = { \"agent_appt_reminder_v2\": \"CAMP_2026_Q3_APPT\", \"agent_promo_summer\": \"CAMP_2026_SUMMER\", } def enrich_event(payload: dict) -&gt; dict: agent_id = payload.get(\"agentId\", \"\") phone = payload.get(\"senderPhoneNumber\", \"\") # normalize E.164 to token token = re.sub(r\"\\D\", \"\", phone) campaign = CAMPAIGN_MAP.get(agent_id, \"UNKNOWN\") return { **payload, \"campaignId\": campaign, \"customerToken\": token, \"ingestedAtMs\": int(time.time() * 1000), } <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Map <code>agentId<\/code> to campaign IDs at ingest time, not at query time. Retroactive mapping breaks historical cohort analysis and makes reporting unreliable.<\/p>\n<p><strong>Common failure modes:<\/strong> Phone numbers arrive in multiple formats. Normalize to E.164 before tokenizing, or the same customer appears as multiple records in the stateful database.<\/p>\n<h2>How to Persist RCS Events into a Stateful Conversation Database: Step 3 &#8211; Write Events So Every RCS Touch Inherits Prior Voice and SMS Context<\/h2>\n<p>Raw events become analytics assets only when they share a data layer with every other channel. Without that shared layer, an RCS read receipt sits isolated from the voice call that preceded it, and the agent has no context when the customer calls back.<\/p>\n<p>Plura&#8217;s Stateful Conversation Database solves this by keying every interaction to a customer token across voice, SMS, RCS, and AI webchat. The write pattern below guarantees that each new event updates both the immutable event log and the current conversation state in a single transaction, which removes the dual-write problem that causes phantom or lost events.<\/p>\n<figure style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/cdn.aigrowthmarketer.co\/1779338680098-bf2bbd201647.png\" alt=\"Plura Unified Inbox interface showing centralized AI Voice, SMS, RCS, and Webchat conversations in one omnichannel workspace.\" style=\"max-height: 500px\" loading=\"lazy\"><figcaption><em>Plura Unified Inbox centralizes AI Voice, SMS, RCS, and Webchat conversations into one streamlined omnichannel communication workspace.<\/em><\/figcaption><\/figure>\n<pre><code>import psycopg2, json def persist_event(conn, enriched: dict): with conn: with conn.cursor() as cur: # upsert conversation state cur.execute( \"\"\" INSERT INTO conversations ( customer_token, last_channel, last_event_type, last_event_at, campaign_id ) VALUES ( %s, 'RCS', %s, to_timestamp(%s \/ 1000.0), %s ) ON CONFLICT (customer_token) DO UPDATE SET last_channel = EXCLUDED.last_channel, last_event_type = EXCLUDED.last_event_type, last_event_at = EXCLUDED.last_event_at, campaign_id = EXCLUDED.campaign_id \"\"\" , ( enriched[\"customerToken\"], enriched[\"eventType\"], enriched[\"ingestedAtMs\"], enriched[\"campaignId\"], ), ) # append to immutable event log cur.execute( \"\"\" INSERT INTO rcs_events ( event_id, customer_token, campaign_id, event_type, message_id, agent_id, raw_payload, ingested_at_ms ) VALUES (%s,%s,%s,%s,%s,%s,%s,%s) ON CONFLICT (event_id) DO NOTHING \"\"\" , ( enriched[\"eventId\"], enriched[\"customerToken\"], enriched[\"campaignId\"], enriched[\"eventType\"], enriched.get(\"messageId\"), enriched[\"agentId\"], json.dumps(enriched), enriched[\"ingestedAtMs\"], ), ) <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Use <code>ON CONFLICT (event_id) DO NOTHING<\/code> for idempotency. Google retries unacknowledged webhooks, so duplicate <code>eventId<\/code> values arrive and must not create duplicate records.<\/p>\n<p><strong>Common failure modes:<\/strong> Writing conversation state and the event log in separate transactions creates a window where a crash produces an updated state with no corresponding event record. The single-transaction pattern above closes that window.<\/p>\n<p><strong>See webhook mapping in action<\/strong>, and walk through how Plura persists RCS events into a stateful database on a live account.<\/p>\n<h2>RBM Agent Reputation Metrics: Step 4 &#8211; Map Events to CRM Objects with Plura Integrations<\/h2>\n<p>Agent reputation depends on spam rate, unsubscribe rate, and delivery success. Negative signals can result in an agent being suspended, so operations teams need these signals inside the CRM while campaigns are live.<\/p>\n<p>Plura integrations include native connectors for HubSpot, Salesforce, and Zoho.<sup data-disclaimer-id=\"25\" data-disclaimer-index=\"3\">3<\/sup> The pattern below maps an enriched RCS event to a HubSpot contact activity using the HubSpot Engagements API.<\/p>\n<pre><code>import requests, os HS_TOKEN = os.environ[\"HUBSPOT_PRIVATE_APP_TOKEN\"] def map_to_hubspot(enriched: dict, hs_contact_id: str): event_type = enriched[\"eventType\"] label_map = { \"DELIVERED\": \"RCS Message Delivered\", \"READ\": \"RCS Message Read\", \"UNSUBSCRIBE\": \"RCS Unsubscribe\", \"SUBSCRIBE\": \"RCS Resubscribe\", } label = label_map.get(event_type, f\"RCS Event: {event_type}\") body = { \"engagement\": {\"type\": \"NOTE\", \"timestamp\": enriched[\"ingestedAtMs\"]}, \"associations\": {\"contactIds\": [hs_contact_id]}, \"metadata\": { \"body\": ( f\"{label} | Campaign: {enriched['campaignId']} \" f\"| MessageId: {enriched.get('messageId','N\/A')} \" f\"| AgentId: {enriched['agentId']}\" ) }, } resp = requests.post( \"https:\/\/api.hubapi.com\/engagements\/v1\/engagements\", json=body, headers={\"Authorization\": f\"Bearer {HS_TOKEN}\"}, timeout=10, ) resp.raise_for_status() return resp.json() <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Resolve the CRM contact ID from <code>customerToken<\/code> before calling the CRM API. Store the resolved ID in the conversations table so later events can write to the CRM without a fresh lookup every time.<\/p>\n<p><strong>Common failure modes:<\/strong> CRM rate limits, such as HubSpot&#8217;s 100 requests per 10 seconds on the free tier, cause 429 errors at volume. Use an exponential backoff retry with jitter and a dead-letter queue for failed writes so events are not lost.<\/p>\n<h2>How to Build Custom Dashboards for RCS Funnel-Stage Metrics: Step 5 &#8211; Surface Funnel Metrics and Agent-Health Thresholds<\/h2>\n<p>Plura&#8217;s <a href=\"https:\/\/plura.ai\/business-intelligence\" target=\"_blank\" rel=\"noindex nofollow\">business intelligence<\/a> layer treats every RCS interaction as a data point that rolls up into funnel and reputation metrics. The SQL view below aggregates the <code>rcs_events<\/code> table into six funnel-stage metrics that align with the Google metric table referenced earlier.<\/p>\n<figure style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/cdn.aigrowthmarketer.co\/1779338480670-5b2fbc1c92ba.png\" alt=\"Plura Conversation Intelligence dashboard displaying AI-powered call analytics, transfer tracking, and customer conversation insights.\" style=\"max-height: 500px\" loading=\"lazy\"><figcaption><em>Plura Conversation Intelligence gives businesses AI-powered analytics, call transfer tracking, and customer interaction insights across every conversation.<\/em><\/figcaption><\/figure>\n<pre><code>CREATE OR REPLACE VIEW rcs_funnel_metrics AS SELECT campaign_id, DATE_TRUNC('day', to_timestamp(ingested_at_ms \/ 1000.0)) AS event_date, COUNT(*) FILTER (WHERE event_type = 'DELIVERED') AS delivered, COUNT(*) FILTER (WHERE event_type = 'READ') AS reads, COUNT(*) FILTER ( WHERE event_type IN ('suggestionResponse', 'IS_TYPING') ) AS responses, COUNT(*) FILTER (WHERE event_type = 'UNSUBSCRIBE') AS unsubscribes, -- spam_reports sourced from RBM agent reputation API, joined separately ROUND( COUNT(*) FILTER (WHERE event_type = 'READ')::numeric \/ NULLIF(COUNT(*) FILTER (WHERE event_type = 'DELIVERED'), 0) * 100, 2 ) AS read_rate_pct, ROUND( COUNT(*) FILTER (WHERE event_type = 'UNSUBSCRIBE')::numeric \/ NULLIF(COUNT(*) FILTER (WHERE event_type = 'DELIVERED'), 0) * 100, 2 ) AS unsubscribe_rate_pct FROM rcs_events GROUP BY 1, 2; <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Set agent-health alert thresholds before campaigns launch so you have a baseline once traffic starts. Twilio&#8217;s RCS documentation notes that elevated spam rates directly affect agent reputation.<sup data-disclaimer-id=\"25\" data-disclaimer-index=\"3\">3<\/sup> which means high spam or unsubscribe rates should trigger an immediate operational review.<\/p>\n<p><strong>Common failure modes:<\/strong> Dividing by zero when delivered count is zero crashes the view. The <code>NULLIF<\/code> guard above prevents that. Also, <code>IS_TYPING<\/code> events do not confirm a reply was sent, so count them separately from confirmed <code>suggestionResponse<\/code> events to avoid inflating response rate.<\/p>\n<h2>RCS Unsubscribe Reasons Export: Step 6 &#8211; Export Unsubscribe and Spam Data for TCPA and DNC Audit Trails<\/h2>\n<p>TCPA and DNC frameworks describe how operators should honor opt-out requests and maintain records of consent and revocation.<sup data-disclaimer-id=\"22\" data-disclaimer-index=\"1\">1<\/sup> Plura supports compliance by timestamping consent records as immutable entries and surfacing audit-ready exports in one click.<sup data-disclaimer-id=\"22\" data-disclaimer-index=\"1\">1<\/sup><\/p>\n<figure style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/cdn.aigrowthmarketer.co\/1779337911454-8c3a9645d906.png\" alt=\"Screenshot of Plura\u2019s fully compliant AI communications platform showing business registration and phone number provisioning workflows for AI Voice, SMS, RCS, and Webchat communication automation.\" style=\"max-height: 500px\" loading=\"lazy\"><figcaption><em>Plura\u2019s FCC-licensed AI communications platform simplifies compliant business registration and phone number provisioning for AI Voice, SMS, RCS, and Webchat workflows.<\/em><\/figcaption><\/figure>\n<p>The query below produces a CSV-ready export of every unsubscribe and spam-related subscription event with the fields regulators and legal teams typically request.<\/p>\n<pre><code>COPY ( SELECT e.customer_token, e.event_type, e.campaign_id, e.agent_id, e.event_id, to_timestamp(e.ingested_at_ms \/ 1000.0) AT TIME ZONE 'UTC' AS event_timestamp_utc, e.raw_payload-&gt;&gt;'senderPhoneNumber' AS phone_e164, c.last_channel, c.last_event_type AS current_consent_state FROM rcs_events e JOIN conversations c ON c.customer_token = e.customer_token WHERE e.event_type IN ('UNSUBSCRIBE', 'SUBSCRIBE') AND e.ingested_at_ms BETWEEN EXTRACT(EPOCH FROM :start_date) * 1000 AND EXTRACT(EPOCH FROM :end_date) * 1000 ORDER BY e.ingested_at_ms ASC ) TO '\/tmp\/rcs_consent_audit.csv' CSV HEADER; <\/code><\/pre>\n<p><strong>Decision criteria:<\/strong> Export both <code>UNSUBSCRIBE<\/code> and <code>SUBSCRIBE<\/code> events. A resubscribe after an opt-out is a material fact in many consent audits, and the <code>current_consent_state<\/code> column from the conversations table shows the net consent status at export time.<\/p>\n<p><strong>Common failure modes:<\/strong> Exporting only summary counts rather than event-level records often fails to satisfy audit requests. Regulators and legal counsel typically look for the individual event timestamp, the phone number in E.164 format, and the originating campaign ID for each opt-out record.<\/p>\n<p><a href=\"https:\/\/plura.ai\/pricing\" target=\"_blank\"><strong>Check which plan includes compliance exports<\/strong><\/a>. Audit-trail features are available on select tiers.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>What prerequisites does an operator need before capturing RCS Business Messaging webhooks?<\/h3>\n<p>Three items must be in place before the first webhook fires. First, the RBM agent must be registered and launched through the Google Business Communications console, because an agent in PENDING or REJECTED state does not deliver events.<\/p>\n<p>Second, the webhook endpoint must be publicly reachable over HTTPS with a valid certificate from a public certificate authority. Third, the operator needs a mechanism to resolve the phone number in each event payload back to a CRM contact record so events do not accumulate with no CRM object to attach to, which would break funnel-stage attribution.<\/p>\n<h3>How does Plura&#8217;s Stateful Conversation Database differ from storing RCS events in a standard CRM?<\/h3>\n<p>A standard CRM stores records per object type such as contacts, deals, and activities. It does not natively hold the sequential, cross-channel event stream that RCS analytics requires.<\/p>\n<p>Unlike a standard CRM that organizes data by object, the Stateful Conversation Database described in Step 3 holds the full sequential event stream for each customer token. An RCS read event sits in the same record as prior voice and SMS interactions, which gives the AI agent complete context on the next call.<\/p>\n<p>A CRM alone cannot provide that level of context without custom middleware that most operators do not have the engineering capacity to build and maintain.<\/p>\n<h3>What is the difference between a DELIVERED event and a READ event in RCS analytics?<\/h3>\n<p>A DELIVERED event confirms the message reached the recipient&#8217;s device. A READ event confirms the recipient opened or acknowledged the message.<\/p>\n<p>The gap between delivery rate and read rate is one of the most actionable metrics in RCS analytics because it separates notification fatigue from delivery infrastructure problems. A high delivery rate paired with a low read rate points to message timing, sender identity, or content relevance issues. A low delivery rate points to carrier coverage gaps or device compatibility.<\/p>\n<p>Tracking both events separately, as the Google RBM webhook payload structure supports, is the only reliable way to distinguish between these failure modes.<\/p>\n<h3>How should operators handle UNSUBSCRIBE events to support TCPA and DNC compliance posture?<\/h3>\n<p>When Google&#8217;s RBM platform fires an UNSUBSCRIBE event, the operator&#8217;s system updates the customer&#8217;s consent state in the Stateful Conversation Database and suppresses that phone number from all outbound channels, not just RCS. TCPA and DNC frameworks describe expectations across multiple channels, so an opt-out received on one channel is relevant across the full communication stack.<\/p>\n<p>Plura supports compliance by timestamping these events as immutable records and making them available for export with the event ID, phone number, campaign ID, and UTC timestamp that audit reviews typically request. Operators should consult qualified legal counsel regarding their specific obligations under applicable TCPA and DNC rules.<sup data-disclaimer-id=\"23\" data-disclaimer-index=\"2\">2<\/sup><\/p>\n<h3>What agent reputation thresholds should trigger an operational review?<\/h3>\n<p>As noted in Step 5, elevated spam and unsubscribe rates can lead to agent suspension. Operators should monitor these rates in real time and treat threshold breaches as early-warning signals that warrant immediate campaign review.<\/p>\n<p>Plura dashboards surface these rates per campaign and per agent ID in real time so operations teams can pause a campaign if needed. Agent lifecycle events should be ingested alongside user events so the dashboard reflects the full agent health picture.<\/p>\n<h2>Conclusion: Turn Raw RCS Events into Audit-Ready Attribution<\/h2>\n<p>The six-step sequence above moves RCS Business Messaging analytics from raw webhook noise to a structured, audit-ready attribution layer. Step 1 registers a verified endpoint. Step 2 parses and enriches each event with campaign ID and customer token.<\/p>\n<p>Step 3 persists events into a stateful database where every RCS touch inherits prior voice and SMS context. Step 4 maps events to CRM objects across HubSpot, Salesforce, and Zoho through Plura integrations. Step 5 builds dashboards that surface delivery rate, read rate, response rate, unsubscribe rate, spam rate, and agent reputation in real time. Step 6 exports unsubscribe and consent records with the event-level detail that TCPA and DNC audit reviews often request.<\/p>\n<p>Most operators have pieces of this in place. The gap is the stateful layer that connects RCS events to prior voice and SMS history, and the compliance export that makes those records audit-ready without custom engineering. Plura delivers the complete sequence inside one U.S.-based infrastructure stack, with no third-party CPaaS wrappers and no offshore exposure.<\/p>\n<p><a href=\"https:\/\/www.plura.ai\/plura-webchat\" target=\"_blank\"><strong>Walk through the complete sequence<\/strong><\/a>, and see webhook mapping, stateful event persistence, and compliance export working together on a live account.<\/p>\n<hr data-disclaimer-divider=\"true\">\n<div data-disclaimer-footer=\"true\">\n<p data-disclaimer-id=\"22\" data-disclaimer-type=\"content_based\"><sup data-disclaimer-index=\"1\">1<\/sup> Plura AI maintains SOC 2, HIPAA, ISO, and GDPR posture as part of its platform infrastructure. References to compliance frameworks in this article describe Plura\u2019s platform capabilities and do not constitute a guarantee that any customer using Plura will themselves be compliant with applicable laws or standards. Customers remain solely responsible for their own regulatory obligations, certifications, consent management, recordkeeping, and the claims they make to their own end users. Consult qualified legal counsel for guidance specific to your use case.<\/p>\n<p data-disclaimer-id=\"23\" data-disclaimer-type=\"content_based\"><sup data-disclaimer-index=\"2\">2<\/sup> This article describes regulatory frameworks at a general level and does not constitute legal advice. Laws and regulations vary by jurisdiction, change over time, and apply differently depending on facts and circumstances. Readers should consult qualified legal counsel before making compliance decisions.<\/p>\n<p data-disclaimer-id=\"25\" data-disclaimer-type=\"content_based\"><sup data-disclaimer-index=\"3\">3<\/sup> References to third-party products, services, companies, or research are made for informational and comparative purposes only. Plura AI is not affiliated with, endorsed by, or sponsored by any third party named in this article unless explicitly stated. Trademarks and product names referenced remain the property of their respective owners.<\/p>\n<p data-disclaimer-id=\"21\" data-disclaimer-type=\"fixed\">This article is provided for informational purposes only and reflects Plura AI\u2019s understanding at the time of publication. Product capabilities, integrations, and specifications are subject to change. For the most current information, visit plura.ai.<\/p>\n<p data-disclaimer-id=\"27\" data-disclaimer-type=\"fixed\">This article was produced with the assistance of AI tools and reviewed by Plura AI prior to publication.<\/p>\n<\/div>\n<section data-read-next=\"true\">\n<h2>Read Next<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.plura.ai\/articles\/rcs-bulk-messages-2026\" target=\"_blank\">RCS Bulk Messaging for Regulated Industries: 7-Step Workflow<\/a><\/li>\n<li><a href=\"https:\/\/www.plura.ai\/articles\/rcs-business-messaging-use-cases\" target=\"_blank\">RCS Business Messaging: Use Cases, ROI and How It Works<\/a><\/li>\n<li><a href=\"https:\/\/www.plura.ai\/articles\/how-rcs-outbound-works\" target=\"_blank\">Enterprise RCS Outbound: How It Works Step by Step<\/a><\/li>\n<li><a href=\"https:\/\/www.plura.ai\/articles\/rcs-outbound-customer-engagement\" target=\"_blank\">RCS Outbound for High-Volume Customer Engagement<\/a><\/li>\n<li><a href=\"https:\/\/www.plura.ai\/articles\/rcs-outbound-best-practices-2026\" target=\"_blank\">RCS Outbound Best Practices for Enterprise Operators<\/a><\/li>\n<\/ul>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Capture RCS read receipts, parse webhook events, and build audit-ready dashboards. Plura AI connects every RCS touch to voice and SMS context.<\/p>\n","protected":false},"author":106,"featured_media":309,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-310","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-conversationintelligence"],"_links":{"self":[{"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/posts\/310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/comments?post=310"}],"version-history":[{"count":2,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/posts\/310\/revisions"}],"predecessor-version":[{"id":2248,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/posts\/310\/revisions\/2248"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/media\/309"}],"wp:attachment":[{"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/media?parent=310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/categories?post=310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.plura.ai\/articles\/wp-json\/wp\/v2\/tags?post=310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}