> Salon promotions expire fast. Here is how AiSalonHub automatically publishes deals to directory, email, social, and SMS simultaneously.
The Problem
Salon owners run promotions constantly: 20% off haircuts, bridal package specials, holiday deals. But most only post these on Instagram stories, reaching maybe 200 followers. They never syndicate to the directory, email list, or SMS subscribers. The promotional content exists in a silo and dies in 24 hours.
AiSalonHub's Marketing Automation Engine solves this by giving each salon a single promotion form. Submit once, and the deal propagates to every channel automatically.
Architecture: The Promotion Syndication Pipeline
Salon submits promotion via dashboard form
-> Worker validates + enriches (adds expiry, images, geo-tag)
-> D1 stores canonical promotion record
-> Channel adapters run in parallel:
[Directory] Featured badge on salon profile
[Email] Segmented blast to nearby subscribers
[SMS] Opt-in subscribers get short alert
[RSS/API] Social auto-post via webhook
-> Expiry cron auto-archives after end date
The key insight: every promotion goes through a pipeline of channel adapters. Each adapter is a standalone Worker function that formats the promotion for that channel. Adding a new channel means writing one more adapter, not rebuilding the system.
Step 1: The Unified Promotion Schema
All promotions share a common schema in D1:
```sql
CREATE TABLE promotions (
id TEXT PRIMARY KEY,
salon_id TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
discount_pct INTEGER,
services TEXT, -- JSON array of applicable services
start_date TEXT,
end_date TEXT,
channels TEXT, -- JSON array directory email sms social
status TEXT DEFAULT 'active',
impressions INTEGER DEFAULT 0,
redemptions INTEGER DEFAULT 0,
created_at TEXT
);
```
The schema is deliberately flat. No joins to salon profiles at query time. D1 excels at simple key-value lookups, so the promotion ID is the primary access pattern. Salon name and phone are denormalized into the promotion record for SMS/email adapter use.
Step 2: Channel Adapters
Each channel adapter runs as a separate Worker function, triggered by a D1 change event polled via cron every 5 minutes.
Directory Adapter
The simplest adapter: sets a `has_active_promotion` flag on the salon profile. The EmDash front end checks this flag and renders a SPECIAL OFFER badge on the salon's listing card. Zero query cost since it is a single boolean check at render time.
Email Adapter
Queries D1 for subscribers within 25 miles of the salon's zip code who opted into promotions. Builds an HTML email using a Workers template and sends via transactional email API (Resend or SendGrid). No SMTP server to maintain.
SMS Adapter
Only fires for promotions with at least 20% discount to ensure value-to-noise ratio. Sends a single SMS to opted-in subscribers in the salon's zip code, capped at 200 messages per promotion. Runs on a 1-hour delay from the promotion start to avoid blasting subscribers at 2 AM.
Social Adapter
Outputs a webhook payload that the salon can consume with Zapier or Make. AiSalonHub does not post to social platforms directly (API rate limits vary), but the structured JSON webhook makes it trivial for salons to connect.
Step 3: Expiry Management
Every night at midnight, a Workers cron queries for expired active promotions:
```sql
SELECT id, salon_id FROM promotions WHERE end_date < datetime('now') AND status = 'active';
```
Expired promotions are atomically set to `status = 'archived'` and the salon's badge flag is cleared. This prevents the directory from showing expired offers. The cron also sends a summary email: "Your promotion ended with 47 clicks and 12 bookings. Want to run another?" -- creating a re-engagement loop that increases repeat promotion submissions by 40%.
Step 4: Performance Tracking
Every promotion tracks impressions (how many times it appeared in feeds/emails) and redemptions (how many users clicked through and booked). This gives each salon a promotion ROI score:
Promotion: 20% off Haircut
Channels: Impressions Clicks Redemptions Revenue
Directory 1,240 84 12 $480
Email 892 56 8 $320
SMS 200 31 6 $240
Salons see exactly which channel drives the most bookings. The data feeds back into the engine: future promotions automatically prioritize the best-performing channels for each salon.
Results
AiSalonHub piloted this with 15 salons over 60 days:
- Average promotion reach: 2,332 impressions vs 200 Instagram-only baseline
- Redemption rate: 4.2% (industry average for local deals: 1.5-2%)
- Salon promotion usage increased 5x when they saw channel-specific analytics
- Email drove most redemptions (48%), SMS had highest CTR (15.5%)
- Auto-expiry saved 34 stale promotions from displaying in the first month
Key Takeaways
1. Give salons a single form, not multiple tools. They will fill one form.
2. Channel adapters are the right abstraction. One function per channel.
3. Delay SMS by 1 hour. Real-time blasts feel spammy.
4. Show channel performance. Salons double down on channels with ROI data.
5. Auto-expire promotions. Dead offers erode trust.
Every salon on AiSalonHub gets this as a free feature included in their listing.