Every organization has "that task" someone has to remember to do every week — send the reminder, check the expiring memberships, follow up on abandoned orders.
The pain it solves: Manual, repetitive admin tasks eat time and get forgotten when the responsible person is on vacation or just busy.
How it helps:
The happy workday: The system remembers what a person might forget — automatically, safely, and only once.
Automation reduces the operational burden on staff and reduces the risk of human error (forgotten reminders, missed renewals). Because it is a shared engine rather than one-off scripts, new automation capabilities can be added to any module without duplicating effort.
The engine lives in ExireNexus.Services/Services/Automation/:
AutomationBackgroundService — a BackgroundService (hosted service) that runs on a fixed interval (TimeSpan.FromHours(1) by default), waits 60 seconds on startup to let the app fully initialize, then iterates over all tenants discovered via the Finbuckle multi-tenant store.IAutomationProcessor implementation based on the rule's Module — for example, ShopAutomationProcessor and BookingAutomationProcessor handle shop and booking-specific logic respectively, while sharing the same rule model (AutomationRule in ExireNexus.Shared/Models/Automation).IAutomationProcessor interface, so adding a new module's automation support means implementing one interface and registering it — no changes to the background runner itself.AutomationLog, checked before executing an action, preventing duplicate notifications or actions if a rule is evaluated more than once.ILogger<AutomationBackgroundService>) without stopping processing for other tenants — a fault in one organization's rules can't affect another's.This design replaced earlier module-specific background services (e.g., a dedicated membership automation service) with a single, generic runner — reducing duplicated hosting/scheduling code while keeping each module's business logic isolated in its own processor.