Trigger Ideas — Business Events (Human-Seeded)
These triggers are based on tenant-specific events that the platform can partially detect or that the DM/client seeds manually. They require a small amount of human input but are then mostly automatic from there.
13. Business Anniversary
Signal: The tenant’s founding date — derived from Tenant.createdAt (the date they joined Leadmetrics) or from a new optional Tenant.foundedYear field — matches the current month and day.
Post angle: “We’ve been in business for [N] years. Here’s the most important thing we’ve learned.” Reflective, narrative, founder-voice content. Alternates could be: “N years of [core value]”, “[Year] things we got wrong and fixed”, “A letter to our first customer.”
Why it works: Anniversary posts consistently outperform standard promotional content. They invite customers to share the moment (“I’ve been with you since year 1!”), trigger nostalgia, and give the brand permission to be human and reflective rather than always selling. They’re also evergreen — every year the milestone gets bigger.
Automation level: Fully automatic on detection. Fires 7 days ahead (more lead time than a holiday, because the brand may want to write something personal rather than use the AI draft).
Dedup window: Once per year (same month/day annually).
Data source: Tenant.createdAt (already in DB — no new model required for the basic version). Optional enhancement: add Tenant.foundingYear Int? field for businesses that predate their Leadmetrics account.
Implementation sketch:
- New scheduler handler
business-anniversary.ts— runs daily - Query all tenants where
EXTRACT(MONTH FROM createdAt) = currentMonth AND EXTRACT(DAY FROM createdAt) = currentDay + 7 - Calculate years in business:
currentYear - createdAt.year - Surface 7 days ahead in DM portal “Upcoming moments” section + dashboard widget
- Writer context: tenant name, years in business, industry, founding date, brand voice → reflective/milestone tone
contentType: "business_anniversary"in social-post-writer- If
foundingYearexists and differs fromcreatedAt.year, usefoundingYearfor the count instead
SCENE_MAP entry (business_anniversary):
“Milestone celebration graphic — bold year number as hero, warm celebratory palette, timeline or journey motif, brand colours, professional and proud — balances achievement with gratitude”
14. New Location or Market Expansion
Signal: A new Google Business Profile location is connected by the tenant (a ConnectedChannel of type google_business_profile is created where a previous one already exists — indicating a second or third location); OR the DM manually enters a location opening date via a Scheduled Announcement.
Post angle: “We’re now serving [City/Region]! — here’s what we’re bringing to [location].” Localised announcement post. For the new location’s audience: what services are available, who the team is, how to find them. For the existing audience: proof of growth and expansion.
Automation level: Semi-automatic on GBP new-location detection; manual entry for announcement scheduling.
Dedup window: Once per new GBP location connection (not annually repeating).
Data source: ConnectedChannel creation event for GBP type; or a new ScheduledAnnouncement model.
Implementation sketch — automatic GBP path:
- Hook into the GBP OAuth connection flow (
POST /tenant/v1/channels/connect) - If tenant already has an existing active GBP channel and a second is connected: fire a “new location” trigger
- Extract location name and address from GBP API on connection
- Writer context: existing location(s), new location name/city, services offered → proud expansion announcement
contentType: "new_location"in social-post-writer
Implementation sketch — manual Scheduled Announcement path: This is the more general version. Requires a new DB model:
model ScheduledAnnouncement {
id String @id @default(cuid())
tenantId String
tenant Tenant @relation(fields: [tenantId], references: [id])
title String
type String // "location_opening" | "product_launch" | "partnership" | "award" | "event"
details String?
announceAt DateTime // when to trigger the post suggestion
platforms String[]
isTriggered Boolean @default(false)
createdAt DateTime @default(now())
}- DM enters announcement details in a new
/system/announcementsmanage page or in the tenant detail page - Scheduler checks daily for
announceAt = today + 4 days - Writer receives: title, type, details → announcement/news tone per type
SCENE_MAP entry (new_location):
“Location announcement graphic — map pin or building motif, location name as headline, clean and welcoming palette, local feel without losing brand consistency”
15. Product or Service Launch
Signal: DM or client enters a product/service launch date via the Scheduled Announcement model (type: product_launch); OR the website crawler detects a new /products/ or /services/ page on the tenant’s website that didn’t exist in the previous crawl.
Post angle: A 3-post announcement series across the platforms the tenant is active on:
- Teaser (7 days before): “Something big is coming on [date] — here’s a hint…” (curiosity-driver)
- Launch day: “Introducing [Product Name] — [one-line value proposition]” (announcement)
- Follow-up (3 days after): “Here’s what early customers are saying about [Product]” or “3 things you didn’t know about [Product]” (depth/social proof)
Why it works: Most brands announce a product once and move on. A 3-post series creates a launch event around the product, builds anticipation, and gives the content team a structure without having to plan from scratch each time.
Automation level: Needs human input for the product name, launch date, and key details. Automatic generation of the 3-post series from that input.
Dedup window: N/A — each product launch is a unique event (tracked by ScheduledAnnouncement.id).
Data source: ScheduledAnnouncement model (type: product_launch); optional: website crawler delta detection for new product pages.
Implementation sketch:
- Scheduler fires for the teaser 7 days ahead (tease post), on launch day (announcement post), and 3 days after (follow-up post)
- All three posts are enqueued at the first trigger (7 days ahead) with
dueDateset accordingly - Writer receives: product name, key features (from DM-entered details), target audience, launch date → generates all 3 variants in one pass
- Each post is a separate
SocialPost+Activitygoing through the normal dm_review → client_review flow contentType: "product_launch"in social-post-writer (switch on post number: 1=teaser, 2=announcement, 3=follow-up)
Website crawler auto-detection path (optional enhancement):
- Compare current
WebPagecrawl results against previous crawl - If a new page matching
/product*/or/service*/patterns appears: flag as potential product launch - Surface to DM: “New page detected: [URL] — want to create an announcement post?”
- DM fills in details → same 3-post flow
SCENE_MAP entries:
product_launch_teaser: Mystery/curiosity graphic — blurred or partially revealed product, anticipation-building, bold countdown or “Coming [date]” textproduct_launch_announce: Clean product hero shot or feature graphic, brand colours prominent, product name as headline, confidence-forwardproduct_launch_followup: Social proof / testimonial graphic, quote card style or feature deep-dive, warm and informative