Description
On a local tutor setup, enrolling one user into one course results in COURSE_ENROLLMENT_CREATED being emitted twice, each with a distinct event_metadata.id. This was observed via a downstream receiver (webhook forwarder) that logged two separate deliveries for what should be a single enrollment action:
| event_type |
event_id |
timestamp |
| org.openedx.learning.course.enrollment.created.v1 |
b9fed4e4-9bb3-11f1-b47b-8665a19c74ef |
Aug. 19, 2026, 9:52 a.m. |
| org.openedx.learning.course.enrollment.created.v1 |
b9de5ffc-9bb3-11f1-91fa-8665a19c74ef |
Aug. 19, 2026, 9:52 a.m. |
Since the two events have different event_metadata.id values, this isn't a case of a receiver being connected twice (that would redeliver the same event id) — the event is being emitted twice by edx-platform itself for the same enrollment action.
Steps to reproduce
- On a dev setup, enroll a single user in a single course (via UI or enrollment API).
- Have a receiver connected to
COURSE_ENROLLMENT_CREATED (e.g. logging the metadata.id of each call).
- Observe two invocations with different
event_metadata.id for the same enrollment.
Expected behavior
One enrollment action should emit exactly one COURSE_ENROLLMENT_CREATED event.
Actual behavior
Two events are emitted with distinct ids, seconds apart, for the same user/course enrollment.
Environment
- tutor 22.0.0 openedx verawood.1
- Open edX Events:
openedx_events.learning.signals.COURSE_ENROLLMENT_CREATED
Description
On a local tutor setup, enrolling one user into one course results in
COURSE_ENROLLMENT_CREATEDbeing emitted twice, each with a distinctevent_metadata.id. This was observed via a downstream receiver (webhook forwarder) that logged two separate deliveries for what should be a single enrollment action:Since the two events have different
event_metadata.idvalues, this isn't a case of a receiver being connected twice (that would redeliver the same event id) — the event is being emitted twice by edx-platform itself for the same enrollment action.Steps to reproduce
COURSE_ENROLLMENT_CREATED(e.g. logging themetadata.idof each call).event_metadata.idfor the same enrollment.Expected behavior
One enrollment action should emit exactly one
COURSE_ENROLLMENT_CREATEDevent.Actual behavior
Two events are emitted with distinct ids, seconds apart, for the same user/course enrollment.
Environment
openedx_events.learning.signals.COURSE_ENROLLMENT_CREATED