Don't get involved with INSTEAD OF triggers unless you absolutely have to:
CREATE TRIGGER [dbo].[after_update]
ON [dbo].[tbl_customer]
AFTER UPDATE
AS
SET NOCOUNT ON;
UPDATE c
SET certificatedate = GETDATE()
FROM dbo.tbl_customer c
INNER JOIN inserted i ON
i.billno = c.billno
WHERE
c.certificatedate IS NULL OR
c.certificatedate < DATEADD(MINUTE, -10, GETDATE())
GO --end of trigger
Trying to prevent UPDATEing the same row twice by a recursive trigger call. Probably safer to reduce it to 1 minute or 2; I was trying to allow for wait time for the UPDATE, but 10 minutes is almost certainly too long.
Beware that you need to write your Triggers so that they CAN handle multiple rows. (Either than or check the ROWCOUNT in the Inserted / Deleted pseudo table and if > 1 then raise an error and rollback the transaction - so that at least your trigger is "safe" in the event of a multi-row update / insert / delete.