Exactly this.Unless it was a rebate targeted to the end consumer, he got exactly what he contracted for. End of story.
It’s unfortunate that the customer found out about the rebate in the first place, lesson learned by the contractor. Manufacturers often offer rebates on items like shingles to contractors. They are certainly under no obligation to pass along the savings, no more than I would be for taking my 2% savings for paying a vendor early.
Customer should be happy that the roof was done properly and completed as agreed. Time for him to let go and move on.