πŸ•―οΈ Open Charity CRM

Help guide

Everything in Open Charity CRM, explained section by section. If you're brand new, read Getting started and Records, lists & fields first β€” the rest builds on those two.

πŸš€ Getting started

On your very first visit to a fresh installation, the sign-in page asks you to create the administrator account β€” do this straight away, because until then anyone visiting the site could claim it. After that, the same page is the normal sign-in.

The three roles

  • Admin β€” everything, including database structure, users, connections and settings.
  • Editor β€” day-to-day work: records, fundraising, tasks, workflows.
  • Read-only β€” can view and export everything, change nothing. Ideal for trustees.

Invite colleagues from Settings β†’ Users β†’ + Invite user. A one-time temporary password is generated β€” pass it on securely; they can change it after signing in with the πŸ”‘ button at the bottom of the sidebar.

The πŸŒ“ button in the sidebar footer switches between light and dark themes. The footer also shows the running version and start time β€” handy for checking a new deployment has landed.

🏠 Dashboard

The Home page is made of cards: metric cards (a count or sum, optionally filtered β€” e.g. "Donations this quarter"), list cards (recent records), and chart cards (any saved chart).

  • Click βš™ Customise to enter edit mode, then + Add card to add, or βœ• to remove a card.
  • πŸ” Process recurring runs the daily housekeeping on demand: generates payments due on active regular gifts, lapses overdue memberships, and creates grant deadline/report reminder tasks. The same jobs also run automatically every time the server starts.

πŸ—‚οΈ Records, lists & fields

The whole CRM is built on one idea: everything is a record of a type. People, Payments, Events, Grant applications β€” all records. Each type has fields, and both types and fields are editable data, not code: change them in Settings and every list, form, filter, chart and API updates instantly.

Working with lists

  • Search looks across every field of the type, as you type.
  • ⚲ Filters builds AND/OR condition groups with operators that match each field's type (contains, is, greater than, before, is empty…).
  • β˜† Save view stores the current search + filters + sort as a named pill above the list, per record type β€” one click to return to it.
  • Click a column heading to sort; click a row to open the record.

The record page

Four tabs: Details (edit fields inline β€” changes save from the tick that appears), Relationships (what this record points at, and everything that points back at it β€” a person shows their payments, tasks, memberships and grants automatically), Attachments (files you've uploaded onto this record), and Timeline (activities, emails, payments and the full audit history in date order).

Attachments

The Attachments tab lets you keep files with the record they belong to β€” a signed grant agreement on the grant application, a scanned letter on a person, funder correspondence on an organisation. Click ⇧ Upload file, pick a file (up to 10 MB each), and it appears in the list with its size and who uploaded it. Click a file name to download it; use the πŸ—‘ button to remove one. Every upload and removal is recorded in the record's Timeline. Read-only users can download files but not add or delete them. Files are stored on your server's data volume alongside the database β€” if you back up the database, back up the attachments folder next to it too.

Custom types and fields (admins)

In Settings, add fields to any type or create whole new record types. Field types include text, numbers, currency, dates, checkboxes, ratings, dropdowns (single or multi-choice), "point to another record" relationships (single or multiple), and user fields for assigning things to colleagues. Record naming is controlled by an editable title template like {first_name} {last_name}.

CSV import and export

  • ⇩ Export CSV exports the current list respecting search and filters, with relationships resolved to names.
  • ⇧ Import CSV matches columns to field labels or keys (case-insensitive). Multiple emails or multi-choice values go in one cell separated by semicolons: a@x.je; b@x.je.
Tip: export first to get a perfectly-shaped template, fill it in, and import it back.

Bulk update

Need to set the same value on lots of records at once? Search and filter the list down to exactly the records you want, then click ✎ Bulk update. Pick a field, choose the new value, and confirm β€” every record currently shown is updated in one go. Records that already hold that value are left alone, and each change is written to the record's history just like a normal edit. (Read-only users don't see the button.)

Example: filter Grant applications to "Status is Applied", then bulk update Status to "Awarded" after a funding round β€” or clear a field across a whole segment.

πŸ‘€ People & organisations

People and Organisations are the heart of the database β€” nearly everything else links to them. Emails and phones are multi-value with a starred primary: add as many as you like and mark which one to use by default. A person can belong to several organisations, and can be more than one thing at once β€” Supporter type is multi-choice (Donor and Volunteer, say).

  • βœ‰ Send email on a person's record sends a templated email (see Workflows & emails).
  • πŸ”— Portal link generates their secure self-service link (see Supporter portal).
  • 🧹 Duplicates in the list header finds and merges duplicate entries (see Duplicates & merging).

πŸ’· Payments & regular giving

A Payment is any money in: donation, membership fee, ticket sale, grant, legacy. It links to the person or organisation it came from, and optionally to a campaign, membership, subscription or grant application.

Subscriptions are Beacon-style regular giving: the subscription record is the agreement (amount, frequency, status, next payment date) and payments are the transactions. In demo mode a monthly gift is handled by the built-in scheduler, which creates each Payment record when it falls due and advances the next-payment date. When PayPal is switched on, a monthly gift becomes a PayPal subscription: PayPal charges the donor and each payment is recorded automatically, so the scheduler leaves those alone.

Card payments: if your charity has connected PayPal (an administrator sets this up on the host β€” see Settings β†’ Card payments for whether it's live), the donation, membership and event forms take real payment through PayPal's secure checkout, and the record is only created once the money has actually been received. If PayPal isn't connected, the forms run in demo mode β€” they record a payment so you can test everything, but no card is charged. Payments you enter by hand are always just records.

πŸ’š Jersey Gift Support

Open Charity CRM implements Jersey Gift Support (not UK Gift Aid): single donations of Β£50 or more from Jersey-resident taxpayers earn the charity an extra 25p per Β£1, reclaimed from Revenue Jersey.

How it works, end to end

  1. A donor makes a declaration and provides their tax identification number (TIN) β€” via your donation page, the supporter portal, or typed into their person record by you.
  2. Every donation is checked automatically as it arrives or changes: type Donation, Β£50+, declared donor with a TIN.
  3. Eligible donations accrue onto the current quarterly claim, visible on the πŸ’š Gift Support page with running totals and the 25% reclaim value.
  4. When the quarter is ready, export the reclaim schedule CSV (donor, address, TIN, date, amount, reclaim) and send it to Revenue Jersey, then mark the claim Submitted β€” which locks its payments β€” and later Paid.
Tip: if a declaration or TIN changes, every affected donation is re-checked automatically β€” you never need to recalculate anything by hand.

πŸ›οΈ Grant applications

Track the grants your charity applies for β€” trusts, foundations, public funds. Each application records the funder (an organisation) and your contact there, the amounts requested and awarded, the application deadline, submitted and decision dates, the next report due to the funder, and what the funding is for.

The pipeline

Grant applications open as a board: columns for Researching β†’ Preparing β†’ Submitted β†’ Awarded / Declined β†’ Completed, with each column showing its count and total money. Drag a card to move an application between stages; click it to open the full record. The ☰ button switches back to a normal list.

Never miss a deadline

When an application in Researching or Preparing has a deadline within 14 days, a reminder task is created automatically β€” once. The same happens for the report due date on Awarded grants. Reminders appear on the Tasks page linked to their grant. They're generated at server start and whenever you press πŸ” Process recurring.

Link the money

When an award arrives, record it as a Payment (or pull it in from Xero) and set its Grant application field β€” the grant record then shows exactly what was received against it, totalled.

πŸ”— Xero accounting sync

Entirely opt-in, set up from Settings β†’ Connections. It needs a free Xero developer app and two environment variables on your server β€” the DEPLOY.md file in the repository walks through this once-only setup.

Pushing payments to Xero

After connecting, choose which Xero bank account payments post to and an income account code per payment type (custom payment types appear automatically). From then on payments sync as bank transactions β€” automatically at startup, on ↻ Sync now, or from a workflow action. The sync is idempotent (a payment is never posted twice) and never blocks payment creation if Xero is unreachable; a log on the Connections card shows every attempt.

Pulling money in from Xero

For money that landed in Xero without going through the CRM (a bank transfer entered by your bookkeeper), open Settings β†’ Connections β†’ Import donations from Xero: tick which Xero income accounts to pull from, press ↓ Pull from Xero, and review the staged transactions. Link each one to an existing donor β€” or create a new person/organisation on the spot β€” then press Import. Nothing is ever created without that explicit step, imported payments are excluded from outbound sync, and already-known transactions are filtered out automatically.

πŸͺ§ Public forms & giving pages

"Donation forms" records define your public pages β€” each has a web address like /give/spring-appeal that you can link from your website or share directly. Three form types:

  • Donation β€” suggested amounts, optional monthly giving, campaign allocation, and a built-in Jersey Gift Support declaration with TIN capture. Donors are matched to existing people by email or created automatically.
  • Membership β€” tiered prices ("Individual: 25, Family: 40, Life: 250"), automatic member numbers, and the joining payment recorded.
  • Event registration β€” priced ticket types including multi-attendee tickets ("Table of 8: 250 x8"), live totals, and capacity enforcement with sold-out handling.

Every form record has an Active switch, and the record page shows an πŸͺ§ Open public form button so you can see exactly what supporters see. Submissions from any form trigger workflows.

πŸŽͺ Events, tickets & memberships

  • Events hold the date, location, capacity and campaign; each sale creates Ticket records linked to the buyer and payment, and capacity is enforced across all ticket types (a "Table of 8" counts as eight seats).
  • Memberships record the type, status, member number and renewal date. Memberships past their renewal date lapse automatically. Life memberships never expire.
Tip: on event day, switch the Tickets list to board view by status for a simple drag-to-check-in flow.

πŸ’š Supporter portal

On any person's record, πŸ”— Portal link generates a secure tokenised link to give them. Without needing an account, the supporter can update their contact details, make or update their Jersey Gift Support declaration and TIN (which re-runs eligibility on their donations), choose whether to receive emails (their email consent), and see their memberships, regular gifts and payment history. Changes they make are recorded in the record's history as "Supporter portal".

βœ… Tasks

The Tasks page (top of the sidebar) shows every open task grouped Overdue / Today / Upcoming / No date, each with its due date, assignee and links to the related person, organisation or grant. Tick the checkbox to complete a task; recently completed ones sit struck-through at the bottom.

  • + New task creates one pre-assigned to you β€” change the assignee to any colleague.
  • Assigned to me filters the page to your own tasks.
  • Tasks are Activity records under the hood, so they also appear on the timeline of whatever they're linked to, and workflows can create them automatically.

β«Ώβ«Ώ Pipeline boards

Any record type with a dropdown field can be viewed as a drag-and-drop board: the ☰ / β«Ώβ«Ώ toggle appears in the list header, with a picker for which dropdown drives the columns. Cards show the record's name, money and date; columns show counts and currency totals. Dragging a card updates the field for real β€” including triggering any workflows that watch it. Search and filters still apply in board view.

Grant applications open on their pipeline by default; Payments by type, event check-in by status, and any custom status field you add all work the same way.

πŸ“Š Charts

Build charts from any record type at Reporting β†’ Charts: choose bar, line or pie, whether to count records or sum a field, what to group by (a dropdown, checkbox, rating or date β€” dates bucket by day/week/month/quarter/year), and an optional filter condition. Charts preview live on the page, and any saved chart can be pinned to the Dashboard via Customise β†’ + Add card β†’ Chart.

Line charts need a date field to group by β€” a trend only means something over time.

⚑ Workflows & emails

Workflows automate the routine: when a record of a chosen type is created or updated, if it matches your filter conditions, then run actions:

  • Create a record β€” e.g. a thank-you Task linked to the donor. Values support {field} merge tokens from the trigger and {today}.
  • Update the triggering record β€” set a status, stamp a date.
  • Send an email β€” from a template, with merge tokens.
  • Sync to Xero β€” for payment workflows.

Workflow actions never trigger other workflows, so you can't create loops. Email templates live on the βœ‰οΈ Emails page along with the outbox.

Real delivery & email consent

When your administrator has connected an email provider (Postmark β€” see Deploying), emails are sent for real; otherwise they're logged in demo mode. The βœ‰οΈ Emails page tells you which mode you're in.

To respect Jersey data-protection rules, the app only delivers emails to people whose Email consent is β€œOpted in”. Anyone else β€” β€œNot asked” or β€œOpted out” β€” still gets the email logged to their timeline, but it is not sent. The send screen warns you before it does this. People can opt in themselves by ticking β€œkeep me updated” on a donation form or in the supporter portal, and staff can set consent on a person's record. Every consent change is recorded in the person's history.

πŸ“„ Letters & mail merge

Generate Word letters from a template with the record's details filled in β€” thank-you letters, Gift Support acknowledgements, funder cover letters. Templates live on the πŸ“„ Letters page.

  • Create a template: give it a name, choose which record type it merges against (People, Grant applications…), and write the letter body. Drop in {token} merge fields β€” the editor lists every token available for the chosen type, plus {today} and {title}. A typo like {frist_name} is left visible in the letter so you spot it.
  • One letter: open any record and click πŸ“„ Letter β€” a .docx downloads with that record's details merged in, ready to print or post.
  • A whole batch: on a list, filter down to the records you want (e.g. donors who gave last quarter), then click πŸ“„ Letters on the toolbar. You get a .zip containing one .docx per record.
Tip: pair this with Gift Support β€” filter to a quarter's eligible donations and generate acknowledgement letters for the whole set at once. Everyone can generate letters; only editors and admins can change the templates.

πŸ•“ Record history

Every record keeps a permanent audit trail, shown in its Timeline tab: who created it, every field change with before β†’ after values ("Amount: Β£50 β†’ Β£75, by Sam"), and how it entered the system β€” an admin edit, CSV import, donation form, supporter portal, Xero import, workflow or the scheduler. History is append-only: it can't be edited or deleted, even by admins.

🧹 Duplicates & merging

The 🧹 Duplicates button on the People and Organisations lists finds likely duplicates β€” people who share an email address or a full name, organisations that share a name. For each pair, Merge… lets you:

  1. Choose which record to keep (the other is merged in, then deleted).
  2. Resolve any fields where the two records genuinely conflict.

Everything else is automatic: gaps on the kept record are filled from the other, emails and phones are combined without duplicates, and every linked record β€” payments, tasks, memberships, tickets, grants β€” is re-pointed to the kept record. The merge is recorded in its history. Nothing that referenced either record is lost.

πŸ” Users, roles & security

  • Roles are enforced on the server for every request β€” hiding a button is never the only protection.
  • Passwords are stored with modern scrypt hashing; sessions are HttpOnly cookies; sign-in attempts are rate-limited per account.
  • There must always be at least one active administrator β€” the system prevents removing the last one.
  • Deactivating a user signs them out immediately and blocks sign-in, without deleting anything they did (their name stays in record history).

πŸ”‘ API access

Every signed-in user can create API keys from πŸ”‘ API Access in the sidebar. A key acts with its owner's role β€” a read-only user's key is read-only β€” and keys can never manage users, other keys or passwords, so a leaked key can't mint itself more access. The plaintext key is shown once at creation.

The versioned read-only API lives at /api/v1: schema, filtered/paginated record queries, record detail with relationships, CSV export, and a one-call full-database export as JSON. Documentation is generated live from your own schema β€” custom types and fields included β€” at /api/v1/docs.

πŸš€ Deploying & backups

The app is one Node.js process with a single SQLite database file, so it runs anywhere with Node 22+ (or Docker) and a persistent disk β€” Render, Fly.io and Railway all work well and cost a few pounds a month. The essentials:

  • Set the DATA_DIR environment variable to the persistent disk path β€” without it the database is wiped on every deploy.
  • Visit the site immediately after first deploy to claim the admin account.
  • Backups: the whole database is one file (crm.db) β€” download a copy on a schedule, or use continuous replication.
  • Xero needs XERO_CLIENT_ID and XERO_CLIENT_SECRET set the same way.

The step-by-step platform walkthroughs (Render, Fly.io, Railway, custom domains, the Xero developer-app setup and a go-live checklist) live in the repository's DEPLOY.md file.