Clickwrap for Django and best practices for Terms of Service
Wednesday, April 14th, 2010Last night, I wrote a simple Django application for managing clickwrap legal agreements. I’m developing the artists’ submission system for the Conflux Festival’s new site (which is not yet live), and we require artists to agree to an Artist Agreement before submitting entries for the festival. Since this sort of process is relatively simple and extremely common, I decided to write a reusable app rather than just work the logic into my submissions application. (I took a quick look around and as far as I can tell nobody else has put out an application for this purpose, but I may be wrong and if I am you should tell me in the comments.)
The goals for this application are/were roughly:
- Give developers an easy way to check whether a user has agreed to a particular agreement when the user accesses a view. I decided the best way to do this was through a decorator, like so:
@requires_agreement('terms_of_service')
def any_old_view(request):
...
- Keep versions of each agreement and record users’ agreement to each, so that the site maintainers have a log of which terms bound a user at which date, and the decorator above can determine whether the user has signed the *latest* version of the agreement.
I implemented both of the above features in version 0.1. What I want to do next is build in a feature I think is best practice for any site that maintains terms of service or a privacy policy:
- When a user is asked to agree to an updated version of an agreement that user has already signed, display a diff of the old form and the current one so that the user can easily see what’s changed.
If you don’t do this, and your site gets big enough, EFF will do it for you. In my opinion, it’s a matter of fundamental respect for users — if you reserve the right in your ToS to make periodic changes to the agreement (and there are good reasons to do this), you should give your users clear notice of those changes.
Unfortunately, the most common practice is to change the terms silently and leave users to seek out a tiny link in the footer if they want to find the current terms. Another common, far better practice is to display the new terms upon the user’s first login to the site after the new terms become active. But few (edit: very few) users read the original terms, much less remember them, so even upon a careful read-through they may have no idea what’s changed. By giving users a diff of the old and new terms, a site makes itself accountable to and builds goodwill with its users. It may also strengthen the legal effect of its terms by giving users actual notice (although courts have been all too ready to enforce online agreements with little to no notice).

