Contact activity, audience segments and scheduled campaign steps in one marketing automation workspace.
This marketing automation software pulls forms, website activity and email history onto one shared contact record. That record became the basis for audience segments, scoring and follow-up campaigns.
Marketers decide what should happen once an enquiry comes in. A campaign can wait for a later reply, or it can treat a stretch of silence as its own trigger. The contact's full history stays on hand.
The challenge
A campaign has to remember that it is waiting. Say a contact has three days to respond. The next step cannot depend on the original form request still running, so progress needs to survive between scheduled jobs.
People can also be identified later. An earlier anonymous visit may matter once a form submission or a tracked link ties it to a known contact.
What we built
The contact model carries custom fields, companies, tags and activity histories. Import and duplicate handling bring in existing lists, and segment filters pick audiences out of that data.
Campaigns are built from actions, decisions and conditions. An action sends a message or runs another task. A decision responds to what the contact just did, and a condition checks the contact's own data. Delays and response windows join these steps into a sequence.
Email can hold translated versions and audience variants, and it reports on how recipients respond. REST APIs and outbound webhooks pass campaign activity to the client's other business systems.
Technical approach
Campaigns take the shape of event trees. Database rows record how far each contact has moved through a campaign. A delayed step gets a future date, set for the contact's own timezone. Separate paths handle new members, scheduled work and contacts who went quiet before a decision window closed.
Segment filters compile down to SQL. Membership is refreshed before matching contacts enter a linked campaign, so the order of the schedule matters. Matching a filter does not by itself send the next email. Operators set how often commands run and how large each batch can be.
Before sending, the standard delivery path checks preferences and frequency rules, and it can hold a message back. Bounces and other email activity flow back into the contact history. An integration that skips those checks must handle delivery itself.
Symfony event subscribers let extra campaign actions, forms and reporting reuse the model that is already there.
Project success
The client can read a contact's activity and see which campaign step it has reached. A follow-up can pick up again after a reply, or after its waiting period runs out, working from the stored progress. Audience selection, scheduling and sending stay separate stages, each with rules the team can see. Marketers and operators then have a clear place to adjust the process.
Technology stack
Backend
PHP, Symfony
Persistence
Doctrine, MySQL or MariaDB
Interface
Twig, visual page and email editors
Integration
REST, OAuth2, outbound webhooks
Scheduling
Command-based scheduled jobs, optional queue transports
Other engagements
Recognize the pattern?
If one of these looks like your situation, the discovery call is where we find out how close.