Armakuni Contact us
← All case studies

In SMS marketing, timing is the product.
The data arrived when someone remembered to upload it.

A U.S. SMS marketing platform for restaurants and retailers ran its campaigns on customer lists exported from point-of-sale systems and uploaded by hand, with a custom connector for every new system. We built the path from a POS order event straight to campaign rules, one shared integration layer, recommendations from Amazon Personalize and reporting marketing can read itself. AWS funding covered the $54,000 build, so the customer paid nothing.

Before

The message fired after the moment had passed.

Every system was its own project.

After
0manual CSV uploads, where campaigns used to wait on them
1endpoint for every connected system

The message fired after the moment had passed

The platform helps restaurants and retail businesses reach customers by SMS, triggered by what they actually bought. But the purchase data behind a timely offer often arrived as a CSV: someone exported a file from the POS, formatted it and uploaded it, and no campaign could run until they had, by which time a message about the order was hours late and read as noise.

Phone orders and online orders were handled separately. Missed calls triggered automatic texts, but that information never fed back into targeting.

Every system was its own project

Connecting to Adora looked nothing like connecting to Clover or Shopify, and each was a custom API with its own logic and its own ways of failing. Data arrived in inconsistent CSV formats, so validation was manual for every new restaurant. And the campaign system couldn't turn a customer's order history into a relevant suggestion: upsell messages were generic, and nobody could easily see which campaigns worked.

Let the order trigger the campaign

The fix was to make orders into events. Every connected system writes the same kind of event to the same place, the pipeline validates and enriches it, and the campaign rules decide what to send, with a recommendation in hand.

How we built it

5 decisions, in the order we made them. Each one says what we did and why, with what it did drawn beside it.

  1. Map the flows before rebuilding them
  2. One event schema for every point-of-sale system
  3. An integration layer for everyone else
  4. Personalize ranks the products; the campaign rules choose the message
  5. Reporting marketing can read

Map the flows before rebuilding them

Built withQuickSight
Every route, till to message Point of sale1Events2Campaigns3Messages4 then rebuild, in order
The engineering

A three-to-four-week assessment documented every existing POS data flow, voice-order handling, manual upload process and campaign trigger, in technical workshops with the customer's engineers. It produced the event payload design and the target architecture, assessed whether non-technical users could question event logs and recommendation outcomes with QuickSight Q, and logged every dependency, integration risk and an AWS usage estimate for production traffic.

One event schema for every point-of-sale system

Built withAPI GatewayShopifyStep FunctionsLambdaS3EventBridge
POS system 1POS system 2POS system 3 One schema
The engineering
  • API Gateway provides an endpoint for order and customer events, with payloads designed around systems such as Adora, Clover and Shopify.
  • A shared event schema gives downstream processing a consistent structure, while source-specific integration handles the differences at the edge.
  • Step Functions coordinates validation, enrichment and routing, and Lambda applies business rules and sends campaign instructions to the existing SMS platform.
  • S3 and EventBridge support the event-driven pipeline, and CloudWatch shows latency and errors by source and processing stage, so a failure surfaces in minutes.

With every system speaking the same event, adding the next POS is configuration.

An integration layer for everyone else

Built withShopifySalesforceS3CloudWatch
Any other systemOne integration layerInto the same events
The engineering

A reusable HTTP integration layer, sometimes called the platform's MCP layer, exposes one endpoint with a defined JSON schema for orders, subscriptions and cancellations, from systems such as Shopify and Salesforce. Mock payloads and event-injection tools, with mock data and configuration in S3, let integration flows be exercised in an isolated environment before they're connected to production, and CloudWatch logs every request and response for tracing.

Personalize ranks the products; the campaign rules choose the message

Built withPersonalizeLambdaCloudWatch
Personalize ranks the productsCampaign rules chooseThe message goes out
The engineering

Amazon Personalize uses user, item and interaction datasets prepared from order history. In the test environment, a Personalize Campaign supplies inference through an API that accepts order context and returns ranked suggestions as structured JSON, which the platform can use directly. Lambda handles validation errors and fallback behavior around the recommendation call, and CloudWatch records endpoint use and latency. Campaign rules decide which SMS instruction is sent, so the recommendation informs the message rather than writing it unchecked.

Why: a ranking with a fallback is safe in front of customers, and one without breaks the campaign the first time the endpoint is slow.

Reporting marketing can read

Built withGlueS3AthenaQuickSight
One board CampaignsSegmentsTrends reporting marketing can read
The engineering

For reporting, AWS Glue cleans and transforms campaign and customer data into curated S3 datasets, and Athena views feed QuickSight dashboards for campaign performance, segmentation, trends and churn signals. Row-level security limits what each audience sees.

One order, end to end

  1. Take an example: a customer orders a large pizza at a restaurant that uses Clover.
  2. Clover sends the order event to API Gateway, in the shared schema.
  3. Step Functions validates and enriches it, attaching the customer's order history.
  4. Personalize returns ranked suggestions, such as a side or a drink that customers like this one often add.
  5. The campaign rules pick the message, and Lambda sends the instruction to the SMS platform while the order is still fresh.
  6. The send and its result reach QuickSight, so marketing can see whether the campaign worked.

What we'd tell another CTO

1Turn files into events, so a campaign fires on the order and not on someone's upload, and standardize at the edge, with one schema inside and each system's differences handled where it connects. Mock events injected in isolation catch a broken partner integration before production does.
2Wrap the recommendation in rules and a fallback, so the model suggests and the rules decide. Then report on outcomes, because what matters is whether the message worked.

What else changed

  • Item-level recommendations from Amazon Personalize, tested with ranked JSON suggestions and fallback handling.
  • Dashboards for campaign performance and segmentation, for marketing and leadership.
  • A $54,000 build funded by AWS, after a three-to-four-week assessment, delivered over 10 to 12 weeks, at $0 net cost to the customer.

What comes next

Extending the integration layer to more live systems, and Personalize coverage to the full catalog.

How we'd do it today

This project came before our current offers. Here's how we'd approach the same work now.

Where an AI agent drafts the message itself, each tool it uses would be an MCP server behind Amazon Bedrock AgentCore Gateway, so every call goes through one door and every step is traced, and each AI agent would get its own identity and only the tools it needs. On AK AI Factory, recommendation changes would have to beat a golden set of past orders, with what customers actually added next, and a sealed set nobody tunes to.

For a measurable goal such as add-on conversion, AI agents would run experiments overnight inside the harness, and anything that games the score or breaks a rule, such as messaging outside allowed hours, would be dropped. AK Run's AI agents would take the first look at every pipeline alert, for a named engineer to confirm and ship the fix with a test.

Have a problem like this one?

A free workshop: a few hours with the architects who'd do the work, on your own systems. No cost.

Book a free workshop