Small outreach CRM bundle for conference and prospect management.
It is intentionally narrow:
- organizations
- contacts
- activities
- external system footprints
This is not a general CRM and it does not try to manage tenants, invoicing, or full marketing automation.
- pre-load conference attendee lists
- track one-time outreach permission and follow-up status
- record booth conversations and demos
- track whether an organization already uses PastPerfect, Omeka, or another system
- attach lightweight tags such as
marac-2026orssai-tenant:middleburg-historical-society
The bundle ships four Doctrine entities and exposes them as ApiPlatform resources:
OrganizationContactActivityOrganizationSystem
The included ConferenceRegistrantUpserter service can infer an organization key from a CSV row:
- if the email domain is not personal, use the domain as the organization key
- if the email domain looks personal (
gmail.com,yahoo.com, etc.), fall back to the provided organization name
Examples:
snallen@vuu.edu=>domain:vuu.edufall@loc.gov=>domain:loc.govarchival2010@gmail.com+New Brunswick Free Public Library Archive=>org:new-brunswick-free-public-library-archive
This is intentionally heuristic, not canonical truth.
composer require survos/outreach-bundle:@devThen link it in local development using your normal monorepo flow.
The bundle is self-registering:
- Doctrine attribute mappings are registered automatically
- ApiPlatform mapping paths are registered automatically
Optional configuration:
survos_outreach:
personal_email_domains:
- gmail.com
- yahoo.comBuilds stable organization keys from email and/or organization name.
Upserts an Organization and Contact from an attendee row such as:
[
'First Name' => 'Selicia',
'Last Name' => 'Allen',
'Organization' => 'Virginia Union University',
'Email' => 'snallen@vuu.edu',
]Optional event tag example:
$upserter->upsert($row, ['marac-2026']);That tag is added to both the organization and the contact.
Recommended flow for conference rosters:
bin/console import:convert registrants.csv --tags=outreach,marac-2026
bin/console outreach:import:jsonl var/data/registrants.jsonl --tag=marac-2026When import:convert sees the outreach tag, the bundle listens to row events and maps fields like:
First Name->first_nameLast Name->last_nameOrganization->organizationEmail->email
The second command imports the normalized JSONL into Organization and Contact, deduplicating organizations by the configured email-domain heuristic.