Overview
The Contact module is QBO's Customer Relationship Management (CRM) module. It comprises the following classes:
Contact: represents a person, including name and address
ContactMethod: representing a phone, email, instance messaging address, or other method of communicating with a Contact
ContactTemplate: templates a Contact, implementing the ITemplate interface
Organization: represents a company, corporation, or other similar entity
Court: represents a judicial court
Geography: represents a geographic area (County, State, County, City, Postal code, or Latitude / Longitude with a radius
ProfessionalLicense: represents a license or certification of a Contact (e.g. a driver's license, attorney bar number, etc.)
State: 'nuff said
Contact Templates
In most uses cases, power users can classify Contacts using either ContactType or tags (see below). However, there are three use cases where one should consider creating a ContactTemplate, and populating this field when creating Contacts:
If you need to restrict access to certain Contact records based on role (e.g. only allow the Accounting role see Contacts mapped to a 'Billing Contact' template)
If you wish to automatically geocode some contacts but not others
If you wish to automatically link contacts by social security number
Phones and Emails: Contact Methods
Rather than storing HomePhone, WorkPhone, CellPhone, Fax, WorkEmail, HomeEmail, Website, LinkedInProfile and such in the Contact table, QBO offer use of the ContactMethod table instead. This allows for an extensible, unlimited number of phone numbers, emails, and such to be associated with a Contact.
From Design > Configuration > Modules > ContactMethod, you can create new Types such as "Phone", "Email", "WorkPhone", etc. Creating these types will:
populate the ContactMethodType dropdown list, and
extend Contact/Save to handle the type as a field
For example, if you have no Contact Method Types defined, the following call will ignore Email:
Contact/Save?FirstName=John&LastName=Doe&Email=jdoe@example.com
If you have created a Contact Method Type called 'Email', the same REST call will populate a ContactMethod row will Type = 'Email' and Value = 'jdoe@example.com'.
If you create Contact Method Types for Fax, HomePhone, and Website, you can then call:
Contact/Save?FirstName=John&LastName=Doe&Email=jdoe@example.com&Fax=800.555.1212&HomePhone=800.555.2323&Website=www.google.com
Labels (aka Tagging, Collections)
The Contact module includes classes that support 'labels', which is the ability to tag or categorize records with an unlimited number of attributes. Labels examples include:
Title Companies: a group of Organizations that perform title work
Foreclosure Attorneys: a group of Organizations that manage foreclosures
Team: a group of users representing a team
High Risk Loans: a group of loans that are considered high risk
Preferred Brokers: a group of real estate brokers that are preferred by a client
Most QBO classes include a 'Type' property (e.g. Loan.LoanType, Organization.OrganizationType, Contact.ContactType), any given record may have only one type defined. However, any QBO record may have an unlimited number of tags applied to it. This structure was born when early QBO clients attempted to classify Organization.OrganizationType as 'Title Company', 'Field Services Company', and 'Recording Company', only to realize that companies like First American can be all three. Rather than creating three Organization rows, a single 'First American' Organization row may have three tags: 'Title', 'Field Services', and 'Recording'. When a search is performed, the following will produce a list of Field Services companies:
Organization.ashx/Search?Tag=Field Services
Most QBO search panels support the ability to select multiple records and 'tag' them with an existing or new tag. This action creates a Collection (if the tag is new), and a CollectionMember row for each selected item mapping it to a Collection.
Tagging comprises the following classes:
Collection: a 'label' or 'tag' representing some sort of collection of items
CollectionMember: maps an object to a Collection (this is the 'label')
CollectionTemplate: defines the characteristics of a Collection