In a bowl, combine yogurt, ginger, garlic, garam masala, turmeric, cumin, coriander, chili powder, cardamom, salt, and pepper.
Add chicken pieces, toss to coat, and marinate for at least 2 hours or overnight.
Heat oil or ghee in a skillet over medium. Add diced onion and sauté 3–4 minutes until soft.
Add marinated chicken (reserve extra marinade), browning on all sides, about 5 minutes. Remove and set aside.
Add tomatoes and reserved marinade to the pan. Cook 5 minutes, stirring, until tomatoes begin to break down.
Return chicken to pan, stir in coconut milk and honey.
Bring to a gentle simmer, cover, and cook 15–20 minutes until chicken is cooked through and sauce thickens.
Taste and adjust seasoning. Stir in cilantro before serving.