Constituents who are Organizations

Published
2008-04-04 09:52
Written by
UPDATE: You can review detailed implementation specifications here and here ----
  • "We are an Association whose members are organizations. How can these organizations signup and renew their memberships online?"
  • "We get contributions from companies as well as individuals. How can we configure our online contribution pages to handle this?"
  • "How can we allow someone from an organization to update the organization's address and contact info?"
These are questions that have come up over the past year from users - most recently with Emily Frazier who works on Public-access media related sites, and participated in our New Orleans Boot Camp. Working through real use cases and options with Emily was very helpful - and we think we've come up with an approach that makes sense. If you're organization has requirements in this area - please take some time to think about how well this will meet your needs. A key piece of the puzzle is figuring out the link between the CMS user and a constituent organization. In the past, we've implemented some hacks which allow a CMS user to be linked to an organization record directly. However, "organizations" actually don't interact directly with a site, people in the organization do. The user = organization model is kind of crummy because it encourages people to share logins - creating security issues and making it difficult to connect transactions to a responsible person. We think a better approach is to retain the 1 : 1 connection between a person and a "user" (Individual contact : Drupal / Joomla user). AND THEN allow that person to act "on behalf of" an organization. The basic concept is to allow permissioned relationships between a person and an organization. Eventually we may extend this to allow permissioned relationships between any two contact records - but initially we'll implement this for the Employee <-> Employer relationship. So how might this work in relation to the questions we started with?
  • Online membership signup / renewal - Janet Klein works at "Art for Kids" in Oregon. Her organization wants to become a member of the "Northwest Arts Educators" association. She goes to their Membership Signup page, selects a membership level and then checks the "I'm applying on behalf of an organization" checkbox. An additional set of fields appears so she can enter her organization's name, address, phone and email (her email address is copied to the organization email address field as a default, but she can change that as needed). Once Janet completes the signup - "Art for Kids" is added to the database as a new "member" organization. Janet is also added, with a "permissioned" employee relationship to "Art for Kids". If Janet creates a CMS user account, she can subsequently log in and renew "Art for Kids" membership.
  • Contributions from organizations - Basically this works similarly to membership signup. The person from the company / organization checks the "Contributing on behalf of an organization" box and enters the organization information.
  • Self-service organization updates - Since Janet has a "permissioned" employee relationship with "Art for Kids", when she goes to her "Contact Dashboard" she will see a "My Organizations" list with links to View or Edit organization name, address and contact info for "Art for Kids".
One open issue is how to prevent or reduce the number of duplicate organization records that might be created during these flows. Currently, we only check new organizations for matches to existing records by Organization Name. Given that we're going to collect address and email data as well, we may move to using the configurable Duplicate Contact Rules here. This would allow each site to configure matching rules with weights for each field and a match threshold. We hope to roll into development on this shortly - if this is functionality you need post your feedback ASAP.

Comments

Yes, this is functionality I need, and the spec outline seems right on target. Some additional ways functionality along these lines could be extended:

1) Allow permissioned users to manage/edit other individual records for the organization they are an employee of. Thus one authorized employee could bear responsibility for managing contact data for all the organization's employees on file.

2) Mimic "use household address" behavior for employee/employer. This option should be available in the frontend signup forms as outlined above, as well as in the backend admin.

3) Tangential to this discussion -- extend search capabilities to allow cross-contact type searching. For example, find all Individuals where their Organization tag = xyz.

4) Some of this functionality may spill over into the multi-person event registration discussion. Maybe someone needs to be a permissioned user in order to register on behalf of other people? I think this control would need to be optional, as in many circumstances it would be counterproductive to require someone to be permissioned BEFORE they complete the registration form.

5) Managing permissioning seems to be the trick with this. For things like a contribution by an organization, or a new membership signup, I could see simply giving the user the option of contributing/joining on behalf of the organization. But when it comes to editing an existing organizational record, I would think the admins would want to have some control over who is permissioned to act on behalf of the org in this way.

6) With membership signups -- one thing that might eliminate the need for the "I'm joining on behalf of my organization" option is adding the option to assign membership types to contact types. Thus the "Gold Membership" is DEFINED as an organization level membership, whereas "Associate Membership" is defined as an individual-based membership. Some categories of membership may be ambiguous, in which case the option as described above would be necessary. But for those that are not ambiguous, the option may not be necessary. If I go online and join for a membership category connected to orgs, it should automatically determine that and insert the membership record accordingly. Defining these options and structuring them logically could be tricky.

-Brian

I've been working this week on User Group registrations. We require that each group have two contacts plus a general information email. Right now, I've just been adding new locations types for the primary and secondary contacts and putting their names in the supplemental address field.

On top of the things already mentioned, it would be useful to be able to send email to both contacts.

Ability to update is the key thing for me though.

Anonymous (not verified)
2008-04-04 - 14:22

Hello,

My organization would also greatly benefit from this added functionality.

We serve other organizations in addition to individuals, many of whom work for the organizations we serve (but not exclusively). We are especially interesting in allowing permissioned individuals to act on behalf of their organization to register their organization with us (similar to Janet’s example under the first bullet) and update contact information (email, physical address etc.) and other organizational data that we require from them (for example, we manage an online grant application that is entered by an individual on behalf of their organization). I agree with Brian's comment that cross-contact search functionality would be useful.

Thanks,
Emily

Updating contact info for the organization will be part of the 2.1 implementation. Access to "other organizational data" would be a custom / or future release feature. How do you collect the online grant app info now?

Especially self-service organization updates.

We also serve both organizations and individuals. Organizations have a primary and secondary contact who are (usually) Drupal users and responsible for their organization's profile information, most of which is publicly viewable. Then each org. can also have an unlimited number of staff contacts, CRM records entered through a short profile form that establishes the employer-employee relationship and adds the record to a group for our main mailing list. The primary and secondary contact would benefit from access to edit their org's info - access for staff contacts is not important.

Also useful would be to allow individuals to submit information on behalf of their organization. For example, information about a current project that could be linked to from their org's profile.

The approach you've mapped out seems to hit the mark. That would be an excellent addition!

Taking the use cases a bit further to handle the one-to-many relationship from an organization to individuals:

  • Adding multiple employees - Janet purchases a membership for "Art for Kids". Because she is the first to register the organization she acquires administrator privileges for the organization record. This organization membership is of a type that confers memberships to all employees, so Janet wants to register co-workers Bob and Anne. She views the "Contact Dashboard" of "Art for Kids", and clicks the link "Add employees". Janet enters email addresses of her colleagues. Bob already has a user account so his record is updated with a relationship to Arts for Kits (and he maybe receives an email asking him to click a link to confirm). Anne's email address is not found in the database so a new account is created for her and a new user confirmation email is sent to her. When she completes registration then she has an account with an employee relationship and membership status.
  • Managing organization relationships - From the "Arts for Kits" Contact Dashboard, Janet, as the permissioned administrator, could add (as above) and remove employee relationships. Bob and Ann would both see their organization relationships on their Contact Dashboard and would have the permission to just remove their employee relationship with "Arts for Kids".

These flows seem useful, but are definitely beyond the scope what we are planning for 2.1. However, the data model changes will make it easier for someone (or us) to build this type of interface. Hard-coding what type of relationship can be managed from the Dashboard (e.g. "Add employees") is easier that trying to support this type of functionality through a Profile-like mechanism. The question is whether it is general enough to be appropriate for a core addition.

For example, I can imagine an organization wanting this kind of limited relationship manager interface - but for Volunteers rather than Employees....

AS this evolves, we'll also need to verify whether binary permissioning on relationships is sufficient or if this needs to get integrated with the ACL model.

I used a similar technique for bioneers. When a user submits an membership purchase for an organization I've got a drupal form that collects the organization details. I then create the org and relationship on submit. I like the ideas about relationship perms too. At Advomatic we have an issue where sometimes org details need to be changed, but users don't have access to their organization to do the change themselves.

--
Dave Hansen-Lange
Web Developer
Advomatic LLC
http://advomatic.com
Hong Kong office

dalin,

Any more info on how you achieved this? I am in a similar situation and would like some pointers.

Thanks.

Anonymous (not verified)
2008-04-07 - 07:43

This is exactly what I am looking for. Have a site that needs to be launched soon (like this week!). I haven't got a full solution yet. I am currently looking to do something similar to what dalin did but I am not familiar with the CiviCRM API so not too sure how to proceed.

I would really love this functionality, pity it wasn't sooner. What you outline is spot on though. Especially the registration process since it will allow other users to register for the website without being tied to an organisation.

Thanks for the hard work as usual.

Guys, this is almost exactly what is required for the organisation I'm involved with

We offer individual memberships and we also offer:

1) Corporate memberships
2) Academic Faculty memberships.

The key thing about the corporate/academic faculty memberships is that they are effectively 'buckets' of memberships (10, 20, 30, 50) that an organisation can sign up for and then distribute to their employees/faculty members. We have a an 'admin contact' within the member organisation but each person that signs up under the 'corporate' banner is treated as an individual as regards benefits etc. This is similar to the "permissioned employee" relationship you identify above.

The 'Admin' person can then add/remove members (create employee/employer links between individuals and the organisation effectively) up to the limit of their 'bucket' during the course of the year for no additional charges (if a member is removed from a corporate we then chase them to renew as an individual at a discounted rate. Currently this is managed by email between corporate members and our admin team. No one has exceeded their 'bucket' yet so we don't know how that would be handled (probably an upgrade to the next level at a discount...)

Also some 'super corporates' e.g. Partner organisations might have an unlimited 'bucket' size but would otherwise be managed the same.

If we could

a) allow the corporate sign up on-line
b) allow 'super-user' members in a Corporate membership 'bucket' to administer their membership make-up directly (exposing some admin functions to this 'super-user' just around this process area
c) control the number of members in any given 'bucket' and trigger actions or reports for follow up if a corporate exceeds their 'bucket' limit in a given period.

then this would be 100% what we require. If it helps I can map out the logical data model we are operating and some of our current and planned processes around this type of membership.

I think you'll potentially be able to build what you need on top of what gets implemented for this in 2.1. The current Membership model supports extending a membership automatically to "related" contacts - and this should work for your Corporate memberships. Employees of a corporate member can automatically become members under the corporate "umbrella" when the employee-employer relationship is established. However, the concept of a "bucket" (ceiling for how many related members can be covered) doesn't exist in the data model.

With regard to 'super-users' doing self-service management of their membership base... the 2.1 implementation will allow your 'admin' person (i.e. the permissioned employee or employees) to navigate to a Contact Dashboard for "their corporation(s)". You could potentially extend this to have the Dashboard list all related contacts (i.e. employees). But it sounds like you'd also need to build an interface for them to ADD employees. I think the data models for this will be in place - especially if you make some assumptions about what a permissioned employee can do - but some custom UI's will be needed.

In the (completely theoretical) event than a user completely screws the record of his organisation, it would be great to have an option:
1) to automatically flag "tainted/to be reviewed" each modified organisation.
2) for an admin to revert to the previous version before the user modified it.

(this is a generic feature that could be as useful on modification from a civicrm user than from a user from the organisation self-serviced)

X+

I have been working and hacking away to accomplish this kind of scenario. I'm using Joomla so there is a combination of Joomla front-end components and just using the relationships as permissions in a sense. I am hoping you guys get a boot camp set up this summer that I can attend and I'd be happy to show you my (probably not very elegant) approach.

Clay:

Would be great if you could post more details on what you did an also code for what and how you did. I suspect this will help quite a few people and give us a few ideas too. We hope on having a couple of developer trainings in the US this year (one in June, the other in Sept/Oct)

lobo

The overview would be:

  • A custom front-end Joomla component which generates a custom membership application form. I used a custom form rather than your profiles because I need to let an individual apply on behalf of an organization, and simultaneously create a new organization, individual, and Joomla user account when the app is submitted.
  • When the app is submitted, it also creates necessary relationships between the org and individual (Employee and Lead Contact). It also puts the organization into a pending members Group. I also have it creating a CiviMembership for the org, but I am only using that as a convoluted way to be able to search(an create a mailing group) for members who are signed up under a particular contract version. There is no other need for CiviMember yet for us.
  • My component also provides a pending application queue. A committee member who has been granted admin access can go into the queue and approve an application, or reject it with or without an email comment sent to the lead contact. When it is approved it removes the pending group membership and puts the organization into an appropriate group for official members. The queue is a little skeletal right now and will probably evolve as it is used.
  • On the back end of the custom membership application form, I initially started by shoehorning the data into the right places with a bunch of individual queries, but midway through the project I discovered the API and I've been working on switching over to it as much as possible. I'm using the pre-2.0 (read deprecated) API right now.
  • We have a page of the site that is a list of our members and this will soon be a dynamic page which is fueled by those CRM organizations who are in the official members groups. Approval in the queue will result in the automatic inclusion in our directory.
  • I am currently working on a totally custom Edit Profile form which will completely replace the Joomla edit profile, and pretty much eliminate the need to use Community Builder anymore. My form will allow all users to update both their Joomla account (name, username, password) and their CRM contact info, as well as give those people who have the appropriate relationship with an organization to be able to update certain info that is appropriate for them to keep up to date.

That is the basic overview of what we've done so far. I've been in such a crunch that the code is not as conventional as I'd like, and not super easy to generalize, but I would be more than happy to share. Lobo, if you want to contact me personally and let me know the best way to get into this deeper, and share actual code, please do. clay.whipkey@gmail.com

cheers,
Clay