Job Title: Grant Accountant
Location: Westerville, Ohio (Fully Onsite)
Salary Range: $65,000 - $70,000 annually About the Role
We are seeking a detail-oriented and highly organized Grant Accountant to join our team in Westerville, Ohio. This fully onsite role will be responsible for managing grant financials, ensuring compliance with funding requirements, and providing accurate reporting to support organizational goals. The ideal candidate will have strong accounting skills, excellent attention to detail, and the ability to work both independently and collaboratively across departments. Key Responsibilities
Manage all financial aspects of assigned grants, including budgeting, reporting, and compliance
Prepare and review grant proposals, budgets, and cost allocations in alignment with funding requirements
Monitor expenditures to ensure compliance with grant agreements and organizational policies
Prepare monthly, quarterly, and annual financial reports for internal and external stakeholders
Conduct account reconciliations and resolve discrepancies in a timely manner
Collaborate with program managers and leadership to track grant activities and expenditures
Assist with audits and ensure accurate documentation of all grant-related financial records Qualifications
Bachelor's degree in Accounting, Finance, or a related field required
2+ years of experience in grant accounting, nonprofit accounting, or a related role
Strong knowledge of GAAP and grant compliance requirements
Proficiency in accounting software and Microsoft Excel
Excellent analytical, organizational, and communication skills
Ability to manage multiple grants and meet strict deadlines Benefits
Competitive salary ($65,000 - $70,000)
Comprehensive health, dental, and vision insurance
Retirement plan with employer match
Paid time off and holidays
Opportunities for professional development 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"; });