Cut the chicken into bite-size pieces and place in a large mixing bowl.
Add the yogurt, lemon juice, garam masala, turmeric, ground coriander, ground cumin, chili powder, black pepper, and salt to the bowl; stir until the chicken is evenly coated.
Cover and refrigerate the chicken for at least 4 hours or overnight for best flavor.
Heat the olive oil and 1 tablespoon butter in a large skillet over medium heat.
Add the chopped onion to the skillet and cook for 2–3 minutes until almost translucent.
Add the grated ginger and minced garlic; sauté for about 2 minutes until fragrant.
Add the marinated chicken to the skillet and cook until the pieces are cooked through, about 6–8 minutes depending on size.
Pour in the tomato sauce, stir to combine, and bring the mixture to a gentle simmer.
Stir in the heavy cream and simmer for about 2 minutes to warm through and slightly thicken.
Add the remaining 2 tablespoons butter, allow it to melt, then stir it into the sauce until smooth.
Serve the butter chicken hot with rice or flatbread.