Assigning Intra-Group Peer Reviews

21 24 9,011

Quick Install

For those power users who are impatient, here are the quick install steps.

  1. Install the Tampermonkey browser extension for Chrome, Firefox, or Safari
  2. Install the Intra-Group Peer Reviews user script.
  3. Navigate to a Peer Review page for an assignment and notice the Intra-Group Reviews section
  4. Set the Group Set to use. This may not be necessary as it attempts to detect which one to use for you.
  5. Click the Assign IntraGroup Reviews button.

If you run into problems, be sure to come back and read the instructions. In particular, if you're using a custom URL for your Canvas instance and not *, see the section on customization.


It is sometimes useful to assign peer reviews to the other people in the group, rather than to people in different groups. I use them for students to provide appreciative and constructive feedback to their team members about their work in a team that week. Others may have other uses.

Basically, it's a pain to do this and since Canvas already has a list of who is in what group, it should be something that can be automated. That's what this script does.

Canvas Implementation

The current implementation within Canvas makes this very difficult. The peer reviews are assigned by name, not by group.

Common but Inefficient Workflow

The typical workflow would be to start at the top of the peer review page because that's where most of the work needs done.

Peer Reviews

I want to start with Bizarre Ability, but I don't know who is in her group. To find that out, I need to go to the People page and pull up the Accountability group set. I don't see Bizarre's name, what I see is this:

Student Groups

Except that I have 32 of those groups and have no idea which one Bizarre is in. I start expanding them ... one by one ... because there is no button to expand them all.

I finally find her -- she was in group 30 out of 32.

Group Members

Now I switch back to the Peer Review page. I click on the button to Give Bizarre Ability another submission to assess and am presented with a dropdown list of all of the students in the class.

Assign Peer Review to Student

I scroll all the way down to S, looking for Selfish Hog, before I realize that the list of names on the People page is their first name followed by the their last name while on the drop down list, it's last name followed by first name and I should really be going to the H for Hog.

All right, I finally get Hog, Selfish and Sentence, Clicking added to Ability, Bizarre.

Now it's time to move on to Ruby Accolade, I mean Accolade, Ruby. Except I'm going to be smarter about it. Before moving on to Ruby, I'm going to go take care of Selfish Hog and Clicking Sentence while I know who is in their group.

Slightly Better Workflow

What I just described wasn't the most efficient way. What would be better would be to start on the People page with the first group.

Group Member Details

Then I go to the Peer Review page and take of Radical, Stellar, Spiritual, and Unspoken. Then I repeat that process with the second group. Then the third, and so on, until all 32 groups have been assigned.

End Result

No matter which method I use, I still end up with assigning 355 peer reviews by hand. That takes way too long and makes me reconsider how important it is that I do intra-group peer reviews.

Before you argue that you would never have 32 groups, I had another groupset with only 12 groups of about 10 students each. That turned into 1141 peer reviews that needed assigned.

Of course, this wasn't my real class. My real class only has 30 students in it and had 103 peer reviews, but some people have larger classes and the problem of assigning intra-group peer reviews is even worse than I've described.

If there are n students and the average group size is k, then there will be about n*(k-1) assignments that need made.

Automatic Assignment

Now that we've seen how Canvas does things, let's look at what this user script does.

It adds a new block below Canvas' Automatically Assign Peer Reviews

Intra-Group Reivews

You may need to pick the group set.

Choose Group Set

You click the button and you wait. There is a progress bar that shows while it's working so you have a sense of how much more there is to go. Each advance represents one student being assigned their peer reviews. There's a slight pause at the end while it catches up (probably inefficient programming on my part) and then the page reloads.

When the page reloads, you now have this.

Peer Reviews

Those 355 peer review assignments took my script about 30 seconds to complete. The 1141 peer reviews for the other group set took about 58 seconds. That was on a the test instance of Canvas over a DSL connection, your results may vary.


I made a video so you could see it in action.

The Little Things ...

There are some things you may have not noticed, possibly because they weren't mentioned.

Automatically Picking the Group Set

If your class only has one group set in it, then it defaults to that group set rather than making you choose it. It also defaults to a particular group set if the assignment you're attaching the peer reviews to is a group assignment.

Proper? Sorting of Group Sets

The list of group sets is sorted alphabetically. I had, in order, Accountability, Communication, Project 1, Project 2, and Project 10.

Wait a minute! You know from other frustrations with Canvas that Project 10 is between Project 1 and Project 2. Well, alphabetically it is, but I threw in a little hack that will work most of the time except when it doesn't work.

The trick was to left-pad all of the numbers with 0's and then take the right-most 5 digits. 5 was an arbitrary number, but I figured that someone wouldn't have more than 100,000 group sets in their course. However, if someone named their group sets by zip+4 codes, which are 9 digits long, then it would not look good. Those people are free to modify the code to add extra 0's and use a longer string.

Interrupting and Restarting

The code only runs while you are on the page. That means that if you leave the page while it's assigning the peer reviews that it will not finish.

Luckily, all you need to do to finish the job is to come back, reload the page, and click the button again. It scans the list to see which peer reviews still need to be assigned so it picks up where it left off.

It only reloads the page if it assigns peer reviews. If you are completely done assigning and you try it again, it will show the progress bar at 100% and leave it there.

Reviews Assigned to the Entire Group

This program does not try to assign each a fixed number of peer reviews like you can do with Canvas' automatically assign. It just assigns peer reviews to everyone who is in your group. If you're on a team with 3 people, you get 2 peer reviews to complete. If you're on a team with 10 people, then you get 9 peer reviews.


This should work out of the box for people who are hosted by Instructure and have their Canvas instance ending in If your institution uses a custom domain like, then you will need to modify the // @match statement on line 5 to match your instance.

The only other customization is a Boolean flag on line 12 called reloadPageWhenFinished. It defaults to true, meaning to reload the page when finished. If you don't want the page to reload, then change that to false. I figured most people wanted to see the changes when they were made, but I made it a configuration option just in case. 

Technical Details

Most people probably don't care, but this is the first script I've written that tries to use a more modern version of JavaScript including Promises, the Fetch API, const and let instead of var, and arrow functions. It results in cleaner looking code and those things are supported on recent versions of the major browsers, but it probably won't work on older versions of the browsers.

Anyway, as my first script, I may not have everything right, especially with the Promises. But it works and is definitely easier than manually assigning the peer reviews, so I'm making it available to people.

Submissions are Still Required

This script does not attempt to get around the Canvas requirement that a submission be made before students can complete the peer reviews.

In my class, I have students provide feedback using peer reviews on an assignment different than the one they're turning in. That way I can assign a different rubric to their peer reviews than what I'm using for the project. As a separate assignment, there is no submission. It turns out that in Canvas, the peer review links that you get by going to the assignment page are tied to the submission for that assignment. For on paper or no submission assignments this doesn't happen until the instructor puts a grade into the grade book.

Even when there is a submission allowed, Canvas doesn't show anything until there is a submission made. Here is what Bizarre Ability sees from the assignment page before she has turned in the assignment.

Assignment Details

There is no list of peer reviews.

However, if she goes to the To Do list that we tell students not to use, then she sees this:

Student To Do List

There are two peer reviews that she needs to complete, but she has no idea who they are for.

When Bizarre goes click on the first one, she sees a screen and the only place she knows who she is responding to is in the breadcrumb.

Student Peer Review

This probably helps explains why one of less-tech-savvy students put feedback for all of the peer reviews into a single submission comment.

At least the item disappeared from the To Do list once it was completed.

What I've started doing in my class is faking a submission for every student and assigning them a default grade in the grade book. Of course I use 0 because I want them to know what will happen if they don't complete the assignment, but then you have to deal with "Why did I get a 0 for this?" because they didn't read the instructions on the assignment because they clicked on the To Do list instead of the assignment.

Once the grade is entered, then they see the submission details and the list of students who they need to peer review. In this case, Bizarre had already provided feedback to Clicking Sentence from the To Do list.

Student Assignment Details


There are a couple of threads in the Community that are related to this.


Thanks‌, this is fantastic! I had been supporting a class that wanted to do group structured peer reviews like this and they ended up having to abandon it because of the time it required to set it up. This is perfect for their needs!

Community Member

This is excellent--I was one of the folks who had requested this function a while back. This new script promises to save me a huge amount of time!

Lamplighter II

Thank-you once again‌! This canvancement is definitely worth a 3am write-up!! I've had to set up the intra-group peer reviews the long way for instructors by providing them a list of their student groups and reminding them to do it all manually :S  So I delegated to them, and they delegate to the TA, no one wants to sit there doing all that assigning. I did it once because they were slow getting on it and the students needed it-- I wonder if that was intentional. But yes very painful to do it manually and not make a mistake.

But now with this script... hmm do I teach them how to install it in their browsers or do I save that magic for myself so I look very wizardly. heh I'll just let them know there is some mercy and kindness in the universe and there is a way to do it very easily so no more shying away from the possibility.

Did I say thank-you? Thanks a bunch - that's 160 thank-yous for the batch of intra-group peer reviews I had to assign manually.

And just so I'm clear on the steps to tell instructors:

1. make the assignment, give default grade of 0 to everyone

2. run the script for peer review

3. change the grade after the reviews are complete

Cheers - Shar

Community Advocate
Community Advocate

This is astonishing and of massive help to so many departments in our school. Such a good idea too. Comprehensive explanation and video.

Many thanks for giving your support and time so freely to the community.



The three steps are certainly 1 way to accomplish the intra-group peer review. It depends on the settings and this is where flexibility makes it difficult to get a single set of instructions.

In my class, the peer review is different from the group assignment, so yes, those are the three steps I follow -- plus a huge note in the instructions that remind them that peer reviews are not supported in the mobile apps and they will need to use a browser and that their grade will be a 0 until the instructor gets the assignment graded.

Another way I've seen people work around it is to make the submission be a text box that requires the students to put something, anything, in and then they get to see the peer reviews.

If a teacher wanted the students to comment on the paper they had written and turned in as a group assignment, they may want them to submit before they can see the peer review.

There are other imperfect solutions as well. If you don't want the 0 to freak students out, you could tell it not to count the assignment towards the final grade or to make it worth 0 points and then change it later. I didn't take that approach because I felt it would encourage students argue that it was my fault they didn't do it since since it didn't count or was worth 0 points. 

This thread also goes to show what happens when you assume things. I wrote it in the higher ed group and then shared it with Canvas admins and K12. I thought about instructional designers, but figured it was something that teachers would be doing after the class was going and the instructional designers wouldn't be using it. It seems that many of the comments are coming from IDs. Sorry about that.


I thought of and tried another trick today. I muted the assignments. That way they don't get the 0 bringing their grade down but they can't argue that it wasn't worth anything and so they didn't do it. I typically don't mute, so I hadn't thought of that one.

Working through that process with the class brought up two other concerns -- now 12 weeks into a 16 week semester. The first was "why does Canvas say that my 10/10 isn't going to be counted towards the final grade?" My initial reaction was "what a wonderful spot to be in" but the student didn't find that helpful, so I went ahead and provided the full explanation. The second is "why do I have a 0 for this assignment [that I hadn't graded]?" Because you accidentally typed 0 and used the what-if grades in Canvas so you told it to pretend that assignment was a 0.

Neither of those is directly related to the issue of peer reviews, but it hopefully shows that there is a disconnect between where we think the students are and where they actually. And while that orientation that we make them complete (at our school) before they get into the class may benefit some, it's obviously not working as well as we thought it was.

Lamplighter II

I mute assignments all the time, I generally try to setup the course with the assignments already muted. And it's so easy to do with the Adjust All Assignment Dates on One Page

So you're saying the assignment can be muted and it will still show the student the names of the peer reviews they need to complete on the assignment page? The way we've used Peer Reviews with the instructors who wanted it was a 3 part assignment:

  1. Student submits their draft. peer reviews other drafts using the assignment rubric. Graded for completion by Instructor/TA.
  2. Student submits a text-box write up of the reviews they completed and what they learned from looking at others. Graded by Instructor/TA.
  3. Student submits the final version incorporating the feedback from the reviews. Graded for content by Instructor/TA with rubric.

If just the mute will still show who they have to review, then that's grrrreat! I'll test and get back to the thread once I have screenshots to show to my instructors as well.

I do like the 0 though because then the students cannot get away with not turning in a draft. Hmmm or maybe a default of 1. I guess it will depend on the impact to the instructor's overall grading. We have some instructors who use straight points already portioned into weights and others who (wisely) use grading categories.

And we do strongly believe our students use the To-Do list so we've got Peer Review instructions that reference it showing up in the to-list and on the assignment page to see who specifically.

Cheers - Shar

P.S. Why is Bizarre Ability a girl? Smiley Wink


I went in and tested to make sure. Accountability Paper is muted in the gradebook and the top row is Bizarre Ability.


On the assignments page (the list of assignments), it does not seem to affect what is displayed, whether muted or not. I don't see peer reviews assigned there at all.


On the To Do list, no, it does not show the name of the student -- whether muted or not.

On the assignment page, it does the names of the assignments, even when muted, provided there is a submission for them.


That last comment is because it is muted. Which means students may not be able to see the feedback that others have provided. To confirm, I went to Clicking Sentence and the feedback from Bizarre Ability was not visible while the assignment was muted, but became visible as soon as I unmuted it. That may be good if you want them to wait until everyone has had the chance to provide feedback, but it might be bad if you want the receipt of feedback to encourage them to provide it others.

There's never a simple solution is there?

You're putting way more thought into this than I did. I just wanted a way to assign intra-group peer reviews but thought I should mention that there still has to be a submission for them to show up to the students on the assignment page.

For Bizarre Ability, I'm merely using the response she provided at the beginning of the semester when I asked what pronoun set (open ended question) the student would like to be addressed by that semester. Or maybe it was a he but I want to mask his real identity so I changed it to a she for purposes of the video. Inquiring minds will never know.

Surveyor‌ Thank you so much for all the wonderful things you have created for the Canvas Community!  

I have a couple of questions / feature requests....and NO is a perfectly acceptable answer!

1.  Would it be possible to make the intra group reviews be anonymous?

2.  For one of my group projects I have the students fill out a rubric for each student.  The questions in the rubric consist of 5 "ratings" questions ie, "on a scale of 1-10, how responsive was this student to communications from group members", and a couple of short answer questions.  I then collect all of the responses, crunch numbers, then return to students anonymously. 

As you can imagine, this is a fairly time intensive project for me...especially in a class of 100+ . I am just wondering if this script could handle something like this.

Thanks again for all of your hard is appreciated!

Pat Immel


I'm not sure I follow.

The checkbox to select Anonymity is when you set up the peer reviews, not when you assign the peer reviews. That is a totally separate process from what my script does.


I don't use the anonymous feature, so I had to look up the page in the guides to see how they worked: How do I use peer review assignments in a course? 

Unfortunately, that didn't help me understand your question. The anonymity goes both ways, you can't see who you're reviewing or and the person who got the review won't know who provided it. But if you want them to provide feedback to each other, then they would need to know who they were reviewing.

I am going to make a guess about what I think you're saying, but this is definitely prefaced by my personal experience and what I've done in the past, so it may not be anywhere close to what you're talking about. I apologize ahead of time for being obtuse.

There have been times where I have asked each student to tell me about the other students in their group in an effort to determine the group dynamics, who contributed, who slacked, and so forth, so that I could assess group participation. I had them write a paper with a paragraph about each student's contributions, including their own, and give a score for each student. I contributed my own score for how well they completed this assignment. Each student's final result was the average of what the students scored and my score. I then provided that information back to the student as a summary result.

Is that anywhere close to what you're asking for?

I was never able to get Canvas to do that with rubrics, but I haven't used peer reviews much until this semester (I did a few times a couple of years ago, but they were a pain to do with peer reviews so I gave it up). If you have anonymous peer reviews, then the student would not know who they were providing the feedback to unless there was an assignment turned in that had the student's name visible -- and just that student's name without the names of the other people in the group.

I suppose that if you had an assignment with a Text Entry submission that asked for their name, then you could enable anonymous peer reviews and assign them to each member of the group. You could then fetch the rubric results through the API and compile a composite score. But the students would still be able to see the individual rubrics that were filled out -- unless perhaps you muted the assignment so that they couldn't see the feedback.

If all you were after were the rubrics so that you could compile an anonymous composite result, that you could make an assignment with peer reviews but not anonymous, mute it, assign intra-group peer reviews. Let the students complete the feedback. Then you do your processing to come up with a composite score that you want to give them anonymously. You then delete the assignment so that it can never be unmuted. This last paragraph is untested -- I do not know what happens to peer review rubrics when an assignment is muted.

Lamplighter II


It sounds like you're after group ratings rather than group peer reviews. We've had a few successes using a Google Form with the group member names already populated and some selective branching and using Canvas quiz with Fill-in-the-blank to input the group member name and rating.

The spreadsheet version of the google form can do the math calculations for you. We actually did an iframe-embed of the google form into a Canvas survey worth a few nominal points for completing the survey. I do not know if the instructor provided the feedback back to the students, but I do believe the rating scores were compiled (averaged?) to put into a Canvas gradebook assignment.

With the Canvas quiz, you can see the quiz statistics in the responses... I'm actually not sure what the instructor does with the canvas quiz group rating-- I don't know if the score and feedback gets back to the student or if the person providing the feedback just gets a score for rating.

At any rate, is that what you're looking for? A way to have students rate each other in the group and then you collect the responses to give back to the group members?

Cheers - Shar

Community Member, could you elaborate on the phrase, "What I've started doing in my class is faking a submission for every student"?

How do you fake a submission? (And is there a workaround for an instructor to upload a file on a student's behalf?)

Thanks for this script!

Navigator, I go into the gradebook and set the default grade to 0. That is sufficient to get the Submission block that contains the list of peer reviews to complete to show up. Whether you need to do that depends on how your peer reviews are set up, but it's necessary for mine.

There is a feature request on Product Radar asking for the ability to" modifiedtitl.... I don't want to say there's no way to do it. Certain roles (typically admin roles) can masquerade or act as another user to submit some types of assignments, but in general, it's not easily accomplished.

Learner II

This looks very interesting. We are looking at doing more peer review. 

Explorer II

I've two things to add, after of course another THANK YOU!  So awesome.

First, you can now assign peer reviews without a submission!  Not sure when then changed that but we discovered it a few months ago.

Second, I couldn't get tampermonkey scripts to work in the past.  I was working with the developer of the chrome quiz printing extension and we discovered that it is our vanity url ( that was not working.  All I had to do was go to my page in canvas and change from the canvas url to the url and it worked.  So I decided to give that a try with this tool, and voila!  the tampermonkey script worked.  I'm not sure if anyone else has run into this problem so I thought I'd share.

Thanks again for taking what was an hour's work and making it 5 seconds.  More so this makes it possible for me to do group member evaluations in some of our large classes with several hundred students too!  Awesome work!



You can modify the // @include or // @match line of the script to refer to the vanity URL (in this script, it's match, but some of my scripts use include). This way, you don't have to switch URLs to get it to work, it's just part of Canvas. This is briefly documented in the "customization" section above.

It's nice to know that you don't have to have the submission first. I'll have to do some testing before I change the instructions to make sure I understand how that works.


Is there a tweak that could be made that would make it "INTER" group instead of "INTRA" group, so that it will automatically assign based on people not in their group (ie reviewing something posted by someone not in their group).

Backstory - 

Instructor wants to have a group project and each group would post a short video to a discussion board. Then each group member would be assigned other videos (not their own to review). 

In writing I am seeing a potential flaw as only one group member would be posting for the entire group so this would have to account for which person has actually posted so they could review. We could have each team member post the a copy of their video but not sure if that would help.

Any thoughts on the feasibility of this? 


I used to do this in my statistics course many years ago (before writing this script). It wasn't as straight forward as it seems, but it wasn't so much the group thing you're concerned about unless Canvas has changed the way things work since then. I'm working from about 4.5 year old memories here so I may have something wrong. I did go back to Spring 2015 to double check some things and that doesn't mean it hasn't changed since then.

The problem was that even though it was submitted by a group, the review was of an individual and only that individual could see the reviews.

For example, let's say that we have Team 1: Alice, Bob, and Carol; Team 2: Dave, Ed, and Fiona; and Team 3: George, Hilary, and Iona. In each case, let's assume it's the first person alphabetically that turned in the group assignment. The person who turns it in is irrelevant.

I cannot tell Dave to review Team 1's submission. Furthermore, when I'm assigning the peer reviews, I have no way from that screen of knowing who is in what group, so I had to have a list of group members somewhere else.

I had to tell Dave to review Alice or Bob or Carol as an individual. If I assign Dave to review Alice, then only Alice can see the review from Dave; Bob and Carol cannot. That means that I have to mix it up and assign Dave and George to review Alice, Ed and Hilary to review Bob, and Fiona and Iona to review Carol. It doesn't have to be that exact match up, but I wanted each person to have some feedback in case the three of them couldn't get together to go through things. I would hate for all of the feedback to go to Bob and then have him be a non-existent member of the group and others be left reviewless.

Back then, all of this was done in an Excel spreadsheet making sure that I balanced the names (both on the giving and receiving end) and kept people out of their own groups. Mine was complicated even more because I had two sections combined, so I made section 2 review section 1 and vice-versa. That way when it came time to give the presentations, they hadn't already read about it.

It wouldn't be as much of a tweak as a rewrite, but one could use it as a starting point.

I know I try to come through for you when I can, but I do not expect I can help this time, certainly not in enough time to help your faculty. Our school just decided 2 hours ago to extend spring break a week (it was set to end this week) and go with online instruction because of concern about the cororavirus. Since all of my classes are face-to-face, my spare time just dropped to nil. I haven't reached full panic mode yet, but I'm sure it will come quickly.


Thanks for the thoughtful reply. I ABSOLUTELY understand as my university just extended our spring break (starts next week and is now two weeks long) and then is coming back as online for at least another week after that. I, in no way was expecting a solution, especially within the timeline my instructor needs it. It was more just a question of feasibility  or just in case there was a quick change of code that my make it work.

Focus on your classes and taking care of that wonderful family of yours... and wash your hands. Smiley Happy



Are there any inherent limitations based on the number of users? I have a very large course with 449 students split into 90 groups (I know that's a lot). Every time I am running this it seems to "stall" out.




Matthew, there are two things that I can think of that might be affecting this. I haven't looked at it in a long time.

There is a limit on the time that a script can run inside a browser. I don't think that's it. It should be able to handle that load within the allowed time.

The second thing I can think of is that I used to rely on the browser to limit the number of connections that are being made to put in implicit throttling. Now that HTTP/2 is getting used, Canvas doesn't seem to have that limitation and I'm hitting the API rate limiting. When that happens, Canvas stops accepting requests for a while.

To test the second theory, try opening up the developer tools in Chrome (F12) right before you run the script and switch to the network tab. With that open, try running the script and see if it starts generating errors (I think the requests show up in red).



I am definitely getting some errors. But I am not sure how to read them. Attached is a screen shot. If there is a better way to share this data, please let me know.

UserScript Errors.png



The 403 errors are forbidden and what will happen if you exceed the API rate limit threshold. You can click on the "users" at the top (preferably the one in red) and look for the response headers. It should contain an x-rate-limit-remaining (or something like that) that is 0 or so close to 0 that there was a request that pushed it over the top.

The solution is to limit how quickly the requests are made. I've used the Bottleneck library to do that in some of my more recent projects (maybe in the one that fetches the rubric results for an entire assignment), but I don't know that I've published any of them.

You may have noticed I'm not in the Community as much as I used to be. I'm swamped with school work (teaching online doesn't give me as much free time as when I was teaching face to face) and the new Community and me do not get along. I do not have an ETA on this, nor even an ETS (estimated time to start).

Out of curiosity, what happens when you run the script multiple times. Does it finish the ones the that it didn't pick up the first time? (you may want to try that in the Beta or Test instance)


I completely understand the swamped and adjusting to the new community. I have been a bit lax here in the community as well over the last six months.

When I run this multiple times, nothing happens and it just sits looking like it is still loading. I have left it for over an hour and nothing changed. The additional students are never assigned peers to evaluate.

When I click on the first user error I got an x-rate-limit remaining of -79.72145190569995.

UserScript Errors2.png


I appreciate any help.

About the Author
I'm James Jones. The new Community software Khoros doesn't seem to like people using real names, but I think that names are important part of building community. I'm here trying to make Canvas a better experience for people. I hate repetitive tasks and will spend 13 hours writing a computer program to automate something that takes 5 minutes to do. The last two statements often benefit others in the form of Canvancements, which are my Canvas Enhancments that I contribute to the Canvas Community.