Archiving and restoring units β
Churches reorganize. A campus closes. Two cells merge. A region splits in three. The Org Structure module distinguishes between three states for a unit so historical reports stay accurate while the live tree reflects today's reality.
| State | What it means | Where it shows up |
|---|---|---|
| Active | The default β the unit is live. | Tree, pickers, dashboards, map. |
| Archived | archived_at is set. The unit is hidden from day-to-day use but its rows in org_units, member_unit_assignments, attendance, and giving are intact. | Archived tab on the org-structure page. |
| Deleted | deleted_at is set. The unit is soft-removed from the database. | Nowhere visible. Restorable only by support. |
You'll use Archive ten times more often than Delete. It's the safe default.
Archive a single unit β
On the org tree, click the three-dot menu on a unit's row and pick Archive. A confirmation dialog opens with three pieces of information:
- The unit's name.
- A warning that all child units will also be archived if there are any. The cascade is automatic and computed via
collectAllDescendantsβ every descendant getsarchived_atset in the same operation. - A note that archived units stay out of counts and pickers but remain restorable.
Confirm to run. A toast appears with the count of units archived.

Archive in bulk β
Tick checkboxes on multiple units in the tree, click Archive in the sticky toolbar that appears. The same cascade rule applies β descendants of each selected unit are pulled in automatically. The toast shows the total count.
This is the workflow you want when closing a campus: select the campus and every child folds in one click.
What "archived" does in the app β
After archiving:
- The unit disappears from the active tab of the org tree.
- The unit disappears from every picker in members, attendance, giving, and reports.
- The unit's member count and giving roll-up stops contributing to dashboards (i.e. the org's total members on the homepage drops by however many were in the archived subtree).
- The unit stops appearing as a workflow target.
- The unit keeps its
member_unit_assignmentsrows. Members are still linked to the archived unit β they don't get auto-unassigned. If you reactivate later, everything snaps back. - Historical attendance and giving rows that referenced the unit at the time of recording still resolve β they look up by id, and the id still exists.
Archive before you delete, always
There is no "trash with auto-purge" in GCM. Archived units sit forever until you act. That's deliberate β your data is safer where you can see it.
The archived tab β
Switch to the Archived tab on /org-structure to see every archived unit in a flat list, sorted by name. Each row shows:
- The unit name (muted).
- The level badge.
- The archive date ("Archived on Jan 14, 2026").
- A three-dot menu with Unarchive and Delete permanently options.
Clicking a row opens a read-only details modal with the name, level, address, and last-known leader. From there you can also unarchive.
Unarchive (restore) β
Open the unit's row in the Archived tab, click Unarchive from the three-dot menu (or from the details modal). GCM clears archived_at on that specific unit.
Unarchiving does not cascade. If you archived a branch with three centers and four cells, unarchiving the branch brings back the branch but leaves the centers and cells archived. You can:
- Pick them out one by one in the Archived tab.
- Use bulk select to unarchive a group at once.
This split design matters when only part of a restructure reverses β say you close a campus but later decide to reopen the main building without the satellite cells.
Bulk unarchive β
In the Archived tab, tick the checkboxes on the rows you want, hit Unarchive in the sticky toolbar. All selected units have archived_at cleared in a single update.
The order doesn't matter β the tree restoration is purely based on parent_unit_id, so as long as the parent is also unarchived (or was never archived) the child renders correctly.
Permanent delete β
If you're certain a unit will never come back β say you typoed a test branch during onboarding β you can permanently delete from the Archived tab.
Two paths:
- Per-unit: Three-dot menu β Delete permanently.
- Bulk: Select multiple archived rows, click Delete in the sticky toolbar.
Both paths set deleted_at on the units. The rows still exist in the database for forensic purposes but the app treats them as gone.
Permanent delete cannot be undone from the UI
Once deleted_at is set, the unit drops out of every UI surface β including the Archived tab. There's no "restore from trash" button. If you delete a unit you needed, contact support with the unit's id from your audit log.
Active-tab delete (with reassignment) β
There's also a Delete action on active units. Unlike Archive, this one immediately soft-deletes β and it forces you to decide what happens to members and children first.
The wizard asks:
- What should happen to the child units? Delete them too (recursive soft-delete) or Move to a sibling unit you pick.
- What should happen to the assigned members? Unassign them (drop the
member_unit_assignmentsrows) or Reassign to a sibling unit you pick.
The flow runs as a sequence: child reparent β member reassign β user-scope cleanup β soft-delete on the targets.
Reach for this when you're sure you want to remove the unit but don't want the cascade to also wipe data you care about. Most teams use Archive instead and skip the wizard.
Audit trail β
Every archive, unarchive, and delete writes to the data log with the actor's user id, timestamp, and the target unit. You can find it under Data Logs β Org Units. The trail survives the unit being deleted β you can answer "who deleted the North Cell?" months later.
Common questions β
Does archiving a unit unassign its members? No. Their member_unit_assignments rows stay. They just won't appear in unit-filtered views until the unit is restored.
What if I archive a unit whose leader is set? The leader_member_id is preserved. When you restore, the leader is still attached. Restoring also re-enables the leader's name in reports.
Can I bulk-unarchive an entire subtree in one click? Not in one click. You have to select the rows you want β but on the Archived tab, selecting all and clicking Unarchive does the job in one operation.
Why are archived units excluded from dashboards but not from historical attendance reports? Dashboards count live state β "how many active branches do we have right now." Reports count events β "how many attended this service in March 2024." The events still reference the unit by id even after the unit is archived, so the report still resolves.
Next steps β
- Migrate from a flat structure β for orgs upgrading from a single-tier model.
- Define your levels β start over or rename what's there.
