Bookkeeping Practices are the High Water Mark

A nonprofit's financial position is only as good as the bookkeeping practices in place to manage the processing and reporting. If the bookkeeping is done poorly, the organisation might be brought undone, irrespective of the passion for the cause, or the fund-raising that it does. Poor bookkeeping can lead to higher costs, reduced reputation and confidence by funders, staff and clients, and erosion of its reserves. A reliable system of bookkeeping, and of policies and procedures, is the pre-requisite of the financial management system.

Poor bookkeeping practice can lead to invoices not being paid on time, or at all, or payments for incorrect amounts. Given the amount of scam invoicing around these days, organisations can be inadvertently giving money away if the policies around payments and approvals are not sound.

Paying employees the incorrect amounts, or errors in Super or PAYG can cause endless headaches for staff and the organisation as these are sorted out at year-end when the employees' accountant reviews the payments. Under-payments of wages, even as an innocent error or incompetence, can lead to a misleading financial position, and repayments later on could cause smaller organisations to tip into insolvency. A worst case scenario is when the organisation is sued for loss or damage.

Errors in bookkeeping can lead to missed opportunities or restrictions in programs, where the financial information misleads managers or the board to curtail program delivery because of erroneous financial reporting against budget.

Reporting to the board, to funders, and to the ATO and regulators, can cause irreparable and expensive damage to the organisation. Not just material and financial damage, but also damage to reputation and may be a breach of the ACNC expectations to retain charitable status.

When a new Treasurer arrives at the organisation, or an accountant appointed as an outsourced provider, they should review the organisation's current bookkeeping practices to be reassured of how things are being done. A review might look at the following.

Is the bookkeeping being done efficiently? For example, is there a 'data dictionary' to ensure accounts and cost centres are consistently applied from month to month? Are the transactions coded to the correct period? and is GST being applied accurately? Is the bookkeeper qualified in the accounting application in use? Ensuring bookkeeping staff are trained, and their knowledge reviewed periodically is the organisation's responsibility. And this should be a formal process, including sighting qualifications, accreditation, membership of a suitable association, etc. 

The Treasurer should be able to assure the board that the organisation has documented policies and procedures in place to guide the bookkeeping and accounting staff. This can serve as a performance measure, and also ensure minimal disruption in the event of staff changes. Auditors will find this documentation very helpful and can speed up (and reduce the costs of) audit. Well documented procedures will improve the accuracy of data collection, help find errors quickly, and can close off opportunities for fraud.

Another risk, especially in some nonprofit organisations, is that the bookkeeper may be the only person with any financial literacy. In such cases, the organisation is exposed to 'keyman risk' where that person is the link to financial information. They not only 'do the books', they explain the books, and the lack of any serious internal oversight can be risky. It may be necessary to separate tasks or processes into two or more roles. The bookkeeper should not be in the sole position to approve leave, for example, where there is a risk that taken leave is not recorded accurately (especially their own!), or where the approval of invoices for payment isn't the same person who enters this into the accounting system. Accounting platforms like Xero allow for the proper recording of approvals and the attachment of documentation to be associated with payments.

Documentation about payments, approvals and recording of entries should be clear and updated regularly... and enforced when errors or omissions occur.

An organisation's capability to be viable and deliver on its mission, surprisingly, starts with the competence and trustworthiness of the bookkeeper. Let the Board be aware.

 

$(document).ready(function() { $('#next1').click(function() { var orgname= $('#orgname').val(); var putorgname= $('.org_name').html(orgname); $('.org_name1').val(orgname); }); }); (function($) { $(function() { $(document).ready(function(){ //Client-supplied mystery meat constants var r2eRatioMin = 8; var r2eRatioMax = 22; var wcRatioMin = 0.2; var wcRatioMax = 3.2; var crRatioMin = 2; var crRatioMax = 12; var prRatioMin = 0; var prRatioMax = 10; var currentstep = '#step1'; $('#step2,#step3,#step4').hide(); $('.calcnav .next').addClass('disabled'); function safeVal(value) { value = value.replace('$',''); value = value.replace(/,/g,''); value = value.replace(' ',''); return value; } /**********************************************/ //NAV //When we click a nav link, show the div referenced by the href, which will be something like #step2 $('.calcnav a').click(function(e){ //Don't navigate if required fields are missing or the link is disabled if($(this).hasClass('disabled')){ return false; } if($(this).hasClass('.next') && !checkReq(currentstep)) { return false; } e.preventDefault(); var selector = $(this).attr('href'); if($(selector).length) { //we have a div to show //Fade out, then fade in the new div $.when($('.calcsection').fadeOut(500)).done(function() { $(selector).fadeIn(); currentstep = selector; if(currentstep == '#step4') { step4calc(); } }); } }); //.calcnav a.click() /************************************************/ function step1calc() { var v21 = parseInt( safeVal($('input[name="orgname"]').val()) ); var v1 = parseInt( safeVal($('input[name="bankaccounts"]').val()) ); var v2 = parseInt( safeVal($('input[name="currentassets"]').val()) ); var v3 = parseInt( safeVal($('input[name="fixedassets"]').val()) ); if(isNaN(v1) || isNaN(v2) || isNaN(v3)) { $('input[name="totalassets"]').val(''); $('#step1 .calcnav a.next').addClass('disabled'); return false; } $('#step1 .calcnav a.next').removeClass('disabled'); $('input[name="totalassets"]').val(v1 + v2 + v3); } //Add listeners for step 1 $('#step1 input').change(function(){ step1calc(); }); $('#step1 input').keyup(function(){ step1calc(); }); /**********************************************/ function step2calc() { var l1 = parseInt( safeVal($('input[name="creditors"]').val()) ); var l2 = parseInt( safeVal($('input[name="staffentitlements"]').val()) ); var l3 = parseInt( safeVal($('input[name="grants"]').val()) ); var l4 = parseInt( safeVal($('input[name="currentliabilities"]').val()) ); var l5 = parseInt( safeVal($('input[name="noncurrentliabilities"]').val()) ); if(isNaN(l1) || isNaN(l2) || isNaN(l3) || isNaN(l4) || isNaN(l5)) { $('input[name="totalliabilities"]').val(''); $('#step2 .calcnav a.next').addClass('disabled'); return false; } $('#step2 .calcnav a.next').removeClass('disabled'); $('input[name="totalliabilities"]').val(l1 + l2 + l3 + l4 + l5); var reserves = parseInt( safeVal($('input[name="totalassets"]').val()) ) - parseInt( safeVal($('input[name="totalliabilities"]').val()) ); $('input[name="reserves"]').val(reserves); } //Add listeners for step 2 $('#step2 input').change(function(){ step2calc(); }); $('#step2 input').keyup(function(){ step2calc(); }); /**********************************************/ function step3calc() { var a1 = parseInt( safeVal($('input[name="annualincome"]').val()) ); var a2 = parseInt( safeVal($('input[name="annualspend"]').val()) ); var a3 = parseInt( safeVal($('input[name="staffcosts"]').val()) ); if(isNaN(a1) || isNaN(a2) || isNaN(a3) ) { $('input[name="net"]').val(''); $('#step3 .calcnav a.next').addClass('disabled'); return false; } var net = a1 - a2 ;// - parseInt(a3) //total income - total costs $('#step3 .calcnav a.next').removeClass('disabled'); $('input[name="net"]').val(net); } //Add listeners for step 3 $('#step3 input').change(function(){ step3calc(); }); $('#step3 input').keyup(function(){ step3calc(); }); /**********************************************/ function step4calc() { var currentAssets = parseInt( safeVal($('input[name="bankaccounts"]').val()) ) + parseInt( safeVal($('input[name="currentassets"]').val()) ); var totalAssets = currentAssets + parseInt( safeVal($('input[name="fixedassets"]').val()) ); var currentLiabilities = parseInt( safeVal($('input[name="creditors"]').val()) ) + parseInt( safeVal($('input[name="staffentitlements"]').val()) ) + parseInt( safeVal($('input[name="grants"]').val()) ) + parseInt( safeVal($('input[name="currentliabilities"]').val()) ); var totalLiabilities = currentLiabilities + parseInt( safeVal($('input[name="noncurrentliabilities"]').val()) ); var reserves = totalAssets - totalLiabilities; var netSurplus = parseInt( safeVal($('input[name="annualincome"]').val()) ) - parseInt( safeVal($('input[name="annualspend"]').val()) ); //1 var ratio1 = parseInt( safeVal($('input[name="reserves"]').val()) ) / parseInt( safeVal($('input[name="annualspend"]').val()) ) * 100; var score1 = Math.round((((ratio1 - r2eRatioMin)/(r2eRatioMax-r2eRatioMin))*9+1)*10)/10; if(score1 < 0){ score1 = 0;} if(score1 > 10) { score1 = 10;} $('#score1').text(score1); $('#score1a').val(score1); $('#ratio1').text(ratio1.toFixed(1) + '%'); $('#ratio1a').val(ratio1.toFixed(1) + '%'); var status1 = '';var status1a = ''; if(ratio1 < 15) { status1 = 'bad';status1a = 'red'; } else if(ratio1 >= 15 && ratio1 < 18) { status1 = 'average';status1a = 'yellow'; } else if(ratio1 >= 18) { status1 = 'good'; status1a = 'green'; } $('#status1').addClass(status1); $('#status1a').val(status1a); //2 var ratio2 = 0; if(currentLiabilities <= 0){ ratio2 = 0; } else { ratio2 = currentAssets / currentLiabilities; } $('#ratio2').text(ratio2.toFixed(1)); $('#ratio2a').val(ratio2.toFixed(1)); var score2 = Math.round((((ratio2-wcRatioMin)/(wcRatioMax-wcRatioMin))*9+1)*10)/10; if(score2 < 0){ score2 = 0; } if(score2 > 10) { score2 = 10; } $('#score2').text(score2); $('#score2a').val(score2); var status2 = '';var status2a = ''; if(ratio2 < 1){ status2 = 'bad'; status2a = 'red'; } else if(ratio2 >= 1 && ratio2 < 2) { status2 = 'average'; status2a = 'yellow'; } else if(ratio2 >= 2) { status2 = 'good';status2a = 'green'; } $('#status2').addClass(status2); $('#status2a').val(status2a); //3 var totalExpenditure = parseInt( safeVal($('input[name="annualspend"]').val()) ); var weeklyExpenditure = totalExpenditure / 52; var ratio3 = 0; var bankAccounts = parseInt( safeVal($('input[name="bankaccounts"]').val()) ); var grants = parseInt( safeVal($('input[name="grants"]').val()) ); if (totalExpenditure == 0) { ratio3 = 0; } else { ratio3 = (bankAccounts - grants) / weeklyExpenditure; } $('#ratio3').text(ratio3.toFixed(1)); $('#ratio3a').val(ratio3.toFixed(1)); var score3 = Math.round((((ratio3-crRatioMin)/(crRatioMax-crRatioMin))*9+1)*10)/10; if(score3 < 0) { score3 = 0; } if(score3 > 10) { score3 = 10; } $('#score3').text(score3); $('#score3a').val(score3); var status3 = ''; var status3a = ''; if(score3 < 7) { status3 = 'bad'; status3a = 'red'; } else if(score3 >= 7 && score3 < 10) { status3 = 'average';status3a = 'yellow'; } else if(score3 >= 10) { status3 = 'good';status3a = 'green'; } $('#status3').addClass(status3); $('#status3a').val(status3a); //4 var profitmargin = 0; var totalincome = parseInt( safeVal($('input[name="annualincome"]').val()) ); if(totalincome > 0){ profitmargin = (totalincome - totalExpenditure) / totalincome * 100; } var ratio4 = profitmargin; $('#ratio4').text(ratio4.toFixed(1) + '%'); $('#ratio4a').val(ratio4.toFixed(1) + '%'); var score4 = Math.round((((profitmargin-prRatioMin)/(prRatioMax-prRatioMin))*10)*10)/10; if(score4 < 0) { score4 = 0; } if(score4 > 10) { score4 = 10; } $('#score4').text(score4); $('#score4a').val(score4); var status4a = ''; if(score4 < 1) { status4 = 'bad';status4a = 'red'; } else if(score4 >= 1 && score4 < 6) { status4 = 'average'; status4a = 'yellow'; } else if(score4 >= 6 ) { status4 = 'good';status4a = 'green'; } $('#status4').addClass(status4); $('#status4a').val(status4a); //5 var ratio5 = 0; var staffcosts = parseInt( safeVal($('input[name="staffcosts"]').val()) ); if(totalincome == 0) { ratio5 = 0; } else { ratio5 = staffcosts / totalincome; } $('#ratio5').text((ratio5 * 100).toFixed(1) + '%'); $('#ratio5a').val((ratio5 * 100).toFixed(1) + '%'); var score5 = 0; score5 = Math.round(((1-ratio5)*10+3)*10)/10; if(score5 < 0) { score5 = 0; } if(score5 > 10) { score5 = 10; } $('#score5').text(score5); $('#score5a').val(score5); ratio5 = ratio5 * 100; var status5 = '';var status5a = ''; if(ratio5 < 60) { status5 = 'bad'; status5a = 'red'; } else if (ratio5 >= 60 && ratio5 < 80) { status5 = 'average';status5a = 'yellow'; } else if(ratio5 >= 80) { status5 = 'good';status5a = 'green'; } $('#status5').addClass(status5); $('#status5a').val(status5a); //total var totalscore = parseFloat($('#score1').text()) + parseFloat($('#score2').text()) + parseFloat($('#score3').text()) + parseFloat($('#score4').text()) + parseFloat($('#score5').text()); $('#totalscore').text(totalscore); selector12(); return false; } function selector12() { $("#button").trigger('click'); //$("#button").click(); return false; } /**********************************************/ function checkReq(selector) { var proceed = true; $.each($(selector + ' input.required'),function() { if( $(this).val() == '' ) { proceed = false; } }); if(proceed == true) { return true; } else { return false; } } /***********************************************/ $('.helpicon').mouseover(function(e){ $(this).siblings('.helpcontent').css('top',e.pageY - 10); $(this).siblings('.helpcontent').css('left',e.pageX + 10); $(this).siblings('.helpcontent').show(); }); $('.helpicon').mouseout(function(){ $(this).siblings('.helpcontent').hide(); }); }); }); })(jQuery);