Data Sources → Business Systems

ERP / Billing

Billing status, invoices, and subscription/contract data — ties financial reality to the customer profile.

High-Level Design

ERP/Billing system → .NET Core Connector on Azure → downstream activation.

Business System
ERP / Billing
Invoices, payment status, contract terms
→
Ingestion
.NET Core ERP/Billing Connector
SAP/NetSuite/Stripe API → Cxos.Ingestion.Client
→
Processing
.NET Core Batch Worker
Invoice/payment normalization
→
Foundation
Data Lakehouse
Billing history per account
→
Intelligence
.NET Core Analytics API
Payment-risk scoring, LTV
→
Activation
.NET Core Activation API
Dunning workflows, account-health alerts

💼 Business Context

  • Billing status (past due, at-risk, paid) is a direct churn and revenue-risk signal most CX platforms never see
  • Enables coordinated dunning/collections communication instead of a separate, disconnected finance workflow
  • Owned by Finance / RevOps, shared with Customer Success

🔌 Technical Overview

ERP and billing systems (SAP, NetSuite, Stripe Billing) rarely expose real-time webhooks for every event — a .NET Core batch connector runs on an Azure Functions Timer trigger, pulling invoice and payment status via each system's API and normalizing it through Cxos.Ingestion.Client. Payment-provider webhooks (e.g., Stripe's invoice.payment_failed) are handled in near-real-time by a dedicated Azure Function where available.

Synced Events

invoice_issued payment_succeeded payment_failed subscription_renewed account_past_due

💾 Sample Billing Event

{
  "event": "payment_failed",
  "event_id": "a7d2e9f1-4c8b-4d3a-9e1f-6a2c8d0b7f34",
  "timestamp": "2026-08-01T03:15:00Z",
  "user_id": "cust_004821",
  "context": { "channel": "billing", "platform": "stripe" },
  "properties": { "invoice_id": "inv_9931", "amount_due": 4999, "currency": "INR", "attempt": 2 }
}

🔗 Integration Points

  • .NET Core batch connector (Azure Functions Timer) for ERP/billing systems without full webhook coverage
  • Stripe/payment-provider webhooks (near-real-time) via a dedicated Azure Function
  • Cxos.Ingestion.Client NuGet package
  • Activation API — triggers dunning email/SMS sequences and account-health alerts to Customer Success

🧰 Services Consumed

  • Owning microservice — Cxos.Connectors.ErpBilling (see the Full Application Service Map)
  • No dedicated database — stateless connector (see Platform Connectors above)

⚠️ Non-Functional Considerations

  • Scale: account/invoice volume is modest relative to behavioral events; batch sync is sufficient for most fields
  • Latency: payment-failure events benefit from near-real-time handling to trigger timely dunning communication
  • Reliability: batch connector checkpoints the last successfully synced invoice ID for safe resume
  • Security/Privacy: no raw card data is stored — only tokenized payment status and invoice metadata cross the ingestion boundary, access-controlled via Azure AD

🎯 Enterprise Example

A SaaS company's Stripe webhook fires invoice.payment_failed; the Activation API triggers a dunning email within minutes and flags the account as at-risk in the Customer Success dashboard — cutting involuntary churn from failed payments by 25% after the coordinated dunning + CS outreach workflow launched.

← Back to Business Systems