<TABLE> <S> <C>
<PAGE>
<ARTICLE> 5
<S> <C> <C>
<PERIOD-TYPE> 6-MOS 6-MOS
<FISCAL-YEAR-END> DEC-31-2000 DEC-31-1999
<PERIOD-START> JAN-01-2000 JAN-01-1999
<PERIOD-END> JUN-30-2000 JUN-30-1999
<CASH> 736,000 1,569,000
<SECURITIES> 0 0
<RECEIVABLES> 9,835,000 7,788,000
<ALLOWANCES> (921,000) (612,000)
<INVENTORY> 0 0
<CURRENT-ASSETS> 15,885,000 14,283,000
<PP&E> 8,767,000 8,456,000
<DEPRECIATION> (4,395,000) (3,920,000)
<TOTAL-ASSETS> 24,999,000 23,661,000
<CURRENT-LIABILITIES> 8,153,000 7,070,000
<BONDS> 0 0
0 0
0 0
<COMMON> 12,344,000 12,322,000
<OTHER-SE> 2,207,000 514,000
<TOTAL-LIABILITY-AND-EQUITY> 24,999,000 23,661,000
<SALES> 25,100,000 17,613,000
<TOTAL-REVENUES> 25,100,000 17,613,000
<CGS> 16,689,000 11,701,000
<TOTAL-COSTS> 16,689,000 11,701,000
<OTHER-EXPENSES> 5,168,000 3,663,000
<LOSS-PROVISION> 0 0
<INTEREST-EXPENSE> 195,000 529,000
<INCOME-PRETAX> 3,048,000 1,720,000
<INCOME-TAX> 1,219,000 729,000
<INCOME-CONTINUING> 1,829,000 991,000
<DISCONTINUED> 0 0
<EXTRAORDINARY> 0 0
<CHANGES> 0 0
<NET-INCOME> 1,829,000 877,000
<EPS-BASIC> .37 .25
<EPS-DILUTED> .35 .23
</TABLE>