Pasley Hill / Redline Specs
← All projects QUICK WIN — BUILD NOW

Merchandising Visitation (Rep & Region) Notifications

Regional Managers spend 15-30 minutes hand-writing each of the 2-3 service-coverage updates they post to their regional Slack channel every week. We draft that message for them — live numbers from Predian, today's route, a weather note — and let them approve & post with one click.

Effort S / M Value High Risk Low Depends on Predian + Route source + Slack

The Problem Today

Every Redline Regional Manager (RM) writes the same kind of message to their regional Slack channel 2-3 times a week. It is a coverage update for the Merchandising Specialists (MS) on their team: a greeting, a weather note, "The Numbers," today's hitlist, and a standing reminder to mark check-in status in Mobiwork. The real example from the source doc looks like this:

Good morning team — chilly start, rain moving in this afternoon, so plan covered areas where you can.

The Numbers
Last Week: $3,003.88  ·  VINs Serviced: 176  ·  Weekly Billing Goal: $20,000

Today's Hitlist: [stores / routes for the day]

Reminder: mark In-Transit → On-Site → Completed in Mobiwork on every stop.

Questions? Tag @help for support.

None of this is hard. It is just tedious, and it is the same shape every time. The RM has to log into the billing view, copy last week's numbers, look up the day's routes, glance at the weather, and then write it all up in their own voice. A "good 15-30 minutes" per message, per the RM's own estimate.

What it actually costs

This is a small per-instance cost that adds up because it repeats forever, across every region, multiple times a week. The math at the low and high ends:

15-30 min
per message, by RM's own estimate
2-3 / wk
messages per region
~1.5 hr
per RM per week (midpoint: 22min × 2.5)
~75 hr/yr
per RM, every year

For a team of, say, 8 RMs that is on the order of 600 RM-hours a year spent retyping numbers and weather. The exact figure scales linearly with headcount — give us the real RM count and we will plug it in — but the point holds at any N: this is recurring manager time spent on assembly, not judgment. The judgment part (does the message read right, anything to flag the team) is a 30-second review, not a 25-minute write-up.

How It Works

A scheduled job assembles a draft for each region on the RM's normal cadence and posts it to a private review thread (or DMs the RM). The RM reads it, edits if needed, and clicks Approve & Post. The bot then publishes the finished message to the team channel as the RM. Human stays in the loop by default; auto-post is an opt-in per region once an RM trusts it.

The four data pulls

Nothing here is invented by the model. The numbers are fetched from systems of record; the LLM only does the writing.

The LLM's job — and only its job

An LLM (Bedrock) takes the fetched facts plus a per-region template and writes the message in that RM's voice. It does not source numbers — those are injected verbatim. The model handles three things humans find tedious but it does well:

Data flow

EventBridge schedule (per region, RM's cadence)
        │
        ▼
   draft-builder Lambda
        ├── Predian API ........ last-week $, VINs serviced, goal %
        ├── Route source ....... today's hitlist for region
        ├── Weather API ........ today's forecast → condition flags
        └── Template store ..... RM voice profile + standing blocks
        │
        ▼
   Bedrock (LLM) — compose message in RM voice from facts + template
        │
        ▼
   Slack: post DRAFT to RM review thread
        │  with buttons: [ Approve & Post ]  [ Edit ]  [ Skip today ]
        ▼
   RM clicks Approve  ──►  Slack interactive callback Lambda
        │
        ▼
   Publish final message to #region-team channel (as / for the RM)
   log: drafted_at, approved_by, edits_made, posted_at

The "Edit" button opens a Slack modal pre-filled with the draft text so the RM can tweak inline and post without leaving Slack. "Skip today" suppresses the post (slow day, off-cadence) and is logged so we learn the real cadence per region rather than guessing it.

Architecture & Stack

Deliberately boring and cheap. A scheduled Lambda that fans out per region, a second Lambda for the Slack interaction callback, and a small template store. No always-on compute, no database to speak of beyond a log and the per-region template config.

AWS Lambda (scheduled draft-builder) EventBridge Scheduler Predian API Weather API Amazon Bedrock (LLM) Slack API + Interactivity (buttons/modals) Lambda (interaction callback) DynamoDB (templates + post log) Secrets Manager CloudWatch

Why this shape

The work is event-driven and infrequent — a few invocations per region per week. Lambda + EventBridge means we pay essentially nothing between runs and there is no server to patch. Bedrock keeps the LLM call inside Redline's AWS account so message content and past-message voice samples never leave the boundary.

Template store

Per region: channel ID, RM identity, posting cadence, voice samples, standing blocks (Mobiwork reminder, @help tag), weather phrasing rules, and an auto-post on/off flag. Plain JSON in DynamoDB — editable without a redeploy.

Build Plan

This is a fast build because each piece is small and the failure mode is benign (a bad draft is caught by the RM, not posted blindly). Most of the calendar time is wiring credentials and getting the voice right, not code.

Phase 1 — Data pulls + dry-run draft
~3-4 days · a printed draft per region, no Slack yet

Wire Predian (numbers), the route source (hitlist), and the weather API. Build the draft-builder Lambda and the first template. Output drafts to a log so RMs can eyeball them against what they would have written. No posting, no buttons — just proving the facts are right.

Phase 2 — Voice + weather rules
~2-3 days · drafts that sound like the RM

Seed per-RM voice samples, tune the Bedrock prompt, and encode the weather-conditional phrasing. Iterate with one or two friendly RMs until they say "yeah, that's basically what I'd send."

Phase 3 — Slack approve & post
~3 days · one-click human-in-the-loop flow live

Post drafts to a review thread with Approve / Edit / Skip buttons, the edit modal, and the interaction callback that publishes to the team channel. Per-region channel routing and the post log.

Phase 4 — Pilot, then roll out
~1 week elapsed (mostly waiting on real use)

Run with 2-3 regions for a week of real cadence. Measure edit rate and time saved. Once an RM's edit rate is near zero, offer them the auto-post flag. Then onboard remaining regions — onboarding is just adding a template row.

ESTIMATE Roughly 2-3 weeks of build to a piloted, human-in-the-loop system, AI-assisted-dev pace. The honest constraint is RM feedback cycles on voice, not engineering.

Data & Access Needed

Everything below already exists at Redline — this build connects to it, it does not create new systems of record. The gating items are read access to Predian and a clean way to read today's routes.

SourceWhat we needUsed for
PredianRead API / export for last-week billing, VINs serviced, weekly goal — per region"The Numbers" block
Route sourceToday's stores/routes per region (Mobiwork export now; route engine later)Today's hitlist
Weather APIAPI key; one representative location (metro/zip) per regionWeather note + conditional guidance
SlackApp with chat:write, channels list, interactivity enabled; per-region channel IDs; RM user IDsPost drafts, buttons, publish final
Voice samples5-10 recent real messages per RMTone matching in the LLM prompt
BedrockModel access enabled in Redline's AWS account/regionDraft composition
Config (from RMs)Cadence per region, standing reminder text, the @help target, auto-post preferenceTemplate store

Risks & Open Questions

RISK The numbers must be exactly right. An RM posting a wrong billing figure to their whole team is worse than them spending the 20 minutes. Mitigation: numbers are injected verbatim (the model never computes or paraphrases them), and the human-in-the-loop review is the safety net. We do not enable auto-post until an RM has watched the drafts be correct for a real stretch.
RISK Route/hitlist source is the soft spot. Predian billing is structured; "today's hitlist" currently lives in Mobiwork, which we also want to replace. If reading the daily route from Mobiwork is painful, the hitlist line may need a manual paste in v1 while the route engine matures. Everything else still auto-fills.
OPEN QUESTION What is the real RM headcount and per-region cadence? The time-savings math is linear in both. We have used 8 RMs × 2.5 msgs/wk as a placeholder; confirm and we will state the exact annual hours.
OPEN QUESTION Do RMs want the bot to post as them, or as a clearly-labeled assistant ("Coverage Update")? Posting-as-RM reads more natural; posting-as-bot is more honest about authorship. RM preference, decided per region.
OPEN QUESTION Predian's "weekly goal" — is it a flat $20k everywhere or does it vary by region/season? Affects whether the goal is config or a fetched field.

Cost to Own

This is the rare build where run cost is genuinely negligible and the maintenance story is mostly "leave it alone."

RUN COST A handful of Lambda invocations and Bedrock calls per region per week. Even at 8 regions × 3 messages, that is a couple hundred LLM calls a month plus trivial Lambda/EventBridge usage and a weather API key. Realistically a few dollars a month in AWS + Bedrock, well under $20/mo for the weather API tier. This is not where money goes.

The real maintenance

BOTTOM LINE Low to build, near-zero to run, and it pays back on day one in returned RM time. The dependency to watch is the Predian + route-source contract, not the cost. Strong QUICK WIN.