Inspiration

Almost everyone has paid for a subscription they forgot about. A free trial quietly turns into a paid plan, a streaming service raises its price by two dollars, or the same food order gets charged twice. Each one is small, so nobody notices, but together they add up to hundreds of dollars a year.

Banking apps show you transactions. They don't tell you what's recurring, what changed, or what you should cancel. We wanted a guard that watches your money for you and answers the question people actually have: "What am I paying for, and what can I stop paying for?" Because this is an Amazon hackathon, we also wanted you to be able to just ask Alexa.

What it does

EchoGuard reads your transactions and turns them into answers:

  • Finds every subscription. Weekly, monthly and yearly charges are detected automatically, even when the bank writes the merchant as NETFLIX.COM one month and NETFLIX*ABC123 the next.
  • Flags what changed. Price hikes (Netflix $15.49 → $17.99), free trials that turned into paid plans, and subscriptions that stopped renewing.
  • Catches suspicious charges. Duplicate charges within minutes, unusually large purchases for a category, big first-time merchants, and weekly spending spikes. Each one comes with a plain-English reason.
  • Tells you how to save. Overlapping services (Spotify and YouTube Music), price hikes and converted trials. On the demo data it finds $44.47/month, about $533 a year.
  • Helps you actually cancel. Per-service steps, a direct link to the account page, and a ready to send cancellation request. Mark a service "cancelled" and it drops out of your totals, or "keep it" and it's never suggested again.
  • Looks ahead. A 30 day cash forecast and a renewal calendar show what's about to leave your account.
  • Answers questions by chat, by voice in the browser, or through an Alexa skill: "Alexa, ask Money Guard what renews this week."
  • Brings in data by linking a bank (Plaid), importing any bank's CSV export, or pasting a receipt.
  • Reminds you by email three days before a renewal, every day, automatically.

The live demo gives every visitor a private copy, so you can link a test bank, import data or cancel things without affecting anyone else, then hit Reset my demo.

How we built it

EchoGuard is fully serverless on AWS:

  • Frontend: React + Vite, served from a private S3 bucket through Amazon CloudFront (HTTPS).
  • API: API Gateway (HTTP API) in front of a Node.js AWS Lambda function. The same route handlers also run locally under Express, so the whole app works offline for development.
  • Data: a single-table Amazon DynamoDB design: transactions, budgets, user preferences and bank links, all keyed by user.
  • Reminders: an Amazon EventBridge schedule runs a Lambda every morning that publishes renewal, anomaly and budget alerts to Amazon SNS. Filter policies make sure each user only gets their own emails.
  • Voice: an Alexa Skills Kit custom skill backed by its own Lambda, locked to our skill ID. An in-browser simulator runs the exact same handler, so judges can try it without an Echo.
  • Sign-in: Amazon Cognito Hosted UI with PKCE and a JWT authorizer on the API (switched off for the public demo).
  • Bank sync: Plaid Link with incremental transaction sync.
  • Infrastructure as code: one AWS SAM template and a one-command deploy script.
  • AI, optional: Amazon Bedrock (Claude) and Amazon Textract plug in with a single flag. By default a built-in assistant answers from the user's own analysis, so the whole project runs in the AWS free tier.

The detection logic

Subscriptions. We group charges by a normalized merchant name, compute the gaps between charges, and match the median gap to a cadence (7, 30 or 365 days, with a tolerance). At least 70% of the gaps must agree. Every subscription is then converted to a monthly cost so they can be compared:

$$ \text{monthly} = \begin{cases} a \cdot \frac{52}{12} & \text{weekly} \ a & \text{monthly} \ \frac{a}{12} & \text{yearly} \end{cases} $$

Unusual amounts. Each purchase is compared with its own category's history using a z-score:

$$ z = \frac{x - \mu_{\text{category}}}{\sigma_{\text{category}}} $$

Purchases with $z \ge 2.5$ are flagged, and $z \ge 4$ is marked high severity. That's how a $412 dinner stands out against a $30 average.

Forecast. The next 30 days combine every scheduled renewal $r_i$ with everyday spending at the recent daily rate $\bar{d}$ (90 days of non-recurring purchases, with the largest 2% left out so one splurge doesn't skew it):

$$ F_{30} = \sum_{i \,:\, t_i \le 30} r_i \;+\; 30\,\bar{d} $$

Challenges we ran into

  • Messy merchant names. Banks report the same company in many ways (HULU*LLC, APPLE.COM/BILL). We built a normalizer for grouping and a separate "display name" so the UI and Alexa say Hulu and Apple.
  • Duplicate charges hide behind other purchases. Comparing only neighboring transactions missed doubles with another charge in between, so we switched to a 10-minute sliding window.
  • Credit card payments looked like spending. The first bank sync imported card payments and transfers as purchases, which would double-count everything bought on the card. We now skip transfer and loan-payment categories.
  • A demo that never goes stale. Fixed sample data would make every subscription look "cancelled" a few weeks after the hackathon. The demo history is now generated relative to today on every read.
  • Private demo copies for free. Copying hundreds of transactions per visitor would cost writes. Instead, the demo history lives in Lambda memory and is merged with each visitor's own additions, so isolation costs nothing.
  • Alexa naming rules. Invocation names can't contain wake words like "Echo", so the skill is called Money Guard, while the app keeps the EchoGuard name.
  • Infrastructure surprises. SAM's HTTP API shortcut can't switch the JWT authorizer on and off with a condition, so we rewrote the API with plain CloudFormation resources.
  • Zero budget. Every paid service (Bedrock, Textract, a KMS key for real bank tokens) is opt-in, and a zero-spend AWS budget alarm guards the account.

Accomplishments that we're proud of

  • A complete product, not a mock: live on AWS, with real bank linking (Plaid sandbox), a real Alexa skill, and daily email reminders.
  • It turns "you could save $44/month" into one click, with the steps and the cancellation message ready.
  • Every visitor gets an isolated, resettable demo at $0 running cost.
  • 23 automated tests and CI on every push.

What we learned

  • Most of the value is in plain explanations. A flag is only useful if it says why ("$412 at Nobu is 13.7× your typical Dining purchase").
  • Serverless + single-table DynamoDB keeps a full product inside the free tier.
  • Voice works best with short, specific answers. Alexa responses have to be written for the ear, not the screen.
  • Treat real-world financial data carefully: refunds, pending charges, transfers and card payments all need special handling.

What's next for EchoGuard

  • One-tap cancellation for services that support it, and negotiation tips for cheaper tiers.
  • Shared and family plans, with subscriptions split between people.
  • Smarter anomaly detection that learns from each "not suspicious" click.
  • Publishing the Alexa skill so anyone can enable it.
Share this project:

Updates

Submission history