Today I helped a client create a mechanism for determining the lifetime value of a given client. His problem is not unique. Essentially, this client does not know how valuable a given customer will be when the sale is won. In their business, they have an initial setup fee and a monthly service fee, but the length of time that the customer will continue to use their services is unknown, sometimes it's for 3 months, sometimes much longer. So without knowing how much a client will earn for the company, the "Amount" field of the opportunity is just a guess.
We discussed possibilities. One idea was to update the opportunity on a monthly basis to show the accurate total value. This is problematic since one Account might have multiple opportunities as the company upsells other services - which will confuse the total value. In addition, returning to the same opportunity month after month and updating the value is labor intensive.
We also tossed around the idea of creating a total value field right on the account page that could be updated. This solved the multiple opportunities issue but not the labor issue and it isn't very clean in the sense that you have no feel for what services makes up that total value.
We ended up opting for a custom object called Invoices. The custom object would contain the amount of each invoice and other fields directly from the invoice such as invoice number, description, type of service, etc. One of the fields is a lookup field to the associated Account. The Invoice object was added as an account related list and as a tab next to the opportunities tab.
The custom object really harnesses the power of salesforce.com. An object is the term that salesforce.com uses to classify all records used for a given purpose. For example, "Contacts" is an object, "Accounts" is an object, "Opportunities" is an object. They will usually have their own tab, fields, and page layouts. Custom object records can link to other objects - (just like a contact links to an account) and once linked can show up on the related list of the other object. Once a custom object is deployed, users can start creating new records of that object type.
So for my client with the new Invoices object - now, on each Account record, he has a list of all invoices for that client. The records can be imported en-mass using any of several tools or entered each month by someone in finance as part of their normal invoicing process.
This now makes possible any number of reports that show total value of any customer, thus allowing Return-On-Investment calculations, etc to be made.This was a clean solution, easy to implement, and added a great deal of visibility value to this client.