In a large skillet, heat the vegetable oil over medium heat. Add the chopped onion and sauté until translucent, about 5 minutes.
Stir in the minced garlic and ginger, cooking for an additional 1-2 minutes until fragrant.
Add the chicken pieces to the skillet and cook until browned on all sides, about 5-7 minutes.
Stir in the tomato sauce, heavy cream, butter, garam masala, cumin, paprika, salt, black pepper, and cayenne pepper (if using). Bring the mixture to a simmer.
Reduce the heat to low and let it simmer for 15-20 minutes, stirring occasionally, until the chicken is cooked through and the sauce has thickened.
Taste and adjust seasoning if necessary. Garnish with fresh cilantro before serving.
Serve hot over cooked basmati rice or with naan.