How it works

Embed SetFlow inside any LMS — through three OAuth-signed exchanges.

LTI 1.3 is the open standard that lets one tool live inside another. When SetFlow is registered on a school's Brightspace or Canvas, three things happen automatically: single sign-on, content embedding, and grade passback. No CSV files, no second password, no manual gradebook entry.

The 60-second mental model

  1. 1

    The handshake

    The LMS sends SetFlow a signed JWT saying who the student is, what course they're in, and what content they clicked. SetFlow verifies the JWT against the LMS's public keys.

  2. 2

    The content

    SetFlow JIT-creates the student's account if they're new, signs them in, and shows the right SetFlow content based on what the LMS instructor picked at deep-link time.

  3. 3

    The pushback

    When the student finishes a quiz or course, SetFlow signs another JWT with the score and POSTs it to the LMS gradebook URL. The grade column updates within seconds.

Three examples, end-to-end

Real flows showing what happens for the three roles that touch LTI: instructor, student, and the gradebook.

Example 1 · Instructor

Dr. Martinez embeds the SetFlow Cell Structure course in her Canvas BIO 101

Who's involved

Dr. Martinez (instructor)University of Texas CanvasSetFlow Cell Structure course

Step by step

  1. 1In Canvas she opens her course → Modules → "+ Activity" → External Tool → picks SetFlow from her institution's LTI tool list.
  2. 2Canvas sends a deepLinkingRequest to /api/lti/login-init. SetFlow redirects via OIDC to Canvas's auth, which redirects back to /api/lti/launch with a signed id_token.
  3. 3SetFlow verifies the JWT, sees it's a deepLinkingRequest, redirects Dr. Martinez to /lti/deep-link-picker.
  4. 4She picks the Cell Structure course, ticks "Create gradebook column", clicks Send to LMS.
  5. 5SetFlow signs a deepLinkingResponse JWT with the content URL + lineItem spec, auto-submits it back to Canvas.
  6. 6Canvas creates "Cell Structure (SetFlow)" as an activity tile in her course, with a gradebook column already attached.

Outcome: Total time: 30 seconds. The activity now appears in BIO 101 like any other Canvas assignment.

Example 2 · Student

Sarah Chen launches the SetFlow lesson from inside her Canvas course

Who's involved

Sarah Chen (student, never used SetFlow)Canvas BIO 101SetFlow Cell Structure course

Step by step

  1. 1Sarah opens Canvas → BIO 101 → Modules → clicks Cell Structure (SetFlow).
  2. 2Canvas POSTs to /api/lti/login-init with iss=https://utexas.instructure.com, login_hint=sarah_id, target_link_uri=...
  3. 3SetFlow mints a state + nonce (in cookies for CSRF protection), redirects to Canvas /api/lti/authorize_redirect.
  4. 4Canvas confirms Sarah is logged in, redirects back to /api/lti/launch with id_token=<signed JWT>.
  5. 5SetFlow verifies the JWT signature using Canvas's JWKS, confirms iss / aud / nonce, extracts the LTI claims (sub, email, roles, context.label, resource_link_id).
  6. 6Sarah doesn't exist yet in Academy → SetFlow JIT-creates her AcademyUser, auto-affiliates with University of Texas.
  7. 7Persists Lti13LaunchSession with Canvas's AGS lineitem URL.
  8. 8Sets the SetFlow session cookie, redirects to /courses/cell-structure.

Outcome: Total time: under 1 second. Sarah lands in SetFlow, signed in, on the Cell Structure course page. She never saw a SetFlow login screen, never picked a password.

Example 3 · The grade

Sarah completes the lesson and her score flows to the Canvas gradebook

Who's involved

Sarah ChenSetFlow practice quizCanvas gradebook

Step by step

  1. 1Sarah reads the Cell Structure lesson, asks Tori 4 questions, takes the embedded quiz, scores 87 / 100.
  2. 2submitPracticeExam runs gradeAttempt, persists the score, then fires postScore() in lib/lti13-grade-passback.ts (fire-and-forget).
  3. 3postScore looks up Sarah's most-recent Lti13LaunchSession bound to this content. The session has agsLineitemUrl and the platform's tokenUrl.
  4. 4SetFlow signs a client-credentials assertion JWT with our active LtiToolKey (RS256), exchanges it for an OAuth access token at Canvas's token URL with scope=score.
  5. 5POSTs to {agsLineitemUrl}/scores with Authorization: Bearer <token> and a Score payload — userId, scoreGiven=87, scoreMaximum=100, activityProgress=Completed, gradingProgress=FullyGraded.
  6. 6Canvas accepts the score, updates its gradebook within seconds.

Outcome: Dr. Martinez opens her gradebook 5 minutes later — Sarah's 87 is sitting in the Cell Structure column. No CSV import. No manual entry. Just there.

Why this matters

Adoption goes from “nobody has time for another tool” to “we already had it.”

LMS-embedded tools see 3-5× the engagement of standalone tools because students never have to leave the LMS workflow they already trust. Faculty adoption follows because grade passback eliminates the #1 manual chore. Districts approve them because LTI 1.3 is auditable and FERPA-compatible. SetFlow does the work; the LMS stays the front door.

Set up SetFlow on your LMS

Step-by-step guides for Brightspace, Canvas, Moodle, and Blackboard. Copyable values and the LMS-side admin flow.

Read setup guides

Talk to partnerships

Send your institution's LTI config values and we'll register your platform. Typical turnaround: 24 hours.

support@getsetflow.app