I managed to solve this.
I added the following code to the process order button:
if (!string.IsNullOrEmpty(txtCouponCode.Text))
{
CouponCollection couponCollection = new CouponController().FetchAll();
int couponId = 0;
foreach (Coupon coupon in couponCollection)
{
if (coupon.CouponCode.ToString() == txtCouponCode.Text)
{
if (coupon.IsSingleUse == true)
{
couponId = coupon.CouponId;
Coupon.Delete(couponId);
}
}
}
}
(might need some modification, I've removed all the ajax on the checkout page in the store I'm working on. Specifically, the txtCouponCode.Text might need to be referenced differently)