learndash/force-complete-step marks a step complete while skipping every requirement LearnDash would normally enforce. It requires confirm_bypass_requirements=true.
The certificate consequence is the one people do not expect.
Before you run it
This records a completion the learner did not earn, skipping prerequisites, required quizzes, assignment approval and video progression. Completing the last step this way can issue a certificate — a document asserting they finished the course. Try learndash/mark-step-complete first: it reports plainly when a requirement is blocking, and that reason is usually worth knowing before overriding it.
At a glance
| Ability | learndash/force-complete-step |
| Toolset | LearnDash — toolset/learndash |
| Group | LearnDash › Progress |
| Requires | AcrossAI Pro, plus LearnDash LMS active on the site |
| Capability | manage_options |
| Safety | Destructive — records a completion the learner did not earn. Requires confirm_bypass_requirements. |
| Repeatable | Not idempotent — each call changes the row set, so re-running is not a no-op |
| Ships in | AcrossAI Pro 0.9.16 and later |
How it works
Completing the final step of a course triggers course completion, and course completion issues the certificate if one is configured. Forcing that last step therefore produces a certificate asserting the learner finished — which is a document that leaves the site and may be shown to an employer.
That is occasionally exactly right. A learner who completed the work offline, or whose progress was lost in a migration, has genuinely earned it and the record is what is wrong.
It is wrong when it is used to get past a blocker that should have been fixed. An unapproved assignment needs approving; a broken video needs fixing; forcing past either leaves the underlying problem in place for everybody else.
So the ordering matters: learndash/mark-step-complete first, read the reason, then decide.
Not idempotent in the sense that it is a deliberate one-off act, though re-running produces the same completed state.
Input
| Name | Type | Required | What it is |
|---|---|---|---|
learner | string | integer | Yes | User ID, login or email. |
step_id | integer | Yes | The step. |
course_id | integer | Yes | The course. |
confirm_bypass_requirements | boolean | Yes — must be true | Acknowledges that LearnDash’s requirements are being skipped. |
confirm | boolean | Yes — must be true | The irreversibility gate. Without it the call is refused before anything is touched. |
What comes back
| Name | Type | What it is |
|---|---|---|
completed | boolean | Whether the step was marked complete. |
certificate_issued | boolean | Whether course completion issued a certificate. |
success | boolean | Whether the call completed. |
message | string | A one-line summary of what happened, suitable for showing a human. |
error_code | string | Present only on failure — a stable machine-readable reason, such as a missing field, a wrong field type or an unmet confirmation. |
Example
Ask your assistant:
Force-complete that step for the learner whose progress was lost.
It resolves to one call:
{
"ability": "learndash/force-complete-step",
"parameters": {
"learner": "sam@example.com",
"step_id": 520,
"course_id": 412,
"confirm_bypass_requirements": true
}
}Worth knowing
- The final step can issue a certificate the learner did not earn.
- Legitimate for restoring lost progress; wrong for bypassing a fixable blocker.
- Run the ordinary completion first and read its reason.
- The record does not distinguish a forced completion from an earned one.
Related abilities
- LearnDash Mark Step Complete — try this first
- LearnDash Get User Certificate Links — what a completion can produce
Get the plugins:
AcrossAI Abilities Manager · AcrossAI MCP Manager
Browse the rest: Every ability, by category