# Church+ Product Specification — v1.2 and Beyond

Prepared June 2026. This document organizes the full feature request list into
a cohesive, phased plan. Each phase is scoped to ship as one update, ordered so
that every phase builds on tables and patterns laid down by the one before it.

**Status key:** ✅ shipped in v1.1 · 🔨 v1.2 (next build) · 🔜 v1.3 · 🔌 Integrations phase · 🗺️ Long-range

---

## Shipped in v1.1 (foundation hardening)

- ✅ **Session reliability fix** — private per-install session storage; resolves
  the "Session expired or invalid request" (419) save failures.
- ✅ **Church logo** — admin-uploadable PNG/JPG/WEBP shown top-left for all
  users; replace or remove anytime from Church Settings.

---

# v1.2 — "People & Reports" (next build)

Six modules. Built in this order because Module 2's tables (custom fields,
groups) are what Modules 3–5 search, print, and report against.

## Module 1 — Cleaner data entry

**1.1 US State dropdown.** Replace the free-text State field everywhere
(member form, family form, church settings) with a dropdown covering:

- All 50 states + District of Columbia
- Territories: Puerto Rico (PR), Guam (GU), U.S. Virgin Islands (VI),
  American Samoa (AS), Northern Mariana Islands (MP)
- Military mail: Armed Forces Americas (AA), Armed Forces Europe (AE),
  Armed Forces Pacific (AP)

Stored as the 2-letter code; existing free-text values matched on upgrade.

**1.2 Field polish.** Title becomes a dropdown with common honorifics
(Rev., Dr., Min., Deacon, Deaconess, Elder, Bishop, Bro., Sis., Mr., Mrs., Ms.)
plus an "Other…" free-text escape. Phone fields auto-format on entry.
ZIP validates 5 or 9 digits.

## Module 2 — People power tools

**2.1 Custom profile fields.** Admins define their own fields under a new
Settings → Profile Fields page. Field types: text, long text, date, number,
dropdown (admin-defined options), checkbox, and file attachment. Fields appear
on the member form and profile automatically and are searchable.
*Schema:* `custom_fields` (name, type, options, sort, is_active) +
`member_field_values` (member_id, field_id, value, file_path).
This is the engine behind "communication preferences, spiritual gifts," etc.

**2.2 Groups & ministries.** A real groups system replacing the free-text
ministries field. Group types: **Ministry**, **Leadership Group**, **Class**,
**Committee**, **Other**. Each group has a name, type, optional leader(s), and
members. Assign people from either direction — the group's page or the
person's profile. Includes **bulk transfer** (move selected people from one
group to another) and a printable group roster.
*Schema:* `groups` (name, type, description, is_active) +
`group_members` (group_id, member_id, role enum: member|leader, joined_date).
Existing ministries text is migrated into Ministry-type groups on upgrade.

**2.3 Advanced search.** A filter builder on the People page: combine any
standard field, custom field, group membership, giving activity ("gave to
Building Fund this year"), or attendance recency. Save a search as a named
**List** for reuse in printing, reports, and (later) email campaigns.

**2.4 Notes with privacy levels.** Per-person notes with a category
(General, Prayer Request, Pastoral, Health) and a visibility level:
**Staff** (default) or **Pastoral — admins only**. Pastoral/health notes are
hidden from staff and viewer roles entirely and excluded from all exports.
Every note records author and date. *This is the right home for prayer
requests, counseling follow-ups, and health conditions — sensitive material
that should never sit in a general notes box all staff can read.*

**2.5 Merge duplicates.** A Find Duplicates tool (matches on name + birth
date, email, or phone) with a side-by-side merge screen: pick the surviving
profile, and all gifts, attendance, group memberships, notes, and custom-field
values are reassigned before the duplicate is archived. Fully audit-logged.

**2.6 Activity timeline.** A unified "Activity" tab on each profile showing
attendance, gifts (finance roles only), group joins, and notes in one
chronological stream — the at-a-glance answer to "how engaged is this person?"

## Module 3 — Print & Export center

One new **Print Center** page (under Reports) that takes any audience —
everyone, a status, a group/ministry, a family, or a saved List — and produces:

- **Member directory** — print-ready, compact or detailed layout
- **Mailing labels** — Avery 5160/5161/5163 layouts, by person or by household
  (one label per family, addressed "The Johnson Family")
- **Name tags** — Avery 5395 layout, name + optional group/role line
- **QR codes** — per person, linking to their profile (staff use) or to a
  check-in action; printable as sheets or on name tags
- **Letters** — a simple mail-merge: write once with placeholders like
  {first_name} and {family_name}, print one page per recipient

All print views use clean dedicated print CSS (the giving statement pattern,
extended).

## Module 4 — Giving & reporting upgrade

**4.1 Flexible report ranges.** Every giving report gains a range picker:
single day, week, month, quarter, year, or custom from/to. Presets for
"This week," "Last month," "This quarter," "YTD."

**4.2 Report audiences.** Run any report for: the whole church, an
individual, a family, a group/ministry, a leadership group, or a saved List.

**4.3 Statement delivery.** Batch-generate annual (or any-range) statements
for everyone with giving in the period. Deliver three ways: print all
(one per page), download individual PDFs, or **email** each statement using
per-church SMTP settings. **Joint statements** supported — one statement per
household combining spouses' giving.

**4.4 Giver insight.** A Giving Trends page: totals by fund over time,
giver participation rate, first-time givers this period, and lapsed givers
(gave last year, nothing this year) — the pastoral care list hiding inside
the finance data.

## Module 5 — Smart import with rules

A 3-step CSV import wizard for **people** and **gifts**:

1. **Upload & map** — match CSV columns to Church+ fields (including custom
   fields); save the mapping per source for reuse.
2. **Rules** — auto-assign during import: "if description contains 'BLDG' →
   Building Fund," "if no envelope match → flag for review," "default method:
   ACH." Rules are saved and run automatically on the next import from the
   same source.
3. **Review & commit** — every row previewed with what will happen
   (create / update / skip / flagged); nothing touches the database until
   the operator confirms. Full undo of the last import batch.

This is also the migration path for moving an existing church's records
(from Excel, Breeze, ACS, etc.) onto Church+.

## Module 6 — Map view

Geocode member and family addresses (each church supplies its own Google Maps
API key in Settings → Integrations) and add: a map of the congregation,
distance-from-church on each profile, and "people near this address" search.
Useful for visitation routing, bus ministry, and small-group placement.

---

# v1.3 — Member portal & engagement

The self-service layer. Larger build; ships after v1.2 because it reuses
custom fields, groups, and statement generation.

- **Member accounts** — secure member login (separate from staff accounts),
  invited by email from their profile
- **Self-service profile** — members view and update their own and their
  family's info (admin-configurable which fields are editable); changes can
  require staff approval
- **My giving** — members view their history and download statements
- **Events & registration** — church calendar, event sign-up (up to 10
  people per registration), and self check-in
- **Announcements & reminders** — portal announcements; automated email
  reminders for events; automatic **birthday and anniversary greetings**
- **Granular permissions** — extend today's four staff roles into
  configurable permission sets so leaders/volunteers can get exactly the
  access they need (e.g., a ministry leader sees only their group's roster)
- **Public forms** — admin-built forms (templates + custom) that feed
  directly into profiles and custom fields: connect cards, volunteer sign-ups,
  registrations; payment-attached forms arrive with Stripe below

---

# Integrations phase (explicitly "looking ahead")

Ordered by impact. Each is a Settings → Integrations card with its own keys.

1. **Stripe — online giving.** Giving page per church (linked from the
   portal and shareable publicly), Apple/Google Pay, fund selection,
   recurring gifts. Logged-in members' gifts attach to their profile;
   public gifts create or match a **"Nonmember Giver"** record so nothing
   is lost and conversions can be followed up. **Text-to-give** via a
   Twilio number per church. Webhooks write gifts automatically with
   method = online.
2. **Mailchimp / Constant Contact.** Sync saved Lists and groups as
   audiences/segments; one-way push keeps email targeting current without
   re-uploading spreadsheets.
3. **QuickBooks Online.** Push giving batches as deposits mapped
   fund → income account; sync chart of accounts. This deliberately makes
   QBO the accounting system of record (see long-range note below).
4. **Gusto.** Payroll/HR stays in Gusto where clergy tax and housing
   allowance are already handled; Church+ links staff records to Gusto and
   deep-links rather than duplicating payroll data.

---

# 🗺️ Long-range: the accounting suite question

The request list includes a full fund-accounting platform — Accounts Payable
& Receivable, purchase-order approval workflows, vendor management, GL with
drill-down, expense amortization, GAAP/Net-Asset compliance. That is a
complete second product (it's the core of Shelby Financials, built over
decades, with audit liability attached).

**Recommendation:** don't rebuild it — own the *ministry* data and the giving
pipeline, and hand accounting to QuickBooks Online via the integration above.
That combination (ChMS + QBO) is exactly how Breeze, Planning Center, and
Tithe.ly position themselves, and it gets churches GAAP-ready books without
Church+ carrying audit-grade accounting risk. If demand among Church+
churches proves out later, the first native piece to consider would be
purchase-order/approval workflow (operational, low audit risk) — not GL.

---

## Suggested build order within v1.2

| Step | Module | Why this order |
|------|--------|----------------|
| 1 | M1 field polish | Small, immediate quality win |
| 2 | M2 groups + custom fields | Everything else depends on these tables |
| 3 | M2 search/lists, notes, merge, timeline | Completes the People layer |
| 4 | M4 reports + statements | Highest church-office demand |
| 5 | M3 print center | Consumes Lists + groups from steps 2–3 |
| 6 | M5 import wizard | Migration path; uses rules + custom fields |
| 7 | M6 maps | Independent; needs per-church API key |

New tables in v1.2: `custom_fields`, `member_field_values`, `groups`,
`group_members`, `member_notes`, `saved_lists`, `import_batches`,
`import_rules`, plus `lat`/`lng` columns on members and households — shipped
as `sql/migrations/002.sql` so live churches upgrade without reimporting.
