Inspiration

Every morning in Paris a baker lights the oven at six and serves without a break

During those hours the phone keeps buzzing with questions

Are you open on Sunday ? Is there any pistachio flan left ? Can I order twenty croissants for Friday ?

At ten when the flan runs out, three people come for it that morning and leave without a word and the baker never learns that they came

Multiply that by every independent shop in a city and you get a huge amount of demand that simply disappears, because the only record of it was a question nobody read

These shops already talk to their customers on WhatsApp and none of them have time to learn a dashboard

What if the agent lived inside the messaging apps the shop and its customers already use and the owner never had to open anything else?

What it does

Vitreen is an agent for the counter of independent shops.

For the owner, everything happens on WhatsApp

She sends one photo of her chalkboard and Claude on Amazon Bedrock reads every product and price (6.8 seconds on our demo chalkboard) and her shop page goes online with pickup ordering and a QR code for the window

She updates it the way she talks, typing "no more croissants" or "flan is 4.50 now" or saying the same thing in a voice note that Amazon Transcribe turns into text

Vitreen tells her what it heard and what changed and she can write "undo" if it got it wrong

New orders arrive with Accept and Decline buttons, then an "Order ready" button that tells the customer the moment it is done

Every Monday at seven an email sent with Amazon SES gives her the week with

  • orders by channel,
  • the products people asked for while they were sold out,
  • the questions she could not answer
  • and one suggestion.

For customers, on whatever channel they prefer

They scan the QR code, which opens WhatsApp with the shop code already typed or they order from the web page with just a phone number

The agent answers only from the shop's own menu and opening hours It never invents a price, an ingredient or an allergen because it passes anything it cannot answer

It takes orders, puts people on a waitlist when a product is sold out and writes to them again

It answers in the customer's language too, in our demo Emma over from London for her mum's birthday, writes in English to a French bakery and gets English back, with the French product names

How we created it

The conversation follows the customer across channels

WhatsApp only accepts free form business messages within 24 hours of the customer's last message, so a waitlist alert sent three days later would be rejected by Meta

Vitreen remembers when the contact last wrote and picks the channel for every notification

  • WhatsApp while the window is open,
  • RCS through AWS End User Messaging,
  • which falls back to SMS on its own when the phone does not support RCS.

Conversations are keyed by phone number rather than by channel, so a customer who answers an RCS message carries on the same conversation with the same history

The same logic protects the owner, if she has been silent for a day, a new order reaches her by text with a prompt to write "orders" on WhatsApp and Vitreen sends every pending order again with its buttons

One agent for every channel

WhatsApp events arrive through the SNS topic set as the event destination of the number

RCS and SMS replies arrive through the two way SNS topic of the RCS agent. RCS and SMS share the same payload format, so a single Lambda function normalises everything into one message shape (src/lib/events.mjs) and src/lib/channels.mjs decides how each answer goes out

The customer agent uses the Bedrock Converse API with tool use, it has three tools: place_order, notify_when_available and pass_question_to_shop

Prices and product ids come only from the stored menu, so an order can only contain products that exist and are available

Where each AWS service is called

  • AWS End User Messaging Social: @aws-sdk/client-socialmessaging with SendWhatsAppMessage for text and interactive buttons and GetWhatsAppMessageMedia to store photos and voice notes in S3
  • AWS End User Messaging: @aws-sdk/client-pinpoint-sms-voice-v2 with SendTextMessage through the RCS agent, plus CreateVerifiedDestinationNumber so judges can register themselves as RCS testers
  • Amazon SES: @aws-sdk/client-sesv2 for web order receipts and the Monday report, signed with DKIM
  • Amazon Bedrock: Claude Sonnet 4.5 through the EU inference profile, for reading photos, editing menus, the customer agent and the weekly insights
  • Amazon Transcribe for voice notes
  • Lambda, SNS, SQS, DynamoDB, S3, EventBridge Scheduler, CloudWatch and X-Ray, all in one SAM template in eu-north-1

Made to run safely

Every inbound message id is claimed with a conditional write, a retried webhook never produces a second reply

Order states move through conditional updates and only the owner of a shop can accept its orders

Web orders have a size limit, a honeypot field and a ceiling of 30 orders per shop every 10 minutes

The pages are served with a strict Content Security Policy that allows no scripts at all

Failed events go to a dead letter queue and three CloudWatch alarms watch agent errors, page errors and that queue

All data stays in Stockholm, conversations expire after 30 days and demand records after 90

npm test runs 39 tests with mocked AWS clients that follow the owner and the customer from start to finish

Challenges we ran into

The 24 hour WhatsApp window. Our first version sent waitlist alerts on WhatsApp and Meta rejected every one sent after a day, that problem is what pushed us to RCS and SMS and now it's the most useful part of the design :)

Letting judges try RCS. Our RCS agent is in testing, so only registered devices receive its messages. We didn't want to ask judges to email us so we added a command: write RCS on WhatsApp, Vitreen registers your number as a tester, you tap "Make me a tester" and the conversation moves to RCS

Language. In early tests the agent answered an English question in French because the menu was French, a precise rule in the system prompt fixed it and we now test that Emma gets English

Phone numbers. WhatsApp gives numbers without a plus and the SendWhatsAppMessage API expects one, we normalise every recipient to the plus format before sending

Accomplishments that we're proud of

We actually got to test Vitreen with a real bakery! The owner sent a photo of her chalkboard, her page was online in under a minute and she ran it from WhatsApp!

Judges can message it, order a croissant and move the conversation to RCS without installing anything or paying anything

We’ve seen the enthusiasm around Vitreen and we’re really excited to keep developing it!

What we learned

The most interesting part of CDS for a small business is not any single channel but the handover between them

A customer does not care which protocol carries the message, they care that the bakery remembers them and when the flan is back

We also learned how much the owner values a simple sentence over a chart. "Eleven people asked for pistachio flan this week" changes what she bakes on Saturday

What's next for Vitreen

  • WhatsApp payment links for pickup orders
  • A country launch of the RCS agent in France once carriers approve it
  • Message templates approved by Meta for back in stock alerts
  • Opening hours that update themselves from voice notes, such as "closed on Monday for the holidays"
  • Partner with chambers of commerce, bakery and butcher networks and payment providers, where one stack serves every shop in the network

How we used WhatsApp (AWS End User Messaging Social)

WhatsApp is where Vitreen lives

The owner creates and runs her shop entirely from WhatsApp with photos of the menu, text or voice edits

  • Accept, Decline and Order ready buttons and commands like "orders"/"report"/"undo"

Customers reach the shop on WhatsApp through a QR code in the window and the agent answers them, takes orders and manages waitlists

Photos and voice notes are fetched with GetWhatsAppMessageMedia and stored in S3 for Bedrock and Transcribe

All replies go out with SendWhatsAppMessage and when the 24 hour window has closed the same conversation continues on RCS or SMS through AWS End User Messaging

A word for the jury

Fifteen people will look at this project and most of you work on the very services it needs to exist, which honestly means more to us than the prize

Marie Carlton, Applied AI Solutions: Vitreen is applied AI for the smallest customers there are, a shop owner with flour on her hands and no IT team

Sara Caleffi, Applied AI Solutions: the agent only speaks from the owner's own menu through tool use, because a made up allergen in a bakery is not a small mistake

Tom Sly, Communication Developer Services: one conversation on WhatsApp, RCS, SMS and email from a single stack is our attempt at what CDS as a backbone can look like for a corner shop

Morgan Pomerantz, Partner BD: we designed it as a partner offer from day one, one stack for a whole network of shops

Yaniv Bossem, Applied AI Partner SA: one SAM template, so a partner team could deploy it for a network of shops in an afternoon

Kathleen Winder, CDS product: the moment the WhatsApp window closes and RCS takes over is the product moment we would most love your opinion on

Jimmy Nimo, CDS software development: every webhook is claimed with a conditional write and we would love to know if we used the APIs the way your team intended

Robert Gray, CDS development: RCS and SMS sharing one two way payload is what let us keep a single Lambda for every channel, thank you for that

Raman Dhillon, CDS go to market: independent shops reached through partners feel like a real market for CDS and the Monday report is what a network would pay for

Medha Karri, CDS product: the self serve RCS tester command came from our own onboarding pain and any thoughts on RCS onboarding are very welcome

Matt Burdick, CDS product: SMS fallback inside RCS means the baker reaches everyone without ever hearing the word RCS

Alexis Perry, CDS go to market: chambers of commerce, bakery networks and payment providers are the partners we picture selling this

Zip Zieper, Applied AI SA for CDS: Converse with tool use plus Transcribe for voice notes and we would be curious how you would push the agent further

Puneet Badlani, Applied AI Partner SA: every function only gets the actions it calls, scoped to its number, domain, table and bucket

Sandeep Akhouri, GenAI: this is GenAI grounded in a two line chalkboard and we think that small kind of trust is what shops need

Thank you for reading this far :)

Built With

Share this project:

Updates

Submission history