A Messenger bot for the 613parts Facebook page that handles the entire ~5,000-SKU catalog — tire+rim packages, single parts, full job kits — across three fulfillment lanes: free in-store pickup at Belleville or Kingston, $15 flat-rate local drop-off, or free drop-off on tire+rim packages and any order over $300.
Most tire shoppers don't know their bolt pattern. They want to be guided. Messenger turns the awkward "what's my fit?" moment into a 6-tap conversation, with the same staff who'd answer the phone — only faster, after-hours, and traceable to a paid order.
Every script line follows the 613parts voice rules: lowercase-friendly, short sentences, Canadian English, "we" not "I," concrete details, no marketing jargon. The tire+rim path below is one of two intent flows in v2 — for the part-search variant, jump to "The Other Path · Catalog Search" further down. Beats 5-8 are shared between both paths.
The carousel always shows three: best value, popular pick, premium. Driven by DAI rim master joined to live AS400 tire stock at quote time. Tire+rim composites generated nightly for the top 50 packages.
RIM IMAGES · DAI WHEELS CANADA · TIRE IMAGES · BRIDGESTONE + MICHELIN MEDIA · FINAL PACKAGES PULLED FROM DAI MASTER × AS400 STOCK
The tire+rim package flow is one of two intent paths from the welcome screen. The other is a free-text search across the entire ~5,000 SKU catalog — by name, manufacturer SKU, or symptom. Same fitment confirmation, same fulfillment picker, same Stripe pay link.
IMAGES · CARiD CDN · IDENTICAL CARD SCHEMA TO TIRE+RIM PACKAGES · WORKS FOR ANY OF THE ~5,000 CATALOG SKUs
The fulfillment picker fires after fitment is confirmed and pricing is locked. The bot already knows the customer's postal code and order total — so it shows only the relevant options and pre-applies the fee logic. No surprises at checkout.
ManyChat handles the dialog. Our Cloudflare Worker is the brains — it decodes VINs, checks postal codes, queries the package list, and mints Stripe links. DAI master and AS400 stock are pulled nightly. Stripe webhooks unlock the delivery scheduler.
At 2am: pull DAI master from vendor portal export, pull AS400 tire stock as JSON, run package generator. Top 20 vehicles × 3 packages × 2 seasons = ~120 packages cached. Push to ManyChat custom field pkg_lookup_json.
User types VIN → ManyChat sends to Worker → Worker calls vPIC → returns vehicle → user confirms → user picks season + budget → Worker reads cached package list → returns 3 cards → ManyChat renders carousel.
User taps Buy → Worker mints Stripe Checkout Session with metadata {ms_user_id, package_sku, postal} → user pays → Stripe webhook → Worker → ManyChat External Trigger fires confirmation flow → delivery picker.
Eleven named flows in the ManyChat builder. Triggers shown are the events that send a user into each flow. Custom fields prefixed cf_. External Requests prefixed er_ — these hit our Cloudflare Worker.
| Flow ID | Flow Name | Trigger | What it does |
|---|---|---|---|
| f_welcome | Welcome / Greeting | First message, "hi", "hello", emoji, or m.me/613parts ad click | Three quick replies. Routes to f_quote, f_browse, or f_human. |
| f_quote | Tire+Rim Quote Intake | QR "Tire+rim package" or keyword match (winter set, summer set, snows) | Asks fitment path. Routes to f_vin, f_ymm, or f_specs. |
| f_search | Catalog Search · v2 | QR "Find a part" or any free text containing brand/SKU/symptom keywords | Free-text search across the ~5,000 SKU catalog. Hits er_search with the query and (optionally) cf_vehicle. Returns top 3 in-stock matches. Routes to f_results. |
| f_results | Results Carousel · v2 | After f_search returns ≥1 SKU | Generic template carousel of 3 SKUs. Each card: image, brand, MPN, fitment, price, branch with stock. Buy tap routes to f_fulfillment. |
| f_vin | VIN Decode | QR "Type VIN" or 17-char alphanumeric input | Validates 17 chars, hits er_decode_vin, confirms vehicle, sets cf_vehicle. |
| f_ymm | Year/Make/Model | QR "Year/Make/Model" | Cascading QRs: year → make → model → trim. Each level hits er_ymm_options. Sets cf_vehicle. |
| f_postal | Postal Code Capture · v2 soft gate | After cf_vehicle or cf_part_sku set | Free text input. Hits er_zone_check. Sets cf_in_zone=true/false. No longer a hard gate — used to filter the fulfillment picker. |
| f_fulfillment | Fulfillment Picker · v2 | After cart locked (any flow) | Reads cf_in_zone + cf_cart_total + cf_is_tire_package → shows the right lanes. In-zone & (tire pkg OR >$300): Lanes 01+03. In-zone & <$300: Lanes 01+02. Out-of-zone: Lane 01 only. |
| f_match | Use Case + Budget | After f_postal success | Two QR rounds: season, then budget tier. Sets cf_season, cf_budget. Triggers er_match. |
| f_carousel | 3-Package Carousel | er_match returns 3 SKUs | Generic template carousel. Each card: image, title, price, [Buy], [More info], [Compare]. |
| f_pay | Pay Link | QR "Buy" on any carousel card | Hits er_mint_stripe with cf_user, cf_package_sku, cf_postal. Returns URL. Sends as message. |
| f_paid | Payment Confirmed | External Trigger from Stripe webhook (via Worker) | Sends 🎉 + order #. Fires f_schedule. |
| f_schedule | Delivery Scheduler | After f_paid · cf_fulfillment=drop_paid OR drop_free | Hits er_truck_days with cf_postal. Returns 3 dates. QRs to confirm. Writes to Google Calendar with cf_order_number. |
| f_pickup_ready | Pickup Ready · v2 | After f_paid · cf_fulfillment=pickup_belleville OR pickup_kingston · counter staff marks "staged" | Bot fires a follow-up message to the customer: "✅ ready for pickup at [branch]. ask for himmat or any of the counter staff. open mon-fri 8-5, sat 8-2." Uses POST_PURCHASE_UPDATE message tag (allowed outside 24h window). |
| f_human | Human Handoff | QR "Talk to human", keywords (preet, himmat, install, warranty, TPMS, financing), 2 failed parses | Pauses bot for that user. Notifies Page Inbox. Counter staff sees full convo, replies natively. |
Without ads, the bot has no traffic. The Click-to-Messenger ad type opens the conversation directly with our welcome flow pre-loaded. Targeting a 25 km radius around Belleville and Kingston, vehicle owners 25-65, ad budget $20-30/day during tire season (Sept-Nov, then Apr-May).
v1 is built end-to-end inside ManyChat with Cloudflare Worker as the API layer. No frontend code on 613parts.ca needed. After live, we tune the carousel, expand the vehicle list, and decide whether to graduate to a custom Messenger Platform integration.
Repo at github.com/613parts/messenger-bot. Worker has 6 endpoints: /decode-vin, /zone-check, /match-packages, /mint-stripe, /stripe-webhook, /truck-days.
Get a CSV/XML export from DAI vendor portal — confirm format with rep. Cron job at 2am UTC: download → parse → upload to Cloudflare R2 as dai-rims-latest.json.
Same nightly pattern as the existing catalog architecture. Tire-specific query may be a new view. Output: as400-tires-stock-latest.json with per-branch counts.
Cron at 3am: read DAI rims + AS400 full catalog stock + fitment table. Output two artifacts: packages-latest.json (3 tire+rim packages × top 20 vehicles × 2 seasons) AND catalog-search-latest.json (FlexSearch index of every in-stock SKU joined to fitment data). Search index drives the f_search flow.
Subscribe to ManyChat Pro ($15/mo). Connect 613parts FB Page. Build the 12 flows from the table above. Wire External Requests to Worker endpoints. Set persistent menu.
Stripe account in CAD with 613parts as merchant. Webhook to Worker. Truck day calendar wired to Google Calendar. Postal-code-to-route logic confirmed with dispatch.
Civic, F-150, RAV4, Silverado, CR-V. Winter only. No ads yet — push organically to FB Page audience and email list. Goal: 20 conversations, 5 paid orders to validate flow.
Click-to-Messenger ads at $20/day. Expand vehicle list to top 20. Add summer/all-season packages. Daily digest email to Preet showing funnel + revenue + open conversations.
Each question has a default answer the team will use if no other input. None are blockers — work can start in parallel — but the answers will shape the bot's voice, scope, and unit economics.