Introduction (layout, colours, searching, keyboard shortcuts, undo) Profile & Log out Two-step verifcation Scanner keys Cameo users API keys
Reminder messages Add reminder File store Statistics
Templates Pending emails Pending letters Lists Stationery Snippets Mailing workflow illustrated
Enrol new members Add contact Add member Import members Welcome contacts Manage duplicates
Incoming renewals Renewal reminders Overdue manual renewals
List subscriptions Membership status, cards and qrcodes Review amendments Bulk changes Send canned message
Past communications and change history Map and representatives Attachments
General search Map search Date search Miscellaneous queries Refine search
Import statements Reconciliation Overdue automated payments Publish accounts Cheque received Make a bank deposit
Statements and transactions Deposits Export Gift aid declarations
Purge long-expired memberships Update political representatives Organisation details Incoming email Delivery rounds Membership types Contact types Bank accounts Custom fields
API Importing memberships About Cameo
top (contents)


Cameo is a membership organiser, originally written for Cambridge Cycling Campaign.

See • screen layout • record types and colour coding • editing records • badges • searching • keyboard shortcuts • undo

screen layout

Down the left is a menu of things to do; clicking one produces a further list of operations in that category to choose from, in the middle column.

Not everyone can see everything: it depends on the privileges assigned to you, which you can see in . In particular, financial information is restricted, and you may only be able to view members' information, not change it.

Over on the right (or above on smaller screens) there is a search box to search for specific membership records - see below - and the list of results from a search is displayed underneath that.

The first in the list is selected - outlined in blue and displayed in detail below, where it can also be changed if you have the necessary privilege. You can move up and down the list of results by clicking or using the CTRL+up-arrow/CTRL+down-arrow keys, and jump to the start of the membership detail section with CTRL+INSERT (we use this key because it is usually next to the HOME key on the keyboard: CTRL+HOME is the standard browser action to go back to the top of the page).

Sometimes the results are determined by a particular operation rather than an explicit search. For example, when selecting enrol new members, the list of prospective new members is displayed. You can search again at any time, however.

Many of the tasks in the middle column use the selected membership or the whole list as the data to work on.

record types and colour coding

There are four kinds of record that can be displayed in the right hand panel.

Current members whose membership is overdue have their renewal date in the expiry column of the results list shown on an orange background, or if more than four months overdue on brick red.

The colours of the menus don't have any particular significance; they are there just to make them distinct from each other.


Only people with the correct permission can change a membership record. Members and contacts have separate permissions so it may be possible to edit one and not the other.

To change a membership just make the correction required to the relevant field. The record is saved when you move to some other part of the page (e.g. the next field).

The membership number cannot be changed. Each member and contact is automatically assigned a six letter code which historically we've called a QRcode because they were originally used as the 2D barcode on a membership card. However, they are actually unique identifiers for the membership and can be used to personalise links and the like. You can allocate a new one if the old one is compromised using membership status, cards and qrcodes.

A "signed note", near the bottom, allows anyone to add a note (and your name) to the list of Notes even if you wouldn't otherwise be able to edit the record.

Some versions of Cameo have photo ids (picture thumbnails) available for each individual. Where this is available, there is a box to the right of the individual into which an image can br dropped. Dropping a new image will replace the old one. Click on the image to see a larger version. These images are just attachments (also accessible via the link at the bottom of the membership record), so if you need to delete a picture entirely, you can do so there. Pictures are available via the API (so, for example, on a separate website, you could use a scan of a membership card barcode to obtain the qrcode, and with that obtain the picture(s) via the API for display. Pictures can also be substituted into templates, so you could print membership cards which include the photo id.


Menu entries display a number in a red circle at the top right. This is a prompt of outstanding things there are to do.

For example, the one on enrol new members indicates how many are waiting to be enrolled, while the one on renewal reminders is triggered by the end of the month approaching.


Searching using the main search box in the top right is incremental or dynamic: that is, matches are determined as you type and the more you type the more specific the results become. (A broader search is available in search more).

These results are selected from specific fields in the membership record, namely:

However, incremental searches don't look in the address (other than the postcode), salutation or any other fields not mentioned above. So Newmarket - assuming the only occurrences are in street and town names, not a person's name - won't find any results, for example. This is so that we can target results on the most likely searches. To broaden the search to other fields, see general search).

If you have more than one search result, it can be helpful to save the list and then re-use it or combine with other results, in refine search. There are also some short-cuts for doing this: under the list of results you can save without visiting refine search. Then if there is one result shown (and you can choose to show just the selected result), and it is in the saved list, you can move to the next or previous result in the saved list using the links provided under the results list.

keyboard shortcuts

In addition to the standard browser shortcuts (note particularly Space or Enter is like clicking on a button when it is focussed, TAB moves to the next field, button etc., SHIFT+TAB goes backwards):

F1: help in new tab

ALT+L: library,
ALT+C: communications,
ALT+N: new members,
ALT+R: renewals,
ALT+T: member tasks,
ALT+M: member info,
ALT+S: search more,
ALT+A: accounting tasks,
ALT+I: accounting information,
ALT+P: profile,
ALT+D: organisation settings

Once a panel is open, you can cycle round the different panes by repeating the same key (SHIFT+ALT+key to go backwards), or using ALT+PGDN and ALT+PGUP. ALT+digit also selects the n-th pane on the list (e.g. ALT+2).

ALT+F: start searching in the main search box (F for find).

ALT+Q: focus in the current panel (so you can use tab to move between the controls and Space or Enter to press buttons, opene selections etc).


CTRL+DOWNARROW and CTRL+UPARROW: move through the search results list.

CTRL+INSERT: scroll to top of membership detail panel (The standard browser action CTRL+HOME goes back to the top again).


If you make a change, you can usually undo it: the undo button will appear to the left of the search box. Hovering over it will show you what it will undo.

All the changes associated with an operation are undone together. For example, enrolling a new member changes their membership status and generates a new member letter (among other things). Undoing will change them back from current to new, and also remove the letter from pending letters.

However, there are some limitations: undo can't re-call email messages actually sent! Indeed you could make things worse by reinstating messages sent and end up sending them again.

Nor can undo work indefinitely back in time or in a different order than the operations were done in.

At present there isn't an interlock on undo for multiple people making changes simultaneously. This means you could potentially overwrite someone else's change, but undo is not really different in this respect than for any other change.

CTRL+SHIFT+Z on the keyboard also does undo (but prompts you first in case of accidents). (CTRL+Z is the built-in browser Undo which just changes back form content you have changed).

There isn't currently a redo button. It's on the to-do list.

top (contents)

Profile and log out

This section just lists the information we have about you as a Cameo user (not as a member of the organisation being managed).

Administrative users can change other users' privileges and email addresses. Please ask if you need to change email address for example.

You can log out from here too.

Note that two-step verification and scanner PIN have moved to their own separate sections in the profile menu.

top (contents)

Two-step verification

We strongly recommend protecting your members' data by using two-step verification (also known as two factor authentication) for all Cameo users. Some organisations require this. Cameo's whole raison d'être is storing people's information, so you owe it to them to keep it safe.

Some systems do this with text messages, but we're using a more recent method in Cameo. It works by storing a key (a 16-character code) in an authenticator app, usually on your phone. Unlike SMS, this works even if you don't have a phone signal or internet connection on your phone (though of course Cameo itself needs an internet connection on that computer; and a "dumb phone" won't do).

The app uses the key to make a time-limited verification number (or token) which you enter when logging in to Cameo. This means that if your password is compromised, it is still only possible to log in if you have that phone to hand. (It also works with most tablets, and there are also now apps available for Windows which do the same thing).

Click the Turn it on link to reveal a barcode. Scan this into the authenticator app according to its instructions (you usually have to start with tapping a '+' or 'Add Account'). If you don't have a camera, you can type the sixteen character key provided instead.

Then give Cameo your password (which prevents someone who finds your session unattended from doing this) and the verification number provided by the app. You need to do this before the number expires (they refresh every 30 seconds). You will then be asked for another such verification number when you log in.

The following free apps are among those available:

This is LastPass Authenticator; the others are quite similar:


If you don't have your phone available, you'll need to do a password reset from the login page, which also cancels the two factor authentication. In effect, this uses your email account login as a temporary alternative authentication method.

top (contents)

Scanner PIN

You can scan files straight into Cameo from your smartphone camera and the like. Many smart phone scanner, file management and photo apps have a sharing or upload button (often the symbol share ), which offer the rather strangely-named WebDav as one of its options. This needs to know three things (usually you only have to enter them once):

When you then share a scan, it will show you a folder for each of the places where you can upload files to Cameo, such as deposit evidence for cheques. Select the appropriate one and put the file there. These aren't real folders: they don't show files already attached; they are just places where Cameo can pick up the uploaded file from. You can't delete, rename or read files in these folders, only save them.

Some attachments need or can have additional information. To do this, give the file a name (in whatever way the app offers) which includes that information in the file name, as shown below. Some attachments only allow certain types of file.


On iOS, Readdle Scanner Pro is particularly suited to this task: it can de-skew and clean up images and immediately upload them via WebDav, or transfer photos already in the photo library. It costs a modest amount.

Likewise, Scanbot iOS / Android, but also available on Android. The WebDav option is part of the paid-for product.

Another Readdle product, Documents file manager has WebDav as part of its general file sharing.

There are numerous apps which just do WebDav transfers on iOS and Android. For example, WebDav Navigator iOS / Android lets you use the camera to take a photo directly into Cameo, or copy one from the device's photo library.

Windows and MacOS also have WebDav built in: in Windows 10, for example, go to This PC, and under Network Locations right click or choose from the ribbon "Add a network location", select "Choose a custom network location" when asked, then the URL, and then supply the credentials. You are then presented with a File Explorer window which you can drag or copy files to.

top (contents)

Cameo users

This panel, accessible only to administrators, controls who can log in to Cameo and what they can do.

To see and change details for an existing user, click the row summarising a user.

To add a new user, click the new user button and replace the putative name Change me with a user name (this will appear in things like message posts) and their name and email address and set their permissions.

Click the link provided to send an invitiation and password (re)set link to a user's email address.

Click ❌ to remove a user.

top (contents)

API Keys

If you don't know what an API key is or how to use one, this panel is not for you!

This panel, accessible only to administrators, controls who can access the data from another server via the application programmer interface.

You can add additional keys for use in various contexts (so you can rescind one that may have been compromised without affecting the others).

The username can be whatever you choose so you can remember which key was for what purpose. However treasurer is the only username to which the exportstatements API endpoint will respond.

If you delete a key, the third-party code accessing the API via that key will get a HTTP status 400: Unauthorized response until it is replaced.

top (contents)

Reminder messages

Messages are there to let you remind yourself of something that needs doing in the future.

Add a message in library/add reminder where you can say when the message is to be displayed in the reminder messages panel. An email will also be sent to the Cameo users identified to receive message emails.

A message can also be linked specifically to one or more members, in which case a link to their record is provided in the list of messages and in the email. Reattribute a message to the memberships found in the search list with the button.

Cameo also generates reminder messages itself, for example as a side-effect of certain actions, such as when a bank statement PDF scan is uploaded, or on certain calendar dates.

New messages can also be emailed directly in to Cameo if this has been set up. See Incoming email for details.

A message is marked "dealt with" when is clicked. The message will disappear from the library, but stil show up in the attributed members' history (marked as "done").

Clicking will prepare an email to the attributed membership (the just first, if there is more than one), and also mark the message dealt with. To do this, you need to set up a template which services the event "reply" (see templates for information about servicing events). In the template, if you include the {insert: extra} substitution, when the message is prepared it will substitute the original text of the reminder message (along with "on date you said: ...").

If you can't deal with the reminder on the date due, you can rescehdule it to make it reappear and send email again at the later date by putting a new date in the 'due' box.

You can also view, reschedule and delete messages relating to a membership (whether dealt with or still pending) in history.

top (contents)

Add reminder

All member tasks work on the membership selected under the search box.

Here you can add a message to remind you to do something either for none, one or several memberships, some time in the future. When the date arrives, the message is posted and an email sent to those Cameo users identified to receive it. Both are linked to any identified members so you can immediately retrieve them again at that time.

While you can quote the date when the message is to be posted, in any reasonable format, you can also quote relative dates, such as "next Friday". Perhaps most usefully, if you want to get a message a month before a specific date, such as when their membership expires, you can say, for example, "23 Sep 2015 - 1 month"; or even "1 year" (meaning from now).

top (contents)

File store

As well as attachments to particular memberships, you can also store files which aren't linked to anyone in particular. For sensitive membership information this is better than sending by email. It also means you have a permanent, generally available record of anything relevant.

Each file can be restricted to only those Cameo users with the privilege selected on the menu underneath the file upload area. You can change this later if necessary. Note that you may not be able to see the file if you upload it with a privilege you do not have.

Once the file is uploaded, a description can be added to it for more information. You can also, of course, delete it and download it.

tags and filters

You can add tags (single words or short phrases) to a file, once uploaded, either from a list of previously applied tags or by typing new ones.

You can then choose to see only files with the tags selected from the filter menu below the list.

This is an alternative to a folder hierarchy, but allows files to be in more than one. If you want to model a folder hierarchy, then you can add tags for each level of the hierarchy and select only the files with all those tags. For example, say in a conventional filing system you have folders X and Y and in each of those you have folders P and Q. If you assign files that would have been in X/Q the both tags X and Q and so on, then you can find those files by selecting for files with both X and Q. (The case where you have folder X with folder Y in it and Y with X can't be modelled like this, but you could use XY and YX as the tags or some such convention if this is essential; the usefulness of being able to categorise in multiple ways outweighs this minor disadvantage).

You can also search for a file by typing part of the file name in the filter box provided (any part of the name, not just the start), or by the kind of file (e.g. only images), or any combination of name, type and tags.

You can order results by most recently uploaded first, or in alphabetical order of filename. When you upload files, the order is set to most recent first so the ones you just uploaded are shown at the top of the list, and therefore available for changing their properties (such as adding tags and description).

top (contents)


Summarises information about the overall membership.

A tab-separated version is provided below the main table from which you can copy and paste into a neat layout in spreadsheets or text editors.

You can use the only for → button to display the same statistics only for the membership currently selected. Some figures, like those for churn, will not have any particularly useful meaning in this case.

top (contents)


Emails and letters are produced by substituting information from membership record(s) into a template. This is commonly known as a "mail merge". This is done:

See in this page: • choose a template • sending mailshots • audience • email templates • letter templates • substitutions • signatures • conditional substitutions • snippets • subordinate template substitution • separately for each individual • images and media • servicing events

See also an illustration of the workflow involved in producing mailings.

choose a template

The menus at the top of the templates panel list all the templates, by type. There are four different kinds of template:

Some mailshots, such as newsletter announcements, are usually edited for new content each time they are needed. At other times you will need to make a new template. To do this, copy one of the required type: choose it, click make copy, and rename the copy appropriately.

As different people use different templates, you can give each template a personal priority, by clicking on the stars, to control how near the top of the list of templates it appears for you.

sending mailshots

With a template selected, the buttons at the bottom right of the panel are used to send a mailshot or prepare letters.

For emails, you can

However, a mail merge can produce and send hundreds of emails. Therefore it is important to test a mailshot before sending.


Each template has a target audience. This determines who receives messages generated using the template.

Templates with individually chosen audiences are offered for sending canned messages; those with services event... are used to make correspondence as a side effect of another change.

Otherwise, the audience is a list previously set up in lists. You can create additional automatic or manual lists.

If you need to send to more than one list, you can make a third list which is the combination of the two, again in lists.

email templates

As well as the message body, email templates need to indicate the sender, recipients and subject. Just like the body content, each of these can substitute information when the template is used with a particular member record. The recipient (To email) will nearly always be the email addresses from the member record.

Also, if the template is not targeted solely at those with an email address, the alternate letter template also needs to be chosen from the Equivalent letter menu. When merging, the email will be generated by preference, but if there is no email address for a member, the letter template will be used instead and a letter generated.

For example, newsletter announcements and Cyclescape acknowledgments would be email only, but renewal reminders need to reach all relevant members whether or not they have email.

For regular mailshots, based on the same template, it's easy to forget to change the subject line. If you tick the box under the subject, it will remind you if there are any sent emails with the same subject line when you come to send the email.

letter templates

Like email templates, letter templates also have a name, require a target audience and have body content.

However, instead of specific recipient and sender fields they specify the stationery that they should use to lay out the physical page. For example, the recipient would typically be substituted in a box positioned on the page to show through the window in an envelope, and the sender by a scanned signature at the end of the letter. Stationery, such as letterhead with a continuation page, or 16-up labels, are created separately (q.v.) and are shared between letter templates.

To assist in getting the layout boxes in the right place on the page, there is a check box at the bottom of pending letters which causes them to also include the box outlines when printed (the boxes are always show in in pale yellow on screen). Preview for letters also includes these outlines.


Substitutions are indicated by curly brackets, like this:

    {show: salutation}

This means that instead of putting that text verbatim in the message, the "salutation" field from a membership record will be substituted instead. (If you've ever used MailChimp, you'll recognise these as merge tags; Microsoft Word and Libre Office call them merge fields).

So if your template reads

    Dear {show: salutation}, 

Then the final message might read as

    Dear John & Jane,


    Dear Mr Doe,

Choose a substitution from the menu in the editor toolbar.

Substitutions aren't always related one-to-one with fields in the membership record. For example, two substitutions deal with entire addresses: {show: address (one line)} substitutes the address formatted to be presented on one line, with commas in the right places, while {show: address (multiline)} formats it as you would put it on an envelope.

If you really must have a real curly bracket in your text, you can get it with a substitution:

    {insert: open curly}

Other substitutions named {insert: ...} provide system generated content, like the current date or name of the membership secretary, rather than information from the membership record.

It will be pretty obvious from the names what the various show and insert substitutions do, so they aren't listed here individually. A longer description is provided when you hover over the entry on the substitutions menu.

A couple of special case though:

    {show: address (multiline)}

formats an address (not including the name field, usually {show: called}) to fit a label or envelope. It includes the contact body if any, and tries to shuffle things around if the lines get long so they stay within four lines.

    {show: label info}

formats delivery note, expiry date, delivery round and delivery copies into a single text string suitable for adding brief information to a label, envelope etc.

    {membership card:}

displays an entire membership card! This automatically advances to the next box afterwards. Intended primarily for the peel-off area of card blanks, but could be used many-up on cardboard or even in an email. Another way of preparing material like this is to use snippets.

    {qrcode: URL WIDTH}

substitutes a QR code image containing the URL (or other data) supplied after the colon at the given WIDTH (in millimetres). If the URL contains _U_ and/or_Q_, these are replaced with, respectively, the organisation URL (as set up in organisation details) and the qrcode from the membership record being merged. For example, _U_/validate/_Q_.

(You can also make qrcodes directly by adding a URL of the form:


to an image in the template editor, where CAMEO is the URL of your cameo installation, including the https:// at the start, and DATA is the URL-encoded URL or other data you want to include in the QR code. DATA may contain substitutions that you are sure won't need URL-encoding, such as membership number. If you don't understand URL-encoding, then this probably isn't for you).

signatures - what's the difference?

There are four different signature substitutions:

There's also several different email addresses that can be substituted:

conditional substitutions

As well as textual substitutions, whole chunks of text, including other substitutions can be included or omitted using conditional substitutions. These start

    {if: ...}

The text following will be included or discarded up to the end of the enclosing HTML block according to whether the condition is true or not for the membership record being considered. That block is often a paragraph, but can be smaller. If nothing remains for the block after discarding, the block is also discarded. You can choose a special block only for the purpose of limiting the extent of the {if} from the Formats menu.

For example, the following paragraph would be included only if the member has made a gift aid declaration (something is in the two Gift Aid boxes on the membership record):

    {if: gift aid}Thank you very much for allowing 
    us to reclaim tax on your subscription.


The separate snippets panel allows collections of reusable HTML that are beyond the capabilities of the template editor to be defined and named. You can substitute these by name from the Snippets menu in the template editor. These can form things like buttons, sections of a newsletter, persdonalised membership cards and so on.

subordinate template substitution

The special substitution

    {template: ...}

lets you substitute the entire content of a subordinate template into another template. This allows you to share fragments of content between templates (particularly, perhaps, between an email and its letter equivalent). So if you have a subordinate template called geranium, you can include it in the template you are working on like this:

    {template: Re direct debits}

(Template names are case-and-punctuation-sensitive).

Substitution is done textually verbatim before any substitutions are done - so the subordinate template can itself include substitutions - but after any conditional substitutions, so whole sections of text over multiple paragraphs represented by subordinate substitutions can be included or omitted at once. For example:

   {if: gift aid}{template: gift aid thank you}

Subordinate templates can themselves include other subordinate templates (take care not to form an infinite loop!).

separately for each individual

Usually a single letter will be sent to each membership, and duplicate emails to each email address for each membership.

Occasionally, however, it is useful to produce separate materials for each individual in a membership (for example, personal membership cards).

To do this, tick the separately for each individual box in the template. There is a set of substitutions for individuals which insert variations of their name, email address, sequence number (potentially useful in a URL which feeds back into the Cameo API), and photo id (where enabled). Note that if you use these substitutions without the box ticked, you'll get the details for just the first individual inserted.

Unfortunately, photo ids cannot be used in emails. It is technically possible to do this, but almost all email clients block such images for security reasons (and such emails are very large to send and store in bulk). It can't even be done by linking back to the Cameo database as these are not accessible on the public internet. If this is essential, the way to do it is to to have the email include a link ("pick up your membership card here") to your public site where they can obtain the information (e.g. an online photo card), constructed using the Cameo API. However, this should be done with care that the link is in some way private.

Note that where templates are set up for email or letter, the separately for each individual box will not produce a mixture of letters and emails for a single membership. If there is any email address, only emails will be produced.

If you are producing membership cards on peel-off blanks and the like, where you can include other information as well, you may only want to put that covering material on the first and omit for other individuals. {if: first individual} lets you do this.

images and media

You can include images (and video) in email messages providing they are freely accessible on the wider internet (otherwise the recipients' email clients wouldn't be able to load them). For example newsletter cover pictures. Just click the insert image button in the message editor and quote the URL of an image (which in most browsers you can obtain by right clicking on the image and choosing Copy Image URL or similar). For installations that support it, a select button can also be provided which lets you choose the image from the third-party media library directly.

If your Cameo administrator has turned it on in organisation settings, there is a file chooser button alongside the box for the image URL which lets you choose images directly from your online images (e.g. a Wordpress media library).

You can also do this in letters. However, generally the image will need to be many more pixels to print without being fuzzy or jaggy (it will print the correct physical size however even if this is the case). Larger images will need to be scaled down in the browser to the required physical size using the height and/or width boxes in the image import box.

In letters you can also include template images uploaded via stationery. Use the Template Images button in the editor toolbar. You can't do this in email because these images are not available outside your Cameo login.

communications as a side-effect of something else: 'servicing event'

Some operations or events, like enrolling a new member, can generate communications as a side effect, for example a welcome letter or email.

A template can be assigned to service each such event, by choosing template audience service event, which then shows a further menu from which to choose an event. Typically you'll only need to do this once for each event when you initially set up your workflow. Only one template can service each event, so assigning an event to one template will de-assign it from any other it might be assigned to.

You don't have to assign any template to an event, in which case that operation won't generate any correspondence. It will tell you that, though if this reflects your usual process, these messages can be suppressed by request.

Furthermore, when you do have a template servicing an event, as you usually would, you can exclude certain membership types from being handled for that event when it occurs, by selecting the membership type(s) from the except for menu alongside services event. In that case, any memberships of that type will not receive that message.

You can assign either a letter or an email to service an event. So you could always produce a letter, perhaps to accompany a welcome pack which is always posted; or you could email an introductory message. Because email templates can have an equivalent letter, you can also produce an email by preference, but a letter if no email address is available for them.

Here is when the events on the menu occur:

top (contents)

Pending emails

Emails and letters are prepared ready for sending either as side-effects of other operations (such as renewing a membership) or explicitly, from templates to lots of people or send canned message to just one membership.

The emails and letters are produced by substituting information from the membership record(s) concerned into a template (which is either implied by the operation, or explicitly chosen).

See an illustration of the workflow involved in producing mailings.

However, messages can be merged to pending emails rather than sent immediately. Emails are grouped by the batch they were prepared in, and then listed by member, in this panel.

This two-step procedure means messages:

You can also retrieve the membership record for each recipient from the link on the top line of each message.

sending emails

You can send either single emails, a batch of emails that were prepared together, or all pending emails that you prepared (you can send other people's email but only by sending a specific email or batch).

Batches can be scheduled for sending at a later time. They stay in pending until the time arrives. You can delete emails individually or the whole batch any time before the scheduled time is reached.

The scheduled time can be in any sensible format, so you can say "21 July 2016 2pm" if you want, but more useful are perhaps words like "now", "tomorrow", "Friday" combined with a time. So for example "Monday noon" means 12pm next Monday. "1 day" means 24 hours from now.

Note that while you can Undo scheduling emails, once the email has been sent it can't be recalled, so undoing may make things worse, by later re-scheduling emails which have actually already been sent.

Incidentally, all emails (except single ones and tests) are scheduled, even if immediately, so you don't have to wait for a lot of emails to actually be sent. There's a leeway of a few seconds, so if you send and realise immediately that was wrong, Undoing quickly or deleting will stop the emails being sent.

top (contents)

Pending letters

Letters and emails are prepared ready for sending either as side-effects of other operations (such as renewing a membership) or explicitly, from templates to lots of people or send canned message to just one membership.

The letters and emails are produced by substituting information from the membership record(s) concerned into a template (which is either implied by the operation, or explicitly chosen).

See an illustration of the workflow involved in producing mailings.

However, letters are not downloaded immediately they are produced. Instead, they are listed in this panel - all those not yet downloaded, most recent first, and then if there is room the most recent ones that have been downloaded. This is so that you can do everything necessary and then do all the printing in one go.

From the pending letters panel you can:

Already downloaded files are shown with a tick: ticked and pending files with an arrow: not downloaded.

Note that printer alignment tests formerly provided here are now provided by anonymous previews.

top (contents)


Lists are flexible collections or groups of (current) memberships and contacts, which can also serve as the audience for a mailshot. Lists are either

Subscriptions to manual lists, and opt-outs from automatic lists, are shown underneath email addresses for each member. They can be managed by clicking them, which takes you to the list subscriptions section.

See an illustration of the workflow involved in producing mailings.

Make a new list

Press new list and complete the details.

Some list sources have additional options. For example, for areas, you need to choose which area you want, and for representatives, you need to choose the relevant councils or other bodies.

It's completely reasonable to have two lists with the same source: you might want to use them for difference purposes and therefore to have different people opted-out of each.

Combining lists

Some list sources combine other lists in various ways. The additional options for these are other lists, and to be useful you need to choose more than one.

Combined lists can themselves be combined, allowing for very general combinations. For example you could combine some memberships and contacts on two lists and then exclude those who live in some area.

Result order

You can change the order in which subscribers to the list are presented. If you are sending emails using the list, the order probably does not matter, but if producing paper or for some other reason, you may wish to choose the order.

Custom label sequence sorts primarily by round number, but prioritising things that may need manual attention when preparing a distribution, such as the number of copies, or whether there is a delivery note in the record, so that any special cases can easily be dealt with when collating your delivery.

You can include certain custom fields on the menu of things to sort by if the list order box is ticked for the custom field. This is only possible for fields which apply to the whole record (fields for individuals are ambiguous for sorting, as there can be multiple different values), and only to dates, numbers, single selections, simple text and cross references.

Automated regular mailing

One list source is regular, which allows for regular automated mailings. Early each day, any templates which have a 'regular' list as their audience are merged and any resulting emails automatically sent.

Regular has two options to choose:

So, each day, any memberships which have the field set to the current date are emailed and the nominated date field is then updated according to the frequency set for the list, ready for next time.

Note that it does not make sense to have more than one template with the same regular list audience: the second will never produce any messages because the first will have updated the dates. Also, it does not make sense to use the same date field for more than one regular list, as again, the first will update that field before the second sees it.

top (contents)


Stationery provides the layout for letter templates. For example, you can create a letterhead first page with continuation pages, or a page of labels laid out according to your die-cut stickers.

Apart from the name and a description, everything else for an item of stationery is managed by clicking on the link to edit layout full screen or one of the preview pages underneath.

flowing text into stationery

The idea is that, when a template is merged with membership data, text from the template, images and substitutions from the data are placed, in sequence, into boxes at specific positions and sizes on a page from the stationery chosen for the template. If text overflows a box, it continues in the next box. (You can also force a paragraph or div to start at the top of the next box by selecting the appropriate format from the Formats menu in the template editor).

When there are no more boxes on the first page, text continues in the first box of the next page. If the stationery only defines one page, it will be repeated, otherwise text will flow into the boxes of the next page, and so on, and then repeat the last page as long as necessary. This is particularly intended to model either many pages the same, or a cover page and multiple continuation pages. Whether automatic or manually advanced, stray newlines at the top of boxes are suppressed.


The paper size for the stationery is selected in the top left, and an image of a page in the correct proportions for that size displayed in the middle. If there is enough space, it will be displayed approximately life size (depending on your monitor), but will usually be scaled down to fit.

To add another page, click the add page button. The last page will be repeatedly re-used when text is merged if the text won't fit on all the pages defined in the stationery.

Click on the page icon to select and work on that page. If there is more than one page, you can delete a redundant page with ×.


Normally, when all the pages for a particular membership record have been generated, the next record will start again at the beginning of the template with a new first page (also known as simplex printing).

However, if you select the box on same page option from the pagination menu, this repeats the template content for the next record starting at the next box, not a new first page. This means you can create things like mailing labels many-up on the same sheet. This option is only available when you have a single page.

Alternatively if you select Pagination, next member on next odd page option, an extra blank page will be inserted if necessary so that if it is printed double-sided, each letter will start on a new sheet (also known as duplex printing).

background images

Each page can have a background image, selected from those available in the column on the far right.

Either click one to insert it on the currently selected page, or drag it onto the background. The current background image is outlined in blue.

Add new template images with the controls at the top. Delete one using × next to the image. Download one using the links provided.

See below for information about preparing images.


Each page should have one or more boxes into which text will be flowed when a template using the stationery is merged with data.

Manage boxes like this:


The grid snap slider lets you snap box positions and sizes to exact positions, as multiples of millimetres. For example, if you select 4mm, you can only move or change size in 4mm jumps. For grids up to 5mm, an array of dots 5mm apart is displayed, and for larger spacing, the dots are spaced at the chosen size.

boxes with image content

As well as a background image for the whole page, you can add an image to a box: just drag an image onto a box.

When you do this, the box is not used for text to flow into from the template, just for the image. So if you want to use an image as a background for template text, add two boxes, one on top of the other, with the image in the one behind and a transparent background for the one in front.

The image is scaled so the width of the image fits the width of the box. Height is ignored, and any vertical extent of a portrait format image outside the box is not displayed.

You cannot remove an image from a box. Just delete the box to get rid of it altogether. Dragging another image to it replaces the image.

SVG is a good format to choose for images as it scales without degredation when printed.

preparing images

Template images - SVG, JPG or PNG - are uploaded to Cameo here for including in letter templates as well as stationery.

If you delete an image which is referenced by a template or stationery, you will get an error message when you try to use that template.

Images need to be uniquely named. Don't use spaces in the name as space is used as a separator when the image is included in the template.

If you try to upload an image with the same name as an existing one, you must tick replacement image(s) if you want to replace one of the same name, otherwise Cameo will object to the upload.

Because the point of a letter is usually to print it, images will almost always need to be prepared at a resolution suitable for printing at the size they are to be used. Convention has it that you should use 300 dots-per-inch (about 12 pixels per millimetre), though you can get away with less.

So if, for example, you want a 50mm wide signature to include at the bottom of a letter, it will need to be about 600 pixels across (50 × 12, or 2 × 300 in inches).

SVG is a good choice for scalability when printing because it is a vector image format, supported by all browsers. SVG can be created using, for example,

Note that text in SVG needs to be converted to outlines or rendered in Open Sans or one of the web-safe fonts (Verdana, Times, Arial, Trebuchet, Georgia or Courier) to be usable.

Alternatively you can scan a pre-printed letterhead, or print a blank from Word or whatever and save as a PNG image, then upload it here and include it in a background box filling the entire page.

top (contents)


The names of re-usable content snippets you make here appear on the Snippets menu in the template editor. When someone selects the snippet name from that menu, the corresponding proforma content is inserted into the template they are working on, for them to then adapt to their needs.

For example, you can provide buttons and structural elements of emails in your house style that are ready made for insertion, which can't easily be produced by the editor and don't need HTML knowledge once created. The HTML is actually inserted into the template, so changes to the snippets won't affect existing material.

Not all snippets need be included on the Snippets menu. You may not want this to happen while you are working on one, and you can also include other snippets within snippets from the menu above the html fragment here.

The content is HTML, so to add new snippets requires a working knowledge of HTML, and especially what HTML works well in the context of emails. Email clients are much more restrictive than web pages about what HTML they will display.

You can use substitutions (like '{show: called}') in these fragments if necessary (but for now, you have to type them rather than choosing from a menu as you can in the template editor).

How to...

top (contents)

Mailings workflow illustrated

Here is an illustration of the workflow for producing emails and/or letters:

list workflow
top (contents)

Enrol new members

enrolling a member

  1. Make corrections to the data the member supplied.

  2. Add data that we need to the record: primarily the delivery method and round. The map will hopefully locate them in a round for you if it hasn't been determined for you automatically.

  3. (Where relevant) also subscribe them to Cyclescape if they have requested it, and then indicate this has been done by clicking the link provided (in supported installations only).

  4. When the record is in a sane state, press the button to enrol the new member. This:

    • automatically assigns them a qrcode identifier (six uppercase letters)
    • sets the date last manually renewed (to be today)
    • changes them to be a current member (turquoise background)
    • prepares a new member letter with a membership card
    • moves on to the next prospective new member, if any

    New member letters are added to the pending letters list, where they can all be downloaded and printed ready for posting in a new member's pack.


New member records are shown with a yellow background (current members are gray expired members red and contacts mauve).

New members arrive in Cameo is when someone completes the a separate membership form on the organisation's website (here's the demo example). Therefore to add a new member manually (e.g. they filled in a paper form), fill in the web form for them, but use a seleted address (e.g. for the email address so they don't get an unexpected email in response; correct this in their record later (you won't be able to enrol them until you do).

New mebers can also be introduced by importing them in bulk; the built-in add member panel, or conversion from a contact to a member in the membership status panel.

Selecting new members displays a list of all of those pending under the search box and selects the first. The idea is to make any changes required and then enrol them, which moves on to the next record. But you can also select a new member manually if you want to skip some.

Sometimes people complete the form in error or perversely. Such spam forms can be deleted with the spam: delete button.

People are really inconsistent when entering their data - some will never use upper case, some always will, they'll format the postcodes incorrectly and so on. So when processing new members, the first task is clean up what they have entered.


Sometimes people fill in the new membership form when they are already existing or expired members, meaning to renew or rejoin. If they are at the same address, we'll detect this automatically and say so. If lots of details of changed we may not notice, but if you know this to be the case or they said so you can search for the original record manually.

In this case you can merge the records and retain the old membership number.

To do this:

  1. If we have detected the similarity, take the option to compare the records. If not find the existing membership, note the membership number, and then return to new members.

  2. Arrange search results so that only the existing member record and the new member record are shown. If we detect the similarity, you'll already see that, but if not, just enter the two membership numbers in the search box.

  3. Select the new member from the two results. Merge is only allowed when you have exactly two records found, and the one selected is the new one.

  4. Press merge.

Merging copies all the data from new to existing, except...

The new membership application is deleted once the information from it has been merged into the existing membership.

No correspondence is created, as this will typically vary from member to member (sometimes they will need a new card, sometimes just an email acknowledgement, depending on the circumstances). So you will need to generate an appropriate reply separately.

Note that if any attachments have been added to the new membership (unlikely), the merge can't proceed until you've removed them (you can save them and add them back manually).


New memberships (and incoming renewals) are imported when the web page is loaded. If you want to force an import, just refresh the page (F5).

top (contents)

Add contact

to add a new contact…

  1. Fill in the from provided to add basic details

  2. Press the new contact button

  3. Make any further amendments by updating the new record alongside

Once you've added one, the type and source are set from any contact selected (typically the one you just created) avoiding the need to re-enter those two fields in a batch of similar ones.

Also, a list of recently added contacts is shown below, so you can rapidly enter name and email, and then select all of them and make amendments later.


Contacts are people we communicate with but aren't fee-paying members. These might include political representatives, officials at councils, police etc., shops and interested bystanders (supporters).

Contact records are shown with a mauve background, though this can be varied by type if required, in the membership types panel.

contact types

Contact types and their properties help searching, and list sources. They are added and changed in organisation details.


It's helpful to have a record of how we came to include someone, and perhaps who added them, so we can determine whether they are stil relevant in the future.

Note the date added is already recorded for you so that doesn't need to be included in the source field.


The map matches the representative body (council etc) and area (division, ward etc) for the member with the contact records, so that we can identify their specific representatives (when we have them). By representative we mean someone with a contact type which is identified as a political representative by having the appropriate box ticked.

Local councillors are imported and updated from their respective council websites, using the button in update political representatives, so there is no need to add those manually here.

For parliamentary representatives, when not imported automatically, please ensure that the details are as follows so that we can identify them for each member:

top (contents)

Add member

to add a new member…

  1. Fill in the from provided to add basic details

  2. Press the new member button

  3. Make any further amendments by updating the new record alongside

Once you've added one, the type and source are set from any member selected (typically the one you just created) avoiding the need to re-enter those two fields in a batch of similar ones.

membership types

The membership type (as set in the ) determines how many individuals a membership has. For example, a Household may be defined as between two and five individuals. This is why the number of boxes for additional individuals varies according to type selected.

top (contents)

Import memberships

The import memberships panel, accessible only to administrators, allows membership records in an appropriate format to be imported to Cameo, for example from an older database or spreadsheet.

By its nature, this requires a significant amount of technical knowledge. See import format for the technical details.

top (contents)

Welcome contacts

This locates all new contacts and can then prepare welcome messages using the template set up to service the event 'welcome contact'.

Representatives are never marked to need a welcome. Otherwise, when a contact is added either by

they are marked as new (requiring a welcome) - unless the import explicitly turns this off, which can be done record-by-record. Conversion of member to contact does not mark the record for a welcome.

As well as Representative, you can also turn off sending welcome messages by contact type when you assign the template to service the event - see templates.

Sometimes people may sign up twice, and where we can detect this - either by email or by last name plus postcode - potential duplicates are shown so you can deal with them first.

top (contents)

Manage duplicates

finding duplicates

This panel searches for potential duplicate memberships, for example when a member asks to join when in fact they already are or were a member; or when they were originally in the database as a contact and now want to become a member.

Potential duplicates are listed in pairs in the search results, so the first is a possible duplicate of the second and so on, the thrid of the fourth, and so on. As duplicates are "resolved" by one of the methods offered, the pair is removed, so generally you can work down the list leaving the first selected and the second the possible duplicate.

When new memberships are added individually, from a membership form for example, duplicate checking is carried out automatically. This panel is useful when many memberships are added in bulk though an import, or retrospectively.

criteria for being a possible duplicate

A membership is considered a potential duplicate if either

resolving duplicates

For each pair of possible duplicates you can take the following actions:


The merged membership (M) comprises mostly the information from the first membership of each pair (A) except for the second (B) as below:

B is deleted.

top (contents)

Incoming renewals

processing a renewal

  1. Make any changes the user specifically requested - we often get things like changes of address at the same time as a renewal.

  2. Also make any changes they made through the form. These are highlighted in red. For example, a changed payment method or a new gift aid declaration. Click the red text to apply the change, and then review it.

  3. Then press either renew m'ship or confirm renewal:

    • renew m'ship is for ordinary renewals; it updates the expiry date and the date last manually renewed.

    • confirm renewal does not update the expiry date. This is for people who would normally have renewed automatically - and the date has therefore already been incremented - but because of a rate change etc, they have been asked to use the form to update their payments.

    In both cases a thank you email or letter is generated (using the template called renewal thank you email).


Annual (or other period) manual renewals (as opposed to automated payments by standing order or direct debit) usually come from a form on the organisation website (here's the demo example). These are listed in the incoming renewals panel. However, sometimes renewals are received by post or in person, so there is an additional entry at the top labelled DIRECT where these can be processed.

The member usually gets to the renewal form by following a link provided in their renewal notice, which in turn is sent from the renewal reminders panel. That link contains their qrcode, which is then included here. This allows the correct member record to be matched up with the renewal under the search box. Sometimes they don't have this link, in which case the match may be imperfect and you may have to find the member yourself or choose the right one from several possible matches.

The qrcode in the link they are sent is also used to obtain information from Cameo to present the correct information to them in the form. Using the qrcode allows us to identify them without needing them to have a password etc while not disclosing any personal information.

Because the information in this panel comes from a web form, it can also be spammed. Therefore you can delete a renewal with the spam: delete button with no further action.

top (contents)

Renewal reminders

This panel, usually processed monthly, generates emails or letters to remind members who do not have an automated annual payment set up to renew their membership, and reminds those who do that their renewal is about to happen.

The list members links display the members affected by each kind of renewal reminder below the search box. Note that members whose payment is overdue are shown with an orange background in the 'expires' column of the member list, and if very overdue, then red.

There are three kinds of reminder:

Cameo remembers the dates for which the most recent reminders of each type were sent, so the next batch start from the day after that then until the end of the corresponding month.

Letters prepared are downloaded from pending letters and emails tested or actually sent from pending emails.

People who fail to renew need to have their membership cancelled. This is done using the overdue manual renewals panel.

top (contents)

Overdue manual renewals

This panel allows you to cancel the memberships of all people who fail to respond to renewal reminders in a batch.

Typically processed once a month, it remembers the date for which it was last processed, so you shouldn't miss any.

However, even if there is no one who failed to renew, you should still press the cancel all button to indicate that the relevant month has been done.

Members affected are listed underneath the search box.


Cancelled members aren't completely removed (at least, not for up to five years), but stored separately. This means they can be reinstated if they do later rejoin (or if you want to run the whole monthly batch but then explicitly allow them to remain current).

Conversely, when someone explicitly asks to resign, or says they have moved away, or has had a previous exception made, their membership can also be cancelled individually in member tasks.

Members who cancel their automated payment, but don't tell us, will be picked up after reconciliation, which attributes payments that have been received to corresponding memberships, using overdue automated payments. Such memberships are cancelled there, but usually only after asking them.

top (contents)

List subscriptions

Use this section to amend list subscriptions, either opt-outs from automatic lists (those which someone is sent to automatically because of something about them unless they are opted out) or manual lists (to which someone has to be subscribed explicitly). Add or amend lists in lists.

List subscriptions are managed for each individual in a membership. Opt-outs from automatic lists and subscriptions to manual lists and are shown beneath individual names in the membership details, the former with a red line though. You can jump straight to list subscriptions by clicking subscriptions next to these details, or to a specific list by clicking the listing alongside.

Viewing and changing subscription status

Click on the name of a list to select it and display the subscription status for everyone in the search results. The results are colour coded - green for subscribed, and red for not subscribed.

Change their status with the button alongside, to:

If the member listed does not satisfy the criteria for an automatic list, so would not be part of it anyway, it is shown as not applicable. If none of the memberships in the search results satisfy the criteria, the colour of the list name is also changed to indicate this.

Opt out from all automatic lists is a special list which controls an overriding opt-out from all automatic lists now and in future.

For manual lists only, if there is more than one individual in a membership and none of them are already subscribed, and extra row is added with which you can subscribe them all at one go. Furthermore, if there is more than one membership in the search results, another extra row is added at the end with which you can subscribe everyone at once (for example, if you collected a list of subscribers on a sign-up sheet).


Data protection law now requires verifiable (auditable) permission to be obtained for certain mailshots. To support this in Cameo, a list subscription can be supported with evidence, which can include:

Not everything requires evidence. For example, if a list is being used simply to group people together with similar characterisitics (membership of a sub-committee, say), or for transactional emails. Cameo does not insist that the evidence information is completed.

Where someone has used a form to request subscription (e.g. a membership form or subscription preferences), the form should supply the evidence in the first place (see API for programming details).

The table of subscriptions displays this evidence for subscribed lists. You can amend it if necessary, just by changing it in the form. If you un-subscribe from a list, the previous evidence is deleted.

When subscribing (or re-subscribing after an opt-out), complete the evidence first where needed, then press the button. Unlike existing subscriptions, changes to the evidence is only applied when the subscription is actually enabled.

Manual changes to evidence are recorded in a membership's change history in the usual way.


One form of evidence is an attachment. An attachment is just a file attached to a membership, and will appear alongside other general purpose attachments (managed in attachments). So when you select choose attachment, a menu of their existing attachments is offered for you to choose from. You can also add a new attachment here (this does exactly the same thing as uploading it in the attachments section).

Then when you subscribe, the attachment is included in the evidence for the subscription.

Where a subscription is being applied to multiple memberships (see above), it isn't possible to choose the attachment from existing ones, and when you upload one (say a paper sign-up sheet), separate copies are made in each of the memberships.

top (contents)

Membership status, cards and qrcodes

All member tasks work on the membership selected under the search box.

Deal with resignations, rejoining, reversing mistaken cancellations etc. in Update status.

Depending on what kind of member or contact they are, you can:

If someone says they are moving in some months time and want to cancel then, you can add a reminder for that member.

If the selected entry is a contact rather than a member you can

Membership cards and qrcodes

This section deals with membership cards and their associated six letter unique identifers which can be used as a 2D barcode called a QRcode printed on the card, though they can also used for things like personalising mailshot opt-out links.

You can make prepare a duplicate or replacement membership card simply by clicking new card. This prepares the card using a template servicing replacement card events.

If a card is lost or stolen, you will need to cancel the old one. replace qrcode marks the member's old code as invalid, so if the corresponding barcode is scanned it will show up as such, and gives them a new one. You can then make a new card as above.

Note that issuing cards and qrcodes is done automatically when enrol new members are enrolled, providing a template is assigned to service new member events.

top (contents)

Review amendments

Where enabled for a Cameo installation, it is possible to have members update themselves via a separate web site. These details can be

This requires some method of authenticating the member (for example, allowing them to click a button in an email or a login mechanism).

When this happens the updates are brought into Cameo (in the same way as a new membership, on Cameo login or when the Cameo page is refreshed) and applied to the relevant memberships.

The review amendments panel then allows these changes to be reviewed in case someone made a mess of their update.

When a particular change is selected (by clicking the row or just going through them systematically), the membership that was changed is located.

You can then

top (contents)

bulk changes

All member tasks work on the membership selected under the search box.

In this case, the selected membership is used as a source for making changes to nominated fields in all the other search results (so there must be at least two memberships visible).

This allows similar changes to be made to many records at the same time, in bulk. In short, to make some fields of some records the same as another.

Only certain fields (including custom fields which apply to the whole record) are offered for change. This is because of the dissimilar nature of records, and because there is no value in, say, making everyone's name or address the same. (Addresses are arguable, and if a need arises for this, the fields on offer can be extended).

Furthermore, only fields which a user's privilege allows them to see are offered. Where you only have the ability to change one of members or contacts, you cannot proceed if any record of the other kind are in the results, though you can use those you can view but not change as the source for changes to those you can change.

incompatible changes

Because of the diversity of records and constraints of one field on another, there are cases where changes cannot be applied.

Fields which are specific to contact or member are highlighted: these are particularly record-specific, though not the only ones.

top (contents)

Send canned message

All member tasks work on the membership selected under the search box.

From this panel you can prepare ready-made messages (based on a template) to be sent to an individual member:

Once prepared, send pending emails and download pending letters separately.

For multiple members, including everyone, use templates instead.

The one-off message button is similar, but just provides a short cut to choosing a template to send a one-off message. It uses a pre-defined template which services the "oneoff message" event, which will usually have minimal or even empty content, does the merge, and then opens the merged message for you in pending emails to add your own text and then send (either immediately or schedule for later).

top (contents)

past communications and change history

All member info sections work on the membership selected under the search box.

In this panel, see:

You can also delete a pending reminder message that is no longer relevant, or reschedule it for a different date by replacing the date due.

In time, the plan is to also make change history searchable, but that's not possible just yet.

top (contents)

Map and representatives

All member info sections work on the membership selected under the search box.

This panel simply attempts to locate that member's address on a map.

It also shows which political areas they fall in.

top (contents)


All member info sections work on the membership selected under the search box.

Each membership can have an arbitrary number of files attached, for example PDFs of correspondence, photographs etc. These are indicated at the end of the membership record, and clicking there takes you to this panel.

Existing attachments for the selected membership are listed. You can:

You can add a new attachment to the membership by dropping a file in the box indicated or choosing it from a file selection dialogue.

top (contents)

General search

While the main search box only searches in the main fields to quickly find particular members without lots of extraneous results, general search lets you search most of the text fields in a membership record by default, or restrict to particular fields.

Furthermore, unlike the simple search, general search works on the search term words independently, so a match is found when any of the words match in any of the fields in any order. However, it isn't incremental, so all words must match completely.

You can choose which fields to search in, or all of them; in just new, current or old memberships or any combination; and by electoral area.

For general text fields you can also use wildcards in your search. * matches any sequence of zero or more characters, and ? matches any single character. By extension ?* matches one or more characters; you could use this on its own to find whether a field has anything in it (though you might get a very large number of results, rather slowly, on widely used fields).

For example, searching for for "New*t*" in address would give Newcastle, Newtown, Newmarket and others. Searching for "?*" in phone numbers would find you all memberships that have a phone number listed.

You can choose what kinds of membership to search in. For contacts you can also choose to exclude those contact types nominated in their definitions in contact types.

top (contents)

Map search

Map search selects current members geographically from a map. This is useful for determining recipients of a mailshot which is relevant to a particular area. You can search:

You can use this in conjunction with refine search to combine people in several areas or say everyone in an area except those in some other part of it, or indeed in combination with other kinds of searches.

You can also save your search area so you can do the same search again later, and also to be able set up a regular mailshot to people in that area as they change: see below.

You can only search for current members, or (if the box is ticked) contacts.

How to search

All the existing search results are all also shown on the map (in contrast to map where just the selected member is shown, but with more detail).

Adjust the search distance using the box provided. (This distance is not used for closed shapes). Distance is approximate: a few memberships near the edge of the area may or may not be included. Also, we may only be able to locate a member by their postcode, which is also not a perfectly accurate indication of their actual location.

Click on the map to mark a point: you'll see the radius you specified around it.

Click again to make this into a line, and again to extend the line. Again, you'll see the area of search.

With three or more points already added, click the first point to join it up into a closed shape.

The C (clear) button, on the edge of the map removes the point, line or area so you can start again.

Insert a new point half-way between a pair of points by clicking the mid-point shown with an open green square:

If you click an existing point it is selected (or deselected if already selected). The selected point is shown in a lighter green:

Delete the selected point with the X button on the edge of the map.

Drag any point to move it. (There is no reason to insert a point between two others if you don't then move it!) The dragged point is also selected.

Once you have the desired shape, click search. The members in that area are displayed like any other search result, and also marked on the map with blue crosses. Hover over a cross to see who it refers to. Click it to select that membership alongside.

Named areas

Once you have prepared a shape on the map within which to search, you can save that area with a name: put the name in the box and press the save button (you don't actually have to have done the search in order to save an area).

Once saved, you can recall that shape by choosing its name from the list provided.

After doing this you can search for the members in that area just by pressing the search button.

You can also amend the shape if you want, just as if you had drawn it from scratch. And after amending it you can replace the saved search with the new shape using the replace button. The delete button deletes the selected area.

Saving an area also adds the area as a source for automatic lists. Using lists, you can create a new list targetting people in the area by selecting the area name as the source of the list. This means you can then send mail to the people in that area as they are at the time the mailshot is prepared. This is similar to showing the area, searching again and then mailing to the list of people you found, but if you are doing this regularly it is easier to make a list for it, assign it as the audience of a suitable template and just send messages using that template. More importantly, using a list offers opt-outs so people can exclude themselves from further communications (either for that list, or any).

For example, let's say you draw a line along Milton Road and set a search distance of 200 metres. You might find there are 20 memberships in this area when you do the search. Now you save the area, calling it 'Milton Road'. A few weeks later you come back and show 'Milton Road' from the list of saved areas, and search. This time there may be 22 results, as more people have moved to the area.

Now, you want to send people in the area a regular update. So you make a list called, say, 'Milton Road residents', and choose as its source 'area: Milton Road' (which is available because you saved it as an area). Then make a template, called say 'Milton Rd update' with 'Milton Road residents' as the target audience, containing your message. In templates, choose the 'Milton Rd update' template and prepare the emails (or letters) using the buttons at the bottom right. There might be 20 the first time. In a few weeks you send another one: just update the template with the new message and prepare the emails. There might be 21, including the two new people but exclusding one because they chose to opt-out after the first mail shot.


You can export the search boundary currently shown on the map, possibly including points for each marked search result, using the links provided just under the map.

Export is to a geoJSON file. GeoJSON is a widely used interchange format for points and areas on maps. The filename is formed from the name currently selected on the named areas menu, or if there isn't one, then on the date and time.

If search results are included, these have a few properties to identify the membership record, which consumer geoJSON apps may or may not recognize. For example, if you open an exported file in the online editor, the markers it shows for each membership location will be displayed in the same colour as in Cameo.

Membership locations contain personal information (membership number, name and geographical location) so are subject to data protection regulations.


Conversely, you can import one or more named areas from geoJSON files. Just drop a geoJSON file as indicated in the named areas section. If you only wanted to search, not create a named area, simply delete it afterwards.

Search areas are a single polygon, (radius around a) point or (distance from) a single line. GeoJSON files can contain many of these. Therefore a named area is created for each such element in the file. They are named from, in order of preference,

Duplicate names (e.g. if a named Feature contains several polygons) are resolved by appending numbers in sequence.

top (contents)

Date search

Finds membership records of the selected type where the value of the date field selected falls in the requested range.

Dates are quite general. As well as flexible date format, you can ask for relative dates like 'today', 'yesterday', 'last month' (i.e. the first day of the month before the current one), 'this month', '5 months ago' and so on.

top (contents)

Miscellaneous queries

Simply finds memberships according to the criteria shown.


Donations are attributed during statement reconciliation, so information won't necessarily be available for the most recent transactions. Also, attribution to separate subscription and donation was only available after 1 October 2016, so results before that are not useful.

top (contents)

Refine search

Refine search lets you combine search results in various ways. This is particularly useful when preparing a list of people to send a mailshot to according to multiple criteria.

Having obtained a list of memberships in the right hand column (however they come to be there, whether searched for explicitly or as a side effect of something else, such as selecting enrol new members), you can then save the list, do another search and then add or remove results in one list from the other.

You can also save, combine and restore saved searches using the links under the main list of results, as well as step through the saved results one at a time, without having to visit the refine search section.

The saved searches are personal to you, not shared with other Cameo users.

Note that when the search results list is abbreviated (only the first ten or so results are shown if there are a lot), only the memberships actually shown will be included in any combinations: you have to show them all first for them all to take part.

To illustrate, assume the membership numbers in saved list (S) is currently 1 2 3 4 and the search results list (R) is 2 3 5 6 7

Finally, you can display detail for any saved membership by clicking on the membership number.

top (contents)

Import statements

Bank statements are provided by the relevant most banks in a variety of CSV formats. If a paper statement is the only recourse, if necessary these can be constructed manually from them.

Use this panel to import the transactions in one or more such CSV files, or other attachment files such as a scan or image of an actual statement (PDF scan or OCR'd XLSX file or similar as a true record of the statement), against which membership payments can be reconciled.

An uploaded CSV file identifies the account it contains transactions for by starting its name with the account's identifier (as defined in the bank accounts panel. If this identifier is immediately followed by a number, that number is used as the sequence number of the statement imported; otherwise the next available sequence number is used. For example, 'C204-May-2017.csv' says import the transactions in that file to account 'C' sequence 204 (the rest of the name, if any, just being for your own reference). If afterwards we then import 'C-Jun-2017' (no number), that would become sequence 205 for account 'C'.

Other attachments can have any name you like so long as they are unique. Initially attachments are not attached to any statement, and are shown at the top of this panel. When selected, by ticking the box, you can then either delete the selected files, assign them to a particular statement that already exists (by virtue of its CSV having been uploaded already), or have them attached to the next CSV that is uploaded.


If a CSV won't import, the most likely cause is that the bank has changed their CSV format. Administrators can change the rules by which a statement is imported in the bank accounts section.

Be careful with character encodings: if you need to manipulate the file, use Google Sheets, which encodes dates and pound signs properly in CSVs (using "UTF8"), not Excel (which uses a proprietary Microsoft encoding).

csv formats

Cameo understands how the csv is formatted for a particular bank in one of three ways:

Automatic imports

Some accounts can be set up in the Bank accounts panel to import transactions automatically.

Administrators can test automatic imports using the button provided art the bottom of the Import statements panel.

You cannot manually upload a CSV for an account set to import automatically.

top (contents)


This is the process of matching bank statement transactions to memberships, deposits and invoices etc. and is one of the more difficult tasks because of the often inadequate information the banks provide.

Each transaction (that isn't recognised from the start) is marked as in need of reconciliation when the statement is imported. That makes it appear in this panel.

Each transaction should then be accounted for in one (or more) of the ways listed below. When done, the transaction is marked reconciled and disappears from this panel.

This means that when statements are viewed their transactions are linked to the relevant member(s), deposit, or otherwise referenced. Conversely, the member's payment history selects from bank transactions linked to them.

finding memberships to attribute a transaction to

When a transaction is selected, an attempt is made to identify memberships it might relate to, based on the way the bank describes the transaction. For example, a number somewhere in the description may be the membership number, supplied to the bank as a reference.

Normally only those memberships recorded as paying in to the same account to which the transaction belongs are matched. However, particularly when changing from a manual to recurring form of payment, they may change the destination account. So if they don't show up at the first attempt, try Check all accounts to broaden the match to any membership.


For each transaction, choose one of the following to attribute the payment:

  1. not related to membership: this just marks the transaction as reconciled, without linking it to anything. Used for things like interest payments and inter-account transfers. Put a comment in the box if further explanation is useful.

  2. Select (outlined in blue in the list at the top of the first column) the member to be associated with the transaction and choose selected membership.

    This will attribute the membership fee, any regular donation listed in the member's donation box and any overpayment listed in the Overpayment box. The total amount should match and there is a warning if it doesn't.

    The amount actually paid (or a lesser partial amount if you change it) is allocated first to subscriptions, then if there is anything left, a donation up to the amount given, and if any more then to an overpayment.

    If used for a contact, there is no membership fee, so only regular donations are accounted for.

    Banks describe transactions in weird and wonderful ways, often truncate names and so on. Therefore when you choose a transaction to reconcile, Cameo tries to find members it might match to with what information it has got. It's quite good at finding the right one first time, and if not it is likely to be one of the others in the list.

    Occasionally, there are no clues, for example when only the bank account number is quoted. In this case you will need to determine the member, if necessary by phoning the bank, and then search for them manually.

    You can improve things for next time by saving e.g. the bank reference quoted on the statement in the relevant member record in the Bank Reference box. If they run the sort code and account number together, or append extra digits, treat as a whole "word" and include it all. If they cut off some of the surname or have it down wrong, put what they do say in the bank reference and it will match next time. Note that some banks (e.g. Lloyds) also quote their own internal references which are transaction specific, so there's no point in including these.

    This option is a short-cut for the following three, when the amounts are all already determined by the memebrship.

  3. donation only will also attribute the payment to the selected membership (or contact), but it does not assume it is anything to do with the subscription. This would be used for regular and one-off donations which weren't part of the subscription process. For example, a member might pay an annual subscription and a separate monthly donation, and the latter would be attributed using this button.

  4. donation no gift aid is just like donation only, but it marks the payment as not eligible for gift aid, so it is not included in any gift aid returns as it does not qualify under the arcane rules of HMRC. This is in addition to any exclusion by tax year that might apply to the individual. If a single payment partly qualifies, you can split the amounts into two separate donations, one with and one without gift aid eligibility.

  5. subscription adjustment works like a donation only, in that it attributes the payment to the member, but does not take into account any amounts listed for the membership. This allows for underpayments later paid to be attributed, and also payments (negative amounts) to be deducted if a refund is made.

  6. subscription no gift aid is similar, but marks the subscription payment as ineligible for gift aid (perhaps because there was some benefit attached to the subscription that disqualifies it). If no subscriptions are eligible for gift aid, these can be excluded completely when generating the gift aid return: you don't have to mark each one.

  7. membership overpayment is also similar, in that it attributes the payment to the member, but does not take into account any amounts listed for the membership. This allows for unexpected payments, where there may be a liability to repay later on. For example, a standing order for a retired member is not cancelled.

  8. deposit ... A deposit record is created when the cheques are paid in, and those deposits dated within fifteen days of the selected transaction are listed here.

  9. If there isn't a cheque deposit to go with an incoming payment (e.g. it was paid by bank transfer) choose transaction with reference and provide the reference in the box provided, such as an invoice number.

Multiple attributions

Sometimes a statement line may be attributable to more than one membership or transaction. For example, say someone made a funds transfer in lieu of cash takings from an event.

In this case, just set the amount for each part and follow the same procedure, until the whole transaction amount is accounted for, when it will be reconciled and removed from the list in the same way as single attributions.

You can remove partial attributions in the same way as unreconciling, either here or in the statements panel, and a partially completed attribution is indicated by +? after the references on the statement line to the partial attributions already done.

The information is stored with each partial attribution, so you can do some and return to the rest later.

Don't use this method to attribute parts of a deposit. Deposit items can be partially attributed within the deposit itself.


If you make a mistake and realise immediately, you can, of course, Undo the reconciliation. However, if it comes to light later that a transaction was wrongly attributed, you can correct it as follows:

top (contents)

Overdue automated payments

Once bank transactions are reconciled there may well be some expected membership subscriptions paid by standing order or direct debit that haven't arrived.

This can be because:

Members for whom expected automated payments are overdue for more than the time specified are listed under the search box.

You will then want to find out what's happened, and if it is not obviously our mistake, ask them. You can do this using the enquire button. This:

If the enquiry resolves the problem, make the necessary corrections and remove the Payment Enquiry form the membership record.

But if there is no response, say by the next month, or they reply saying they wanted to resign, the overdue payment will still show up here, with the noted enquiry, and you may then need to cancel the membership using the cancel m'ship button.

mis-attributed payments (un-reconcile)

If a payment was attributed to the wrong membership, you can correct it as follows:

top (contents)

publish accounts

This makes accounting information available for download in export. It takes a snapshot of the completed membership updates and bank transactions so that it reflects the state for that month.

Files and formats are installation dependent.

top (contents)

Cheque/cash received

When we receive a cheque (or cash) to be paid in to the bank, whether for membership subscription or otherwise, record it here. You can do this as and when the cheque is received rather than waiting for a batch of cheques to be ready to deposit.

Searching for the member who paid the cheque will reduce the amount of inputting.

The cheque should be attributed to either a membership subscription, member's donation or something else (such as an invoice payment). Add the appropriate element with the links below the cheque details. You can add as many as necessary: for example it is common for a cheque to include elements for subscription and donation. Also, someone may have provided a cheque in lieu of cash covering several memberships for different members.

The panel records information on the cheque. It:

but these may need correcting.

Also, take a photograph of the cheque (both sides) and upload it here as evidence we did deposit it. You can include several cheques in one scan if they are all to be paid in together: the scans will be attached to the deposit in the end, not the individual cheque.

When you are ready to pay in a batch cheques, use make a bank deposit.

Completed deposits are listed under deposits in accounting info, where you can also:

top (contents)

Make a bank deposit

Record cheques/cash separately first, then when ready to make a deposit, record it here.

recording a deposit

  1. If the reference, destination or deposit date are wrong, correct them.

  2. The panel offers all the outstanding cheques: deselect any you don't propose to pay in yet.

  3. Similarly deselect any attachments already uploaded which aren't relevant to this deposit.

  4. click the make deposit button.

completed deposits

Completed deposits are listed under deposits in accounting info, to which you are transferred immediately after recording the deposit.

Here you can:

(All being well) a deposit will appear on a bank statement some time later. The bank statement transaction should then be matched to the deposit during reconciliation.

top (contents)

Statements and transactions

This panel lets you examine a bank statement transactions.

Choose which transactions:

Order: Click ⇕ to display transactions in the opposite order (most recent first or last). This is remembered so the order stays that way for all statements until you change it.

Find: Type some text in the find box and press Enter to find a line with a word starting with your text or an exact reference (i.e. numbers are compared exactly, while words are matched partially). If there is more than one result, you can move to the next just by pressing Enter again. Searching is case-insensitive, but otherwise exact.

Download: Bank statements are obtained from the relevant companies as CSV spreadsheets and then imported. The CSV files are retained so you can download them by clicking on the spreadsheet icon underneath the statement.

Additionally any other files can be attached to statements when importing (such as scans of paper statements), and these can be downloaded in the same way.

Export: buttons at the bottom export the transactions shown in a variety of formats. Microsoft Excel and Google Sheets should be able to read all but QIFs, which is suitable form many accounting packages.

Corresponding membership: Once the transactions on a statement have been reconciled many transactions will be associated with particular membership(s), so you can look up that membership by clicking the membership number shown with the transaction.

Conversely, a member's payment history finds all the transactions associated with them.

Cheques paid in in batches show up as one bank transaction associate with more than one member.

Un-reconcile: If a transaction has been attributed incorrectly you can click ≠ to mark it unreconciled, which will remove all references associated with the transaction, and it will then appear in reconciliation to be corrected.

top (contents)


This panel lists cheque deposit details, starting with the most recent deposit.

You record deposits by first recording cheques received and then collecting them using make a bank deposit.

Once reconciled deposits are also linked to from bank statement transactions.

From this panel you can

Generally, don't deposit cash. Instead, keep the cash and make a corresponding bank transfer or write a cheque. This allows for much better accountability by leaving an audit trail.

top (contents)


This panel provides files of monthly accounting information for use in preparation of the accounts. Only accounts which have been previously published are available.

This task can also be automated using the Cameo API.

The details of what is provided are installation dependent.

top (contents)

Gift aid declarations

This panel lists members who have made gift aid declarations in the past month or so, or between selected dates, and generates HMRC's rebate spreadsheet.

The list is displayed underneath the search box. It comprises those members whose gift aid declaration date field is set and that date falls between the dates chosen.

Gift aid declarations can arise by a member:

Obviously, only those declarations for renewals which already been processed or entered will be shown. However, this happens automatically for new members so these are included as soon as they arrive.

Rebate spreadsheet

This is in the format required by HMRC for reclaiming gift aid for the organisation's financial year ending on the date given. It takes into account rescinding, temporary or otherwise, of gift aid declarations as indicated in the membership.

Any subscriptions or donations which were marked as not eligible for gift aid when they were reconciled and attributed will be excluded. If only donations are eligible for gift aid (perhaps because subscriptions include a benefit which means they cannot be claimed against) then all subscriptions can be excluded from the claim by ticking the box.

This downloads a CSV file, whose contents can be copied and pasted into the HMRC spreadsheet. Omit the last column when doing this - it is there just ass an audit trail on how the entry was arrived at. Also divide up into 1,000 rows at a time - a blank line indicates such divisions.

The spreadsheet usually sorts out first and last names correctly from the gift aid field. However, where a last name is space separarated and doesn't start with the prefix 'Van', 'De' or 'Den', use a slash to indicated where the last name starts, as in "David / Campbell Bannerman". (Apostrophes don't need special treatment: "O'Connell" is fine).

top (contents)


To meet responsibilities under the Data Protection Act, remove membership details for memberships which expired more than a certain number of years ago.

This panel lists the affected memberships, which are, of course, all expired so should all be red.

The purge m'ships button then permanently deletes them from the database.

You can still Undo at this point, but once the Undo information disappears as your session expires, only backups will then store this information. Old backups will also eventually be deleted too.


Non-transactional emails can also be deleted, to recover the fairly substantial space these can take up after a while. This means emails produced through template mailshots rather than those specific to an individual such as renewal acknowledgements produced as a side effect, or emails sent specifically to a member through send canned message.

top (contents)

Update political representatives

As there are several hundred to maintain, councillors from local councils are kept up to date from their respective council websites, managed from this panel.

The update adds new councillors, removes those who have not been elected, and updates continuing councillors. Continuing councillors are identified by the unique number held for them by the releavnt council, and when this is found to be the same as one already in the contacts list, the details are merged. So things like delivery rounds and copies are kept unchanged, but any change of address or email etc. is noted.

Because councils don't, in general, provide a simple downloadable list of this information, it is derived from the web pages for each individual councillor (this is identified in the URL field of the record). This relies on the format of the web page, so if it changes, chances are we won't be able to extract the information from it and the import will fail. In this case, no changes are made to any records (that is, we try to get them all before we make any changes to our data).

Also for this reason, councils have to be programmed individually to match the format of their pages. That means we can't do every council, only those for which an import script has been written.

You can also export all representatives to a CSV file from here.

top (contents)

Organisation details

You can see and, if you are allowed to make changes, amend organisation details here.

(Note that contact types have moved to the membership types panel).

These are primarily used when substituting values using the corresponding template macros. For example {insert: abbreviation} inserts the abbreviated name of your organisation.

Treasurer email is also used as a default address to send accounts publication to.

Next available membership number

Next available membership number will be allocated by Cameo for the membership form when someone starts to use it. You can increase it manually to reserve some numbers for other uses (such as imported lists of memberships when setting up in the first place, or for a stick of membership numbers if Cameo were not reachable).

Template images

If a method other than None is selected, the image button in the template editor includes an image selector where the images available are derived via the template images URL. When an image is chosen, the email produced by the template will embed the selected image from that URL.

There is no point i trying to limit access to any of this, as the whole point is to make the images publicly accessible in the end.

Opt-out URL

Opt-out URL is the page people would be linked to by the {show: optout link} substitution in emails. The link you give will have query parameters m, q and l added when emails are generated, for membership number, qrcode and name of listfor which the email is produced respectively. The script can use the parameters in conjunction with the API to update the list settings for that membership, or simply email them somewhere for manual attention (you could use an off-the-shelf Google form for this using their "Get pre-filled link" facility). For example, if you give

The link generated in an email would look something like:

If you don't supply an opt-out URL it is constructed from your Wesite URL and the path '/membersip/optout/'.

top (contents)

Incoming email

Administrators can set up a connection to a third-party email mailbox (such as a GMail account) so that any Cameo user can send to Cameo by email:

Cameo periodically checks the email account, much like a desktop email program would.

Email account set up

You need an email account dedicated to this purpose, which provides IMAP over a secure TLS connection. Most do. GMail and are obvious candidates (this facility has been tested with both of these).

The address(es) you actually send to can be arranged to forward to the provider's inbox if you want to use an address more related to your organisation.

The provider's help pages will list a domain name (such as and port (typically 993) which you should give to Cameo, along with your account login credentials. For example, GMail accounts use the full GMail address they issue as the account name. Here is GMail's help page.

For some providers, the password will simply be the one you created when opening the account. However, for many, including GMail, you need to create separate passwords for third-parties like Cameo to access them.

The account doesn't need much space: messages are deleted as they are consumed by Cameo (though GMail interprets 'delete' as 'archive' by default, so may need occasional clearing out).


To do this using GMail:

  1. create an account
  2. enable IMAP in "Settings - Forwarding and POP/IMAP" (and Save Changes)
  3. turn on two-factor authentication in your account "Sign-in & security" settings.
  4. in the same section, just under 2-step verification, create an "App password", and supply that in Cameo's password box.

GMail's imap server and port are and 993 respectively.

You can use the GMail address they provide directly, or set up forwarding from another address to the GMail address. and Hotmail

For (Microsoft's free email accounts, successor to hotmail), just provide your account email address and password for the account credentials.

The imap server is and port also 993. These details are shown in "Settings - Mail - POP and IMAP" in Outlook webmail.

Unlike GMail, two-factor authentication is not required for But if you do turn it on, you also have to obtain a separate app-specific password for Cameo, from the Microsoft Account Management pages.

Again, either use your new email address provided, or forward to it.

Sending email to Cameo

For security reasons, Cameo will not accept email submissions which are not made from either a Cameo user's email address or one of the email addresses listed in the organisation details. (Currently, someone could forge one of those addresses, but if it becomes a problem, we may use a mechanism called SPF to prevent this).

The kind of email (reminder message, attachment or whatever) is given either as

For example, if your basic incoming email address stated in the Cameo set-up page is, you can add a reminder message by sending to This is particularly advantageous with GMail where any address can be suffixed with "+something" and it will arrive in the same inbox with no other set up required.

For custom domains used to forward to GMail or whatever, if you are able to set up email forwards using a pattern (such as forwarding tocameo(\+[^@]+)? to, you can do that with any domain into any mailbox, or if not, then a set of separate addresses can be created for each variant.

If using the To address isn't possible, you can state the intention in the subject line, preceded by a plus. For example:

    This is a message +reminder

There are several variants possible for each kind of email to make it easy to remember if you are just typing the email address or amending the subject line (see below). Of course, you would usually want to add commonly-used ones to your address book.

identifying memberships

Some kinds of email must, or can, identify the particular membership they refer to. For example, which membership a reminder message relates to, or which an attachment should be added to. This can be done in a number of ways, and in each case, the identifier can be one of

In order of precedence, these can be given:

reminder messages

Reminder messages are sent to the basic address with one of these address suffixes or subject line indications:

With nothing further, the reminder subject line will be the subject line of the email, and the reminder's body text the email body text, and it will be set to remind today.

If a particular membership is referenced (see above), the reminder is linked to that membership.

To set the reminder date, put it in the subject line enclosed by curly brackets, in any sensible format. For example:

    I am a reminder to fire on {30 Dec 2017}
    I am a reminder to fire in {3 weeks} for member #123

membership attachments

These must identify the membership in one of the ways shown above, otherwise the email will bounce.

You can use these suffixes/subject lines:

However, any email with an identified membership and no suffix is treated as an attachment to a membership.

If the email has attachments, each is added separately, and the subject line plus email text body (if any) goes in the description of the attachment. But if the email has no attachments, the email body text is attached as a text file, described by the subject line.

file store files

You can use these suffixes/subject lines:

However, any email which does not identify a membership and has no suffix or indication in the subject line is treated as a file store file.

If the email has attachments, each is added separately, and the subject line plus email text body (if any) goes in the description of the file. But if the email has no attachments, the email body is added to the library as a text file, described by the subject line.

You can provide tag words for the file, preceded with a hash (to avoid ambiguity with identifying memberships they must not be all upper case or numeric). You can give more than one, separated by commas (no spaces) or in separate hash tags, thus:

    This is for the filestore tagged #brown and #yellow
    This is for the filestore tagged #brown,yellow

You can also indicate the file is only visible to financial or admin users in the subject line with @financial and @admin respectively.

deposit evidence

This is particularly useful for scanning apps where you don't have access to Webdav (which provides direct filing in to Cameo), but where you can "share" the scanned document by email.

Use one of these suffixes/subject lines to indicate deposit evidence files:

The email must contain one or more JPEG images or PDF attachments, which are simply added to Cameo as deposit evidence files.

The email body and subject are not saved.

gift aid declaration

This is particularly useful when someone makes a manual declaration by email, which you can then simply forward to Cameo, which wil also keep the email as evidence. The email must identify the membership, as shown above, or it will bounce.

Use one of these suffixes/subject lines:

If the method used to identify the related memebrship also included a real name, it is used to attribute the declaration. Otherwise the called field of the identified membership record is used. An attempt is made to deduce the original date from the content, but is otherwise the date of sending the email.

The plain text body of the email is also attached to the record, as evidence of the declaration. Any other attachments are ignored.

Cancelling incoming email

Once set up you can cancel incoming email so it is no longer processed.

Note that if you undo this, the credentials wil be restored, but the email processing will not resume automatically until the following morning. You can force it to resume by resubmitting the credentials, for which you will need to know the password.

top (contents)

Delivery rounds


Delivery rounds are to help organise volunteer delivery of phyiscal resources like newsletters.

Rounds are used

A round need not have a deliverer (MAIL being the obvious example: incidentally, you cannot delete or rename that round).

You can assign a deliverer by locating the membership record in the usual way and then choosing from the assign menu in the delivery rounds panel. Note that this identifies an individual. If a deliverer is not themselves a member they can be added as a contact.

You can edit the boundary for the round displayed on the maps, in the same way as for a map search. You have to save when you're done - it doesn't save on each change.

top (contents)

Membership types

Set up membership types, with their fees, durations and so on. You can examine or change a membership type (select it from the menu at the top), add a new one (press the button), and (providing no one is assigned to it) remove a membership type with ❌ at the bottom of the description of that type.

Properties are as follows:

top (contents)

Contact types

Contact types can be presented in your desired order by shuffling the rows of this table.

You can change the background colours used, and also which parts of the detail on the right hand panel apply to contacts of this type.

Label appears as part of the text in the {show: label info} substitution for contacts of this type, and those with Priority ticked will be sorted first when the list being used is sorted as 'custom label sequence'.

The Representative box, for installations including political representatives, determines which contact types respond to lists with source Representatives.

The Exclude search box nomiates the contact type to not be included in a general search when the excluding some contact types box is ticked in that section.

Note that:

The main use of contact types is to address them as the audience of templates. You can set up a list which selects contacts of one or more types, then make a template with that list as its audience, and send a mailshot to those people using that template.

Statistics also break down contacts by type.

top (contents)

Bank accounts

Set up the details of the organisation's bank accounts here. These are used in expected accounts for memberships, and in most of the accounting panels.

You cannot delete a bank account as it will have transactions and payments assigned to it. If you accidentally make one, you can immediately undo. Mark unused or closed bank accounts as dormant - that will avoid its statements showing up in the list of those wanted by import statements. Dormant accounts can be revived later if necessary.

To add a new bank account, press the new bank account button and fill in the details.

Each bank account has a unique letters-only identifier. An obvious choice is the first letter of the account name where there is only one. This is mainly used in the names of files imported to that account, and comprises only letters so we can recognise different parts of such file names.

The account name is usually just the name of the bank, but where you have more than one account it might, for example, be "Barclays Current" and "Barclays Savings", or just "Current" and "Savings" as you prefer.

Bank account number and sort code must have 8 and 6 digits respectively, though you can include the two dashes in the sort code if you wish (e.g. "12-34-56", which makes copying and pasting easier sometimes).

You can start statements you wish to import numbering from 1 for whichever month and year you start in. This number used to be significant but is now only for your reference.

Select the payment methods accepted for membership payments into this account. Not all methods are appropriate for all accounts (for example, you can only make PayPal payments into a PayPal account, not direct debits). This allows for a cross check between the payment method and expected destination account for a membership. A savings account (for example) may not accept payments from members at all.

Manage the payment methods available in the section beneath the accounts. Methods have a different identifier internally than the name disoplayed elsewhere, with only letters and digits. That is the value you would use if importing memberships rather than the more readable name. Where a payment processor is selected, any form that takes payment will use the built in code for processing payments using those methods.

Manual or automatic import

Transactions on each account can be either imported manually from a CSV file, or in some cases fetched automatically via the bank's API. To use automatic import, select from the available APIs instead of "manual", and enter the required credentials.

Imports for transactions made on days since the most recently recorded transaction up to the end of the previous day are done daily in the early morning.

Automatically imported transactions are identified at the start by "...-auto". They are grouped into nominal monthly statements, just for ease of access in [accounting info](/accountinginfo/statements].

Administrators can test automatic imports using the button provided in the Import statements panel.

The following are available:


Credentials required are user, password and signature. Put these in the box in that order (separated by spaces, semicolons or commas). user will be something like '', password is a mix of upper case letters and digits and signature is a long string of mixed case letters and digits.

Obtain these from the PayPal control panel as follows:

Note that the PayPal automatic import is only currently only able to import up to 100 transactions a day.


Credentials required comprise just an access token, which starts 'live_...' and continues with a long string of mixed case letters and digits. Put all of it in the box including the 'live_' bit.

To obtain this, in the GoCardless control panel:

CSV import format

When you import statements, you need to supply a CSV file. Each bank lays out their files differently, so we need to transform this into a common format that Cameo understands. There are three ways to do this, with further information about each below.

jcomma recipe

In this case you would import whatever the bank gave you, and jcomma would convert it according to the recipe provided.

Used in this way, there is no intermediate file, so the jcomma output file format options are not used. For testing, it will probably be helpful to set these to html, encoded as UTF-8, to display in a browser tab.

For each statement transaction, the recipe should produce fields named 'date', 'amount', 'type', 'description' and, optionally, 'reconciled' (all in lower case, but in any order; if there are any other fields, they are ignored):


This will have been provided for you and, providing the bank does not change its CSV file layout, it should "just work".

basic CSV format

Where neither a recipe nor plugin is available, the CSV needs to be laid out in a way that Cameo can understand, according to the following rules.

Manually prepared CSVs must be encoded using UTF-8 (loosely speaking, this says what numbers in the file are used to represent things like pound signs; most files include metadata saying what their encoding is or are defined to be in a particular encoding, but CSVs do not have this, so you have to know).

Google Sheets gives you UTF-8 by default, so that's a good choice of software, but in Microsoft Excel, LibreOffice and OpenOffice you have to set this as an option when you save them. In Excel, in the Save As panel choose the file type as "CSV (Comma delimited)", then choose Tools > Web Options, then the Encoding tab, and finally "Save this document as... Unicode(UTF-8)". Other apps are similar.

One row should be supplied for each transaction, with at least four columns per row. There should be no extraneous rows, or blank rows, anywhere. Any additional columns will just be ignored (but see note below about 'unreconciled').

If you include a header row (its presence is detected automatically), it must provide the names of the columns, 'date', 'amount', 'type', 'description' and, optionally, 'reconciled' (unlike a jcomma recipe, these are not case sensitive here). They don't have to be in that order - the headings are used to determine this (they don't even have to be the first four or five columns).

If you don't provide a header row, the columns must be in the order listed above. If you have extra, ignored columns, but no header row, the fifth column must always represent 'reconciled' (as it would be indistinguishable from one of your extra columns).

Column contents are as for jcomma's fields described above, except that 'date' can be in any sensible format (if formatted with slashes, 1/2/16 is interpreted as the European form, i.e. 1 February not 2 January, but it is better to avoid this ambiguity if possible).

For example:

1 date amount type description reconciled
2 2016-08-02 12.50 standing order SMITH J 1234 090987 10023454
3 2016-08-05 -1023.44 payment COPY COLOUR PRINTING yes


top (contents)

Custom fields

Custom fields allow additional, structured information to be added to membership records that isn't provided by the off-the-shelf installation. Typically you'd add custom fields at the start and then forget about them!

As well as storing the information with the membership records, you can

Add a field using the new field button and then provide the details. A field is not actually created in the database until you have supplied at least:

When you have provided sufficient details, you are asked to confirm permanent addition to the database.

This is because changing the database structure is a permanent change. While a field can be deleted (and any information stored in it removed from all membership records), or you can Undo the addition, the way the database software works is such that it retains some information about the field, which can only be removed by a manual backup and restore of the whole database. In practice this means you can't make another custom field with a similar name to one that has ever existed, or change the type of a custom field.

At this point the internal name for the field, which is derived from the caption, is fixed. While you can change the caption again later, the internal name is then fixed permanently. The internal name is used to identify the field when you import records, and it is a simplified version of the caption so that spaces, punctuation and case don't interfere with the database's field naming rules, while giving you a friendlier caption to work with.

You can choose whether the field displays for members or just contacts by ticking the box by Display for, and which, if any, contact types it is also displayed for. This can be changed even after the field has been added to the database: it does no more than hide the field for records where it is not appropriate.

Drag the row for a field using the up/down indicator to change the order the fields are presented within the record.

If you delete a field using ❌, it will no longer be displayed. More importantly, it will remove any data stored in that field from any membership records where it has been set. (An unintended field deletion can be undone in the usual way).


Consider date of birth. This would naturally be associated with an individual, so you would choose 'in... each individual'.

You would probably call it "Date of birth": the caption is used in the membership record, and also anywhere else appropriate - for example in the corresponding substitution in the template editor.

Date of birth is, of course, a date. Therefore you would choose 'date' for the type. Telling Cameo that it is a date, rather than, say, general text, means that it wil be presented consistently, however it is entered, and is indexed so that it can be used in date range searches. (Similarly, currency gets shown with the currency symbol and two decimal places, and a yes/no field gets a check box and can control conditional substitutions in templates, and so on).

The note gives you a place to provide a bit more information about what the field is for and how it should be used. It is displayed when you hover over the caption, and also as the hint for a substitution when you hover over that. Date of birth is, however, pretty self-explanatory.

Cross references

One type of field you can choose is 'cross reference'. This lets you include a membership number of a different membership in a record. The nature of the relationship would be indicated by the caption. Consider 'Supervisor' for example. Several memberships might identify a further record as representing their supervisor.

You can enter the membership number in the record manually, or pick it up from the saved membership in refine search.

You can then jump to the supervisor record by clicking the link provided alongside the custom field. Conversely you can find all the people supervised by someone in miscellaneous queries.

A cross reference field also has three associated substitutions, to substitute the email address(es), called and salutation fields of the related record. Using these substitutions, you can arrange to send a message about the subordinate to the referenced membership, which contains details about them ("You are supervising the following person..."). Conversely you can name the related person to the subordinate ("Your supervisor is...").

top (contents)


The Cameo API (application programmer interface) provides limited access to the database through a REST interface (mostly) serving JSON objects.

All accesses are of the form


Administrators can obtain and manage API users and passwords in api keys.

Errors are indicated by HTTP status codes other than 200.

When using cURL, please don't forget to percent-encode your parameters.


To allocate a new membership number for use in a membership form.

parameters: none

returns: a JSON object providing a so-far unused membership number, like this:

    {"membershipnumber": 3456}

Note that it is possible to preallocate a pool of unused membership numbers for use on occasions when the API cannot be accessed for whatever reason. It is important that membership numbers are uniquely allocated. For this reason, the allocation is done in a critical section so that two nearly-simultaneous requests cannot accidentally allocate the same number.


Exactly the same as and superseded by shopdiscounts.json (q.v.). (Note bikeshops... plural!).


Returns limited information about a membership with the given email address. Very similar to qrcode.json (q.v.), but works for current memberships and contacts (only).

Please do not disclose the membership number in any pages displayed as a result, and be careful with other information, so that probes for data won't be helpful.



an email address. Because of the @ symbol in particular, don't forget to percent-encode this.

returns: a JSON object with a membership information, like this:

      "called":"John & Jane Doe",
      "salutation":"John & Jane",
      "_type":"current", # for backward compatibility only, use type instead now
      "individuals":[{"firstname": "John", "lastname": "Doe",
                      "personalphone": "07111 111111", "email": ""},
      "address": {
        "address1": "1 High Street",
        "address2": "Ambridge",
        "city": "Borset",
        "county": "Borsetshire",
        "country": "UK",
        "postcode": "BB1 1BB"
      "giftaiddeclaration":{"on": "2014-10-12"}

The number of entries in individuals tells you how many individuals there are in this membership; individuals fields (e.g. email) may be either empty strings or not present at all, indicating that individual does not have an email address.

giftaiddeclaration may not be present, but if it is will contain the date of the declaration in the "on" field.

None of the address fields are guaranteed to be present (there may not even be an address stored for the membership). "county" and "country" will only be present if enabled for the particular Cameo installation.

Dates are in ISO format.

type may be current or contact. You can't look up unenroled (new) or expired (old) memberships with this api.



a year for which we hold records


a number between 1 and 12

for example:


for December 2015.

returns: a zip file, just like the one provided in response to the one in export in accounting info for use in preparing accounts.


Please cache the result to avoid repeated requests for the same information. Once a day is sufficient.

parameters: none

returns: a JSON array listing information about all group members willing to have their details published. For example:

    [{"called":"Mythic Beasts Ltd",

Groups not willing to be made public should have their group URL set to "redacted" and such groups are not returned at all for this request.


Returns the name and picture for each or just one individual from a current membership only (not a contact, and not old or new memberships) identified by qrcode. Individual's pictures are not available in all versions of Cameo.



a member qrcode (six upper-case letters)


optionally, the index (starting at one) of a single individual; if n is not given, all individuals are retrieved.

returns: a JSON object with a structure like this:

    {"qrcode": "ABCDEF",
     "individuals": [
       {"name": "Ben Cream",
        "photoid": "data:image/jpg;base64,RFDCYIKH..."},

Name is the concatenation of the individual's first and last names. Photoid is an image encoded as a data URI suitable for use in the src attribute of an HTML img element.

Note that individuals is still an array (with one element) even if n is given to request a single individual.


Provides a list of manual lists marked as public, to offer for self-service subscription



returns: a JSON array for each list, like this:

    [{"listname": "Whatever List"
      "description": "A longer description of the list"},

You can find out whether someone is already subscribed using the mailinglistsubcriptions API and looking to see if the list name in in the mlsin array, and can subscribe them using the same call, by including the list name in the mlsin array, or for a new membership, just include it in the individual's mlsin array when creating the record for importing.


To assist in running a mailing list opt-out or subscription management page.



a member's qrcode (usually obtained by them following an opt-out link containing it)

returns: a JSON array for each individual, like this:

    [{"email": ""
      "membershipnumber": 111
      "mlsin": ["listname", ...],
      "mlsout": [...],
      "mlsevidence": [{"listname": "some list",
                       "date": "2017-12-31",
                       "evidence": "ticked box on form"
                      }, ...]},

mlsin is an array of (manual) list names to which the individual is subscribed, and mlsout those (automatic) lists from which they have already opted-out.

mlsevidence is an array of objects comprising listname, date, evidence and attachmentid which supports an audit trail for list subscription for data protection purposes.

To amend, add or remove lists from the mlsin, mlsout and mlsevidence arrays as required, and then POST the same JSON structure back again as the value of the POST parameter


optionally along with additional parameters


text indicating why they made a change


the list name against which the reason is to be posted

The changed arrays will then be applied to the individual with that email address and membership number so if, for example, they opt-out of a particular list, they will receive no more mail sent to that list. The amended record will be returned as the response.

attachmentid cannot be set by a new subscription (as you don't have the required information), but where a subscription is unchanged, you should return any existing instances of it.

You can also use the pseudo-list-name opt-out-all, which will opt them out from all automatic lists now and in future.

An aggregation of reasons for a list can be obtained by looking in lists, in communications.


Returns limited information about a membership with the given qrcode, to support membership renewal. Please do not disclose the membership number in any pages displayed as a result, and be careful with other information, so that probes for data won't be helpful.

Very similar to email.json, but qrcode.json can only retrieve current and old memberships.



a member qrcode (six upper-case letters)

returns: a JSON object with a membership information, like this:

      "called":"John & Jane Doe",
      "salutation":"John & Jane",
      "_type":"current", # for backward compatibility only, use type now
      "individuals":[{"firstname": "John", "lastname": "Doe",
                      "personalphone": "07111 111111", "email": ""},
      "address": {
        "address1": "1 High Street",
        "address2": "Ambridge",
        "city": "Borset",
        "county": "Borsetshire",
        "country": "UK",
        "postcode": "BB1 1BB"
      "giftaiddeclaration":{"on": "2014-10-12"}

The number of entries in individuals tells you how many individuals there are in this membership; individuals fields (e.g. email) may be either empty strings or not present at all, indicating that individual does not have an email address.

giftaiddeclaration may not be present, but if it is will contain the date of the declaration in the "on" field.

None of the address fields are guaranteed to be present (there may not even be an address stored for the membership). "county" and "country" will only be present if enabled for the particular Cameo installation.

For backward compatibility the object also includes fields with dots in their name, "" and "giftaiddeclaration.on" duplicating some of the individuals and giftaiddeclaration information, but this is deprecated and should not be used in new clients.

Dates are in ISO format.

type may be current or old. You can't look up unenroled (new) or contact memberships with this api.


The intention is to provide a source for information to interested visitors to a website.

Please cache the result to avoid repeated requests for the same information. Once a day shouldbe sufficient.

parameters: none

returns: a JSON array of objects useful for populating a page listing bike shops in our contacts list which offer discounts to members, like this:

      "called":"Kingsway Cycles",
      "address":{"address1":"8 City Road","city":"Cambridge","postcode":"CB1 1DP",
      "phone":"01223 355852",

Don't rely on any of the fields being present. There may also be an "address2" field. The location, if given, may be useful for showing where they are on a map.


Returns status information about the given qrcode, to support the verification of membership by scanning membership cards.

While an invalid or missing parameter will produce a HTTP 400 error, a validly structured but unused, expired or whatever code will be validly reported as with particular status.



a member qrcode (six upper-case letters)

returns: a JSON object with a status, like this:

    {"status": "current"}

statuses are as follows:

current: the qrocde belongs to a current, paid-up member

expired: the membership corresponding to this code has expired

cancelled: the code was previously allocated but was cancelled because the card was lost or stolen. A membership card scan of such a code is suspicious of nefarious activity if in response to a real scan; or it is a probe.

doesnotexist: we don't have a record of any such code. This is probably a probe.

contact: the qrcode is assigned to a contact, not a member. This is probably a probe.

available: we have an unallocated such qrcode. This is probably a probe.

top (contents)

Import format

The import memberships panel (in new) allows administrators with appropriate technical knowledge to import membership records generated externally, for example from an older database or spreadsheet.

You can import contacts (type: contact), current members (type: current) or new members (type: new). You can't import old (expired) members!

Data is in CSV or JSON format, with detailed requirements shown below.


JSON allows for hierarchically structured data. If you are starting with CSV or TSV files, you may find jcomma a useful conversion tool.

JSON is similar to literal object notation in Javascript. However:

It can be tricky to find that stray comma or whatever in invalid JSON; jsonlint can help with that. It appears this runs entirely in your browser and that no data is transmitted to their server, so you should be able to use this without data privacy concerns.

JSON file structure

There are a number of ways of structuring the JSON you can use. Note that types L and E are not JSON files, rather they comprise multiple JSON objects, one per line of the file.

Import types E and I indicate the type of the record (current, new or contact) separately from the record, as illustrated below. Types L and A include a type field in the records themselves.

CSV ("type C")

You can also use CSV as an import format. jcomma can convert your existing CSV files to suit Cameo's required structure.

CSV files must be encoded using UTF-8. While Google Sheets produced UTF-8 for downloaded CSVs, this is not the default when you save as CSV from Microsoft Excel, LibreOffice or OpenOffice where you have to set this as an option when you save them. In Excel, in the Save As panel choose the file type as "CSV (Comma delimited)", then choose Tools > Web Options, then the Encoding tab, and finally "Save this document as... Unicode(UTF-8)". Other apps are similar. If you don't do this accented characters and the like will be garbled.

Columns in the CSV file may be in any order. There must be one header row where the column headings describe the field represented by that column as shown in the JSON example below. There must not be any additional columns not relevant to Cameo.

For simple fields (like called or membershipnumber), this is straightforward: just the name of the field in the column header (all in lower case). There must be a column headed type.

For arrays and objects within objects, you need to flatten the structure. Denote the field in an object with a dot in the column heading, thus: contact.contacttype or address.address1.

For arrays (only individuals), add a subscript, then the dotted fieldname, and use as many columns as are needed to represent the maximum number of individuals you have. For example individuals[0].firstname as the column heading. Where there is a different number of elements in different rows, leave blank all the columns related to those that don't exist; but don't leave gaps: fill in [0], then [1], then [2] (and not [0] and [2] leaving [1] blank).

A complete list of column headings is provided below - see 'Record structure'.

For example:

A B C D E F G H ...
1 type called contact.contacttype individuals[0].firstname individuals[0].lastname individuals[0].email individuals[1].firstname individuals[1].lastname ...
2 contact J & K Doe Subscriber Jane Doe Kevin Doe ...

While you can also add mlsin and mlsout this way for each individual, this can lead to a large number of columns, so as a special case you can also give the values for these fields as list separated by semicolons. For example, even though it should be an array, a column heading individuals[0].mlsin lets you give as the value "List A; List B" (white space around the punctuation will be trimmed) if that is more convenient than individuals[0].mlsin[0],individuals[0].mlsin[1],..., individuals[1].mlsin[0], ... For example:

1 individuals[0].mlsin individuals[1].mlsin
2 Photography; Writing Photography; Art

It is also possible you have characteristics of members stored as checkboxes in your existing spreadsheet which are to be grouped into lists (for example interests or subcommittee delegates). To make this easy to import, you can also use as the column heading individuals[0].mlsin[List A] for example (where "List A" is the name of a list). Then the individual will be subscribed to that list if the value in the column is anything other than empty, 0, no, No, n or N. For example:

1 individuals[0].mlsin[Photography] individuals[0].mlsin[Writing] individuals[0].mlsin[Art] individuals[1].mlsin[Photography] individuals[0].mlsin[Writing] individuals[0].mlsin[Art]
2 1 1 1 1

Membership numbers

You can include an explicit integer membershipnumber in each record. This must, obviously, not already be used by an existing membership, and it must also not be available for allocation to a new membership in the future. That means it must be smaller than the value in Organisation Details in Admin. You can allocate the numbers you need by increasing this number, thereby reserving all the numbers in between.

If you omit membershipnumber, one will be allocated automatically. However, be aware that this make take quite a lot longer to import for a large number of records.

qrcode (a unique and non-sequential record id) is always allocated automatically for current and contact.


All dates are strings in ISO 8601 extended format: date only, no times. For example "2017-03-27".


Four fields can contain people's names: firstname and lastname for each individual, and called and salutation. In addition contacts have contactbody and contacttitle fields in the subordinate contact object.

If called and/or salutation are omitted, then variants will be deduced for them from the individual's names. This takes into account English titles, such as "Mr", "Doctor", "Prof" and so on, whether or not they have used names or initials etc. For a single individual It will use the full name for called and first name (the first word of the name, not necessarily what is in the firstname field) for salutation; for several individuals, it will contract the names in called to use initials, to keep it from being too long, and list first names for salutation, as in "Jane & John" or "Jane, John & Michael". It takes into account initials and titles, so if you have "Mrs J" and "Doe" for the individual, then it would produce "Mrs Doe" for salutation, not just "Mrs" or "Mrs J".

For contacts, if no individual name is known, still add an individual but set their firstname "FAO". In this case, if called is not set, it will be derived from contactbody (or contacttitle), and if salutation is not set, it will be set to contacttitle (or contactbody), depending which of those two fields are set.

There will, however, be some variations which aren't easily predictable which won't be right and you should check these. The deduced names are listed both on trial and full import.

Custom fields

Any additional custom fields, which are either properties of the record as a whole or of each individual, can be included if required, in just the same way as the built-in fields.

Record structure

The three record types are quite similar, sharing most fields except where indicated. Note that JSON cannot normally include comments, as they are here for didactic purposes; and for the formats with one record per line, they cannot be laid out with fields on separate lines like this.

Most fields are optional, except where indicated, though in many cases the record is much less useful without some of its data. Optional fields need not be empty: just omit them.

Record structure is subject to change from time to time!

        "membershipnumber": 1533, # see note above
        "membershiptype": "Household", # REQUIRED (except contact), must be defined[1]
        "called": "J & R Anydots", # if omitted, will be deduced from individual's names - see above
        "salutation": "Jenny & Robin", # if omitted, will be deduced from individual's names - see above
        "individuals": [
            # an array of individuals: REQUIRED and the number of individuals must
            # match the number allowed for membershiptype
                # all individual's fields are optional, but you really need
                # at least one name
                "firstname": "Jenny",
                "lastname": "Anydots",
                "email": "",
                "peronalphone": "01234 567890",
                "mlsin": ["My List", "Another List", ...], # array of list names, if given[2]
                "mlsout": [...],
                "mlsevidence": [{"listname": "My List",
                               "date": "2017-12-31",
                               "evidence": "ticked box on form"
                                }, ...]
                "firstname": "Robin",
                "lastname": "Anydots",
                "email": ""
        "address": { # address2 will often be omitted, others may sometimes be
            "address1": "21 Paw Street", # REQUIRED if deliverymethod is Post or Hand
            "address2": "Fulbourn",
            "city": "Cambridge",
            "county": "Cambridgeshire", # if enabled for your installation
            "country": "UK", # if enabled for your installation, must be exact match[1]
            "postcode": "CB1 7TS" # REQUIRED if deliverymethod is Post or Hand
        "phone": "07654 321987", # typically a land line (see also individuals)
        "groupurl": "", # groups and contacts can include a website
        "joined": "2009-06-01", # displayed as "added" for contacts, but same field; defaults to today
        "expirydate": "2017-06-01", # not for contacts, defaults to today+length of membership according to type
        "datelastrenewed": "2017-06-09",
        "paymentmethod": "SO", REQUIRED (contact optional), must match defined[1]
        "toaccount": "C", # REQUIRED (contact optional): must match defined[1]
        "deliverymethod": "Web", # must match defined delivery methods[1]
        "deliveryround": "MAIL", # must match defined rounds[1], default geolocated if possible, otherwise "MAIL"
        "deliverycopies": 0, # usually omitted[3]
        "deliverynote": "30 chars or fewer", # often omitted[3]
        "amountdonation": 2.5, # recurring amount[4]
        "amountextra": 3.5, # recurring amount[4]
        "datelastpaid": "2016-06-01", # needed to produce renewal reminders
        "anomaly": "email address bouncing", # very rare to include in an import[5]
        "bankref": "***5432", # very rare to include in an import[6]
        "giftaiddeclaration": { #  if you have one from them
            "by": "Miss J. M. Anydots", # REQUIRED if giftaiddeclaration present
            "on": "2014-01-26", # REQUIRED ditto
            "except": "..." # optional, see main help for how this is interpreted
        "memos": [{"by": "user", "on": "2017-11-01", "memo": "useful aide-memoir"},...] # [7]
        "ideas": "things they told us", # [7]
        "aka": 123, # [12]
        "source": "met at fundraiser Jun 2016", # optional, why they were added
        "joincyclescape": true, # for installations that support it; new only[8]
        "contact": { # contact information, REQUIRED for contacts, always omitted for others
            "contacttype": "Police", # REQUIRED, and must be one of those defined[1]
            "contactbody": "Metropolitan Police",
            "contactarea": "Greater London", # more relevant to epresentative[9]
            "contactdiscount": true, # for shops that offer members a discount[10]
            "contactparty": "Labour", # optional, for Representative only
            "contacttitle": "Detective Sergeant", # optional job title
            "contactuid": "A39566", # usually omitted, used for automated imports only[11]
            "contactawaited": true # added anyway, but explicit false suppresses sending welcome message

The corresponding column headings in a CSV import are as follows (required fields, restrictions, notes etc apply exactly as for JSON). Boolean fields can be any of 0, N, No, False, 1, Y, Yes, True (case does not matter):


    individuals[0].mlsin - see note above for how to use this and mlsout in CSV









Payment dates etc are available for contacts even though they aren't paying members, because some may contribute regular donations.

[1] Refer to the import memberships panel for permitted values. Some values will be those you set up yourself in the various admin panels (bank accounts and membership types for example)

[2] mlsin is an array of list names to which the individual is subscribed. While this may not be that useful on import for mailing lists, it is for grouping members in other ways, for example memberships of sub-committees (create a list for each sub-committee and add its name to mlsin for those individuals) or people who have offered particular kinds of help (so create a list for each kind of help and include the list name in mlsin). mlsout is an array of automatic lists from which the individual is or has opted-out; this would need to be completed if someone does not subscribe to a list on a membership form, for example. mlsevidence provides an audit-trail for those lists to which they do subscribe.

[3] deliverycopies is used in two places: a value 0 excludes them from paper delivery lists, and there are a couple of template substitutions that emit it, usually as a note to go on a mailing label produced by a template whose audience is paper delivery. deliverynote can also be used to include a brief note on a label or elsewhere, for example to indicate to a deliverer that they should e.g. "put in box by back door" or some such.

[4] the subscription amount (which doesn't apply to contacts) is determined by the membership type. Additional payments made at the same time can be recorded here. These are used to attribute payments to multiple headings automatically when reconciling with bank statements. They don't indicate this payment has been made, merely expected, so that the break down doesn't have to be dealt with manually on each renewal. Contacts can make donations, so the same applies, with an effective assumed subscription of zero for calculating payment attributions.

[5] anomaly is a way of recording that something has gone wrong with the membership and action is pending. For example a payment didn't arrive or an email bounced, and you make a note here that you contacted them to find out why and can review these together to see if they replied and take further action accordingly if they didn't. It would be very unusual to include anything here on import.

[6] Sometimes other useful information on a bank statement that would identify the payee is missing or wrong. When you reconcile, we can identify the payee by name or membership number or other clue on the bank statement, but if not, you can add the information you do have to the record in the bankref field to automatically match the next time. Again most unusual on import.

[7] memos are those you have made about the member, ideas are those the member has made for you.

[8] relevant to cycling organisations using Cyclescape. Typically it is only present in new memberships where it blocks enroling them until this has been cleared in the UI to indicate their request has been done.

[9] For political representatives, this will be the constituency, ward, division, etc that they represent, and must match exactly that determined for members for them to be shown under the map. A list of local areas is maintained in Cameo where relevant.

[10] contactdiscount is used only to service the corresponding API request so that this fact can be advertised automatically elsewhere. To be recognised as this, contacttype must include the word Shop, Cafe or Café.

[11] contactuid is used to match a record against some external database so that when data changes there it can be updated for continuity. For example, councillor web pages from which their details are scraped will typically have a unique URL which can be used for this id.

[12] aka, the field for "I am the same person as" another record, doesn't also mutually set the aka field of the referenced record.

top (contents)

About Cameo

Cameo is a membership database.

It was originally written for Cambridge Cycling Campaign.

Written by David Earl using jQuery, PHP, Elasticsearch, tinymce, Parsedown, jflower, js-cookie jcomma, Html2Text, Leaflet, PHPMailer, TwoFactorAuth SabreDav phpqrocde Spectrum and SumoSelect

Map tiles by CartoDB and map data from OpenStreetMap.

Banks identified from sort codes using, addresses located by Nominatim, postcodes located by, constituencies and wards powered by Mapit

Copyright © 2015-2018 David Earl