PHPackages                             survos/outreach-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. survos/outreach-bundle

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

survos/outreach-bundle
======================

Lightweight outreach CRM bundle for organizations, contacts, activities, and external system footprints.

2.7.2(1w ago)076MITPHPPHP ^8.4

Since Apr 21Pushed 2d agoCompare

[ Source](https://github.com/survos/outreach-bundle)[ Packagist](https://packagist.org/packages/survos/outreach-bundle)[ GitHub Sponsors](https://github.com/kbond)[ RSS](/packages/survos-outreach-bundle/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (20)Versions (43)Used By (0)

survos/outreach-bundle
======================

[](#survosoutreach-bundle)

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.

Use Cases
---------

[](#use-cases)

- 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-2026` or `ssai-tenant:middleburg-historical-society`

Model
-----

[](#model)

The bundle ships four Doctrine entities and exposes them as ApiPlatform resources:

- `Organization`
- `Contact`
- `Activity`
- `OrganizationSystem`

Personal Email Heuristic
------------------------

[](#personal-email-heuristic)

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` =&gt; `domain:vuu.edu`
- `fall@loc.gov` =&gt; `domain:loc.gov`
- `archival2010@gmail.com` + `New Brunswick Free Public Library Archive` =&gt; `org:new-brunswick-free-public-library-archive`

This is intentionally heuristic, not canonical truth.

Installation
------------

[](#installation)

```
composer require survos/outreach-bundle:@dev
```

Then link it in local development using your normal monorepo flow.

Configuration
-------------

[](#configuration)

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.com
```

Services
--------

[](#services)

### `OrganizationKeyGuesser`

[](#organizationkeyguesser)

Builds stable organization keys from email and/or organization name.

### `ConferenceRegistrantUpserter`

[](#conferenceregistrantupserter)

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.

Workflow
--------

[](#workflow)

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-2026
```

When `import:convert` sees the `outreach` tag, the bundle listens to row events and maps fields like:

- `First Name` -&gt; `first_name`
- `Last Name` -&gt; `last_name`
- `Organization` -&gt; `organization`
- `Email` -&gt; `email`

The second command imports the normalized JSONL into `Organization` and `Contact`, deduplicating organizations by the configured email-domain heuristic.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance99

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Recently: every ~8 days

Total

42

Last Release

11d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/21b39551f92ed4143772c622f9e571589c5a72c96ab3c53fe67489ce0d83e806?d=identicon)[tacman1123](/maintainers/tacman1123)

---

Top Contributors

[![tacman](https://avatars.githubusercontent.com/u/619585?v=4)](https://github.com/tacman "tacman (4 commits)")

### Embed Badge

![Health badge](/badges/survos-outreach-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/survos-outreach-bundle/health.svg)](https://phpackages.com/packages/survos-outreach-bundle)
```

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.5M370](/packages/easycorp-easyadmin-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
