Logo
Creative Financial Staffing

Construction Project Accountant/Administrator

Creative Financial Staffing, Baltimore, Maryland, United States, 21213

Save Job

a { text-decoration: none; color: #464feb; } tr th, tr td { border: 1px solid #e6e6e6; } tr th { background-color: #f5f5f5; } Construction Project Accountant & Administrator Full-Time | On-Site | Baltimore, MD About the Role

We're seeking a Construction Project Accountant & Administrator with 2-5 years of construction job cost accounting experience and exposure to project administration. You'll manage job cost accounting, AIA billing, draw requests, and subcontractor interaction, while maintaining compliance and supporting project managers. This is a hands-on position in a collaborative environment with opportunities to shape processes and grow. Key Responsibilities

* Process Owner pay applications (AIA G702/G703) and subcontractor payment applications.

* Track budgets, commitments, change orders, and cost-to-complete forecasts.

* Maintain job cost ledgers and reconcile billings, retention, and cash receipts.

* Coordinate lender-funded draw requests and compile documentation.

* Manage lien waivers, insurance certificates, and compliance documentation.

* Serve as liaison between accounting, project teams, subcontractors, and lenders.

Qualifications

* 2-5 years of construction accounting experience (job cost, AIA billing, draw process).

* Proficiency with Procore Financials and Sage 300 preferred.

* Strong Excel skills (pivot tables, VLOOKUP).

* Excellent organizational and communication skills; customer service mindset.

* Notary Public certification is a plus.

Why Join Us?

* Strategic role bridging construction operations and finance.

* Opportunity to work with new technology (Procore, Sage 300).

* Visible, trusted position with direct interaction with senior leadership and subcontractors.

* Collaborative, supportive team environment.

#LI-KC4

#INDEC2025

#ZRCFS

EB-1585553549 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