diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnIngestedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnIngestedComponent.cs
new file mode 100644
index 0000000000..e8bd920e64
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnIngestedComponent.cs
@@ -0,0 +1,17 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+///
+/// Triggers when the owner of this component is ingested, like a pill or food.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnIngestedComponent : BaseTriggerOnXComponent
+{
+ ///
+ /// Whether the fed entity is the user.
+ /// If false, the entity feeding will be the user.
+ ///
+ [DataField, AutoNetworkedField]
+ public bool EatingIsUser = true;
+}
diff --git a/Content.Shared/Trigger/Systems/TriggerOnIngestedSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnIngestedSystem.cs
new file mode 100644
index 0000000000..1e199e840e
--- /dev/null
+++ b/Content.Shared/Trigger/Systems/TriggerOnIngestedSystem.cs
@@ -0,0 +1,23 @@
+using Content.Shared.Nutrition;
+using Content.Shared.Trigger.Components.Triggers;
+
+namespace Content.Shared.Trigger.Systems;
+
+public sealed partial class TriggerOnIngestedSystem : TriggerOnXSystem
+{
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnIngested);
+ }
+
+ private void OnIngested(Entity ent, ref IngestedEvent args)
+ {
+ // args.Target is the entity being fed, while args.User is the entity doing the feeding.
+ // Since they are not always equal (feeding someone by force, for example) we use a bool to decide which one is the trigger user.
+ var user = ent.Comp.EatingIsUser ? args.Target : args.User;
+
+ Trigger.Trigger(ent.Owner, user, ent.Comp.KeyOut);
+ }
+}