Controller
$100-120k Benefits & Growth
High-impact finance seat supporting a mission-driven nonprofit
Flexibility to discuss full-time, part-time
Direct exposure to executive leadership, audit, and grant processes Why This Opportunity Stands Out
Executive visibility and hands-on collaboration with organizational leaders
Influence on finance transformation as the team migrates systems to Teams/SharePoint
Expand your nonprofit leadership portfolio during a period of national grant growth
Supportive, values-driven culture with business casual dress and easy parking Key Responsibilities of the Controller
Lead all monthly close, account reconciliations, and financial statement preparation for the museum
Oversee annual audit coordination, working closely with external auditors and tax providers
Manage core budget, reforecasting, and grant accounting deliverables as required
Ensure cross-functional communication with AP/AR and the wider finance team
Leverage strong Excel skills and adapt to Teams/SharePoint as the department transitions platforms Must-Have Skills/Experience (Required)
Recent, relevant nonprofit financial/accounting experience (not optional)
Advanced accounting knowledge (GAAP); strong independent work capability
High proficiency in Excel; experience with Teams/SharePoint valued
Non-profit experience, MUST HAVE #INFEB2026 EB- document.addEventListener('DOMContentLoaded', => { const root = document.querySelector('#job_desc'); if (!root) return; // Skip wrapping if we've already done it if (root.dataset.hashtagsWrapped === "1") return; const SKIP = new Set(['SCRIPT','STYLE']); const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { acceptNode(node) { if (!node.nodeValue !node.nodeValue.match p{L}\p{N}_]+/u)) return NodeFilter.FILTER_REJECT; // Avoid wrapping inside an existing hashtag span let p = node.parentNode; while (p && p !== root) { if (p.nodeType === 1 && p.hasAttribute('data-hashtag')) return NodeFilter.FILTER_REJECT; if (SKIP.has(p.nodeName)) return NodeFilter.FILTER_REJECT; p = p.parentNode; } return NodeFilter.FILTER_ACCEPT; } }); const re = p{L}\p{N}_ gu; function wrapTextNode(textNode) { const text = textNode.nodeValue; re.lastIndex = 0; let m, last = 0; const frag = document.createDocumentFragment ; while ((m = re.exec(text)) !== null) { // preceding plain text if (m.index > last) frag.appendChild(document.createTextNode(text.slice(last, m.index))); // hashtag span const span = document.createElement('span'); span.textContent = m[0]; span.setAttribute('data-hashtag', '1'); // idempotence guard span.setAttribute('style', 'font-size:9px;color:#fff'); // requested inline style frag.appendChild(span); last = re.lastIndex; } // trailing plain text if (last < text.length) frag.appendChild(document.createTextNode(text.slice(last))); textNode.parentNode.replaceChild(frag, textNode); } const toProcess = []; let n; while ((n = walker.nextNode toProcess.push(n); toProcess.forEach(wrapTextNode); root.dataset.hashtagsWrapped = "1"; });