Sapior LogoSapior

Drowning in AWS Pearson Payment Failures: The $47K Lesson We Learned During Exam Season

When a global edtech platform's payment pipeline went dark, a support ticket spiral revealed just how deep the AWS-Pearson integration can go. Here’s how we traced the outage with Sapior’s observability stack — and built a monitoring net that never misses a beat.

It started with a single Slack message from our ops lead:

> “Payment gateway is rejecting every subscription attempt for Pearson MyLab.”

The timestamp read 4:47 PM on a Tuesday. Spring midterms were three days away. Our platform, which provisions Pearson course access through AWS-hosted payment microservices, had gone completely deaf to student transactions.

By the time we opened the AWS console, our billing alerts were silent — no spike in payment throttles, no anomalous error rates on the API Gateway. The Pearson integration status page glowed green. Yet support tickets from frantic university admins were piling up.

The spiral no dashboard could see

The first 90 minutes were textbook firefighting. We combed through CloudWatch logs for the payment-authorization Lambda. The function fired correctly, Pearson’s `/payment` endpoint returned `200 OK`, and DynamoDB recorded the order state as `PENDING`. But nothing flowed downstream: no license activation, no confirmation email, no deduction from the student’s AWS marketplace balance.

That’s when we hit the classic AWS-Pearson support wall. Opening a case with AWS Enterprise Support gave us the boilerplate “check your VPC endpoints and IAM policies” response, while Pearson’s developer relations pointed to their API’s `paymentStatus` webhook — which they swore was firing. Yet our SQS queue for payment callbacks remained empty.

We needed a way to trace the asynchronous hop between Pearson’s webhook dispatch and our AWS infrastructure in real time, without stitching together fragments from three different consoles. Sapior gave us that view in under 10 minutes.

Instrumenting the invisible handoff

Sapior’s agent was already deployed across our ECS services and Lambda functions, so we pivoted from log hunting to live traces. The trace map showed Pearson’s outbound webhook hitting our public endpoint successfully — but then the flame graph revealed a cold, hard `AccessDenied` error buried inside the VPC endpoint policy that routed the callback to the internal SQS queue.

> An earlier security hardening push had narrowed the `s3:*` wildcard permissions on the endpoint policy but inadvertently dropped the `sqs:SendMessage` action for the Pearson callback role.

We’d been staring at the wrong layer. The payment authorization worked because it used a different IAM role; the callback failed silently because no CloudWatch alarm was configured for that specific SQS queue’s `NumberOfMessagesSent` metric. The support tickets weren’t a payment issue — they were an observability gap.

Turning support nightmares into a self-healing pipeline

With the endpoint policy fixed, Sapior’s live trace instantly lit up with successful callback deliveries. But we didn’t stop there. We codified the entire learning into a three-part monitoring guardrail:

1. Real-time anomaly detection on queue throughput

Using Sapior’s managed alerts, we bound a dynamic threshold on the queue’s message volume. If the rolling 5-minute count drops below 10 messages during business hours, Opsgenie triggers an on-call page before a single student notices.

2. Deep-link tracing for support handoffs

Every payment transaction now gets a Sapior-generated trace ID injected into the Pearson API request header. When a university admin submits a ticket, support engineers can paste the ID into Sapior’s trace view and see the exact failure point — zero back-and-forth with AWS or Pearson.

3. Progressive IAM policy validation

We embedded Sapior’s trace comparison into our CI pipeline. Any Terraform change that modifies the VPC endpoint policy spins up a canary test that sends a synthetic Pearson callback and verifies the full path in the build stage, blocking deploy on a permission regression.

The real cost of fragmented tooling

The three-hour outage cost us roughly $47,000 in chargebacks and lost course-access revenue — but the deeper wound was the trust erosion with institutions relying on instant access during exams. What we learned isn’t unique to Pearson. Any SaaS that stitches together AWS services, third‑party payment processors, and opaque vendor APIs lives at risk of the “green board, dead pipe” paradox.

Sapior didn’t just show us the `AccessDenied` error; it collapsed the mean time to detection from 90 minutes to 4 minutes by giving us a single source of truth across the entire payment event lifecycle. Because when you’re losing money in real time, the last thing you need is to play detective across three support portals.

_This post is based on a true incident; partnership details have been anonymized. If you’re building payment integrations on AWS, explore [Sapior’s Payment Pipeline Observability Guide](https://sapior.com/docs/payment-pipeline) for ready-to-use templates._

AWS Pearson Payment Failure: A Real-World Debugging Case Study | Sapior