The home back row stood out in that regard, Connacht's commitment typified by wily flanker Ray Ofisa.
Keatley made it 7-3 with a penalty success after a scrum offence but missed the target with a drop goal attempt, set up by a strong tackle by Frank Murphy on Simon Danielli.
Ulster eventually lost the services of Danielli through injury and they could not turn pressure into points on the quarter-hour when Fijian winger Nagusa failed to get his pass away to an unmarked Dan Tuohy.
Connacht closed the gap to 7-6 - it remained so until half-time - with full-back Duffy's impressive catch from his own garryowen teeing up a second successful penalty by Keatley.
Ulster will have rued turning down a kick at goal in response, as a superb turnover on the deck gave Connacht a chance to clear the danger and they showed some much-needed endeavour from a powerful line-break from centre Troy Nathan.
But for all of Connacht's aggressive defence and confident kicking out of hand, a mistake at the start of the second half prompted their downfall.
Their forwards failed to gather Humphreys' restart kick and Ulster powered into the 22, sensing an early score. It duly came, Chris Henry was stopped short of the line but a secondary drive saw South Africa prop Botha muscle over from just metres out.
Humphreys' conversion was added to by penalties after 54 and 59 minutes, sandwiching Keatley's second miss of the night. Young openside Willie Faloon did well to set up Humphreys' second penalty, staying on his feet to force a ruck infringement.
Tempers frayed as Connacht struggled to get back in touch. Both sides let their discipline slip somewhat, but Ulster produced a late burst to poach two unconverted tries.
A flat pass from Humphreys sent Nagusa hurtling past Duffy and in at the right corner, and then a deflating turnover near their 22 saw Connacht leak a fourth try - Robbie Diack and Andrew Trimble combining to put Humphreys squeezing over on the left.
|Connacht Rugby Score Card|
|Ulster Rugby Score Card|