Avo for education

Run students, cohorts, and courses from your Rails app

Students, enrollments, cohorts, and course content, managed by your team from a command center inside your Rails app, so admissions and student ops move without waiting on engineering.

250+ paying companies · 2.7M downloads of the avo gem

schema · a cohort, end to end student data stays home

Cohort

name

starts_on

capacity

has_many

Enrollment

status

enrolled_on

belongs_to

Student

full_name

email

guardian

Enrollment is the join that carries the story: who joined which cohort, when, and whether they are active, deferred, or withdrawn.

01

01 · the stakes

What running a school or learning product actually takes

The learning experience is the app students see. Behind it sits the app the school actually runs on: enrollments, cohorts, content, and payments. That second app decides how much of your engineers' time education ops consumes.

  • 01

    Enrollment ops never stops

    Deferrals, transfers between cohorts, refunds, and corrections happen every day of the term. When each one is a console command, student-facing fixes queue behind an engineering backlog.

  • 02

    Course content outlives every deploy schedule

    Lessons, syllabi, and materials change constantly, and instructors want to edit them without filing a ticket. A hand-built content admin becomes its own product, one nobody has time to maintain.

  • 03

    Student records deserve real access control

    Grades, payment status, and personal details should not be visible to everyone with a login. Admissions, instructors, and finance each need a different slice, and building that access model by hand is slow, exacting work.

  • 04

    The cohort view lives in spreadsheets

    Who is enrolled, who deferred, who has not paid, who is falling behind: when the answer lives in exports and spreadsheets, it is stale by the time anyone reads it.

02

02 · the Avo version

Your models are already the hard part. Avo is the rest.

Avo mounts inside your Rails app and turns the models you already have, students, cohorts, enrollments, lessons, into the tool your team runs the school from. Admissions works enrollment queues, instructors edit content, finance sees payments, each behind the Pundit policies your app already uses, all on live data.

Enrollment verbs as one-click actions

Enroll, defer, transfer, refund: each becomes an action with a confirmation step that calls the same code path your product uses, so student ops resolves requests in minutes instead of tickets.

Course content editable by the people who teach it

Lessons, chapters, and materials, with rich text through Action Text and attachments through Active Storage, edited in place by instructors while your validations still run underneath. That is how BBC Maestro manages a rich course catalog.

The cohort roster, live, not exported

A cohort's enrollments render as linked records with filters for status, payment, and progress, so "who has not paid" or "who deferred" is a saved view, not a Friday spreadsheet ritual.

Access shaped to the org

Avo reads your Pundit policies, so instructors see their cohorts but not payments, admissions edits enrollments but not grades, and sensitive student fields render only for roles allowed to see them.

The numbers the Monday meeting runs on

Enrollment counts, cohort fill rates, and revenue on dashboards built from your own queries, straight from the same database the product runs on.

An Enrollment resource with cohort queues and a deferral action:

class Avo::Resources::Enrollment < Avo::BaseResource
  self.includes = [:student, :cohort]

  def fields
    field :status, as: :select, enum: ::Enrollment.statuses
    field :enrolled_on, as: :date, readonly: true
    field :payment_status, as: :badge, visible: -> { current_user.finance? }
    field :student, as: :belongs_to, searchable: true
    field :cohort, as: :belongs_to
  end

  def scopes
    scope Avo::Scopes::AwaitingPayment
    scope Avo::Scopes::DeferralRequested
  end

  def actions
    action Avo::Actions::DeferEnrollment
  end
end
03

03 · the timeline

From first resource to the team running on it

Hour one

Generate resources for Student, Cohort, and Enrollment and the team can look up any student, open their enrollments, and see each cohort's roster on live data.

Day one

Put it behind your existing authentication, add policies so instructors, admissions, and finance each see their slice, and ship the defer and transfer actions so enrollment ops leaves the console.

End of the week

Instructors edit course content themselves, the awaiting-payment queue is a saved view someone owns, and the enrollment dashboard replaces the Friday spreadsheet.

case study · online course platform

“Avo just worked great. We were able to plug things together really easily... it's given us the flexibility we needed to build out a really rich product.”
Tom Coates, Head of Engineering, BBC Maestro · Read the BBC Maestro story

04 · start today

Stand up your school's back office this week

Avo is per app with unlimited users, so the whole team works from it without the bill scaling with headcount. When you hit an edge Avo doesn't cover, you drop to plain Rails instead of filing a feature request.

Things education teams build with Avo

Avo by industry

Avo for your team

Frequently asked questions

Can I run an edtech platform's admin on Ruby on Rails?
Yes. Students, cohorts, enrollments, and lessons are ordinary Rails models with associations, and Avo turns them into the tool your team runs the school from, on top of your existing tables. BBC Maestro runs its course platform this way.
Can instructors edit course content without engineering?
Yes. Lessons and materials become resources with rich text and file fields, editable in place, and because Avo writes through your models, validations and callbacks still run. Content updates stop being deploys.
How do we keep grades and payments away from the wrong eyes?
Access is enforced with Pundit policies, the same ones your Rails app uses, per action and per field. Payment fields render only for finance, grades only for instructors and registrars, and the rules are Ruby you review in a PR. See the authorization docs.
Can student ops handle deferrals and transfers themselves?
Yes. Each becomes an Avo action with a confirmation step and any inputs you need, a reason, a target cohort, calling the same model methods your product uses. Ops resolves the request in minutes and every change is attributable.
Where does student data live?
In your database, inside your own infrastructure. Avo is a Rails engine mounted in your application, so student records never transit a third-party service, which matters when FERPA, GDPR, or a school district's data agreement applies to you. The compliance work remains yours, but the data path stays yours too.
We already built a small admin. Why switch?
Because it will keep growing and someone has to keep building it. Every new model needs screens, every role needs permissions, and every term adds requests. With Avo the next resource is a generator command away, and the maintenance is our job, not a side quest for your team.