user159: Is there any software (or web-based service) that allows you to keep track of local, club-level Elo ratings? 
These ratings would not have any connection with official Elo ratings, it would be just an Elo rating within the universe of players in a club (i.e. games in various social tournaments would compute for the rating).

user9207: I recently built https://sortmatch.ca to do this kind of thing. It uses Glicko2 instead of Elo, but the effect is roughly equivalent.

user3467: If anyone is still looking for something like this, I've build a fairly simple one here:
https://github.com/richardadalton/EloRate
At the moment you'll have to host it yourself, but I may offer a hosted service in the future.
-Rd

user21130: The free Excel add-in Chess Ranking Assistant found at https://www.add-ins.com/free-products/chess-ranking-assistant.htm uses the glicko system and is menu driven for easy of use. It is designed for chess clubs

user167: I just downloaded and played around with a lightweight freeware item for Windows called ELORater that seems to provide what you're after. You can create a "group" for your club, and then add players to the group, along with whatever initial ratings you want them to have. Then you can just input the results of any games that get played and the program maintains an updated list of player ratings for you.

user7575: It seems that rankade, our ranking system for sports, games, and more, fits your needs. 
It's free to use and it's designed to manage rankings (and stats, including matchup stats, and more) for small to large groups of players.
Rankade doesn't use Elo, but its algorithm (called ree algorithm), although more complex (here's a comparison between most known rating system, including Elo, Glicko and TrueSkill), is similar to Elo if you play 1-on-1 matches only.

user307: Even if it is not available, something like this is not too hard to implement yourself. Here is an example with extremely silly and simple rating system that is just meant to give you an idea. But I don't think that using actual Elo formula that much harder.
EDIT: I edit my implementation to use Elo formula (not including floors) given by the formula here
def get_exp_score_a(rating_a, rating_b):
    return 1.0 /(1 + 10**((rating_b - rating_a)/400.0))

def rating_adj(rating, exp_score, score, k=32):
    return rating + k * (score - exp_score)

class ChessPlayer(object):
    def __init__(self, name, rating):
        self.rating = rating
        self.name = name
    def match(self, other, result):

        exp_score_a = get_exp_score_a(self.rating, other.rating)

        if result == self.name:
            self.rating = rating_adj(self.rating, exp_score_a, 1)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 0)
        elif result == other.name:
            self.rating = rating_adj(self.rating, exp_score_a, 0)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 1)
        elif result == 'Draw':
            self.rating = rating_adj(self.rating, exp_score_a, 0.5)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 0.5)

This works as follows:
>>> bob = ChessPlayer('Bob', 1600)
>>> john = ChessPlayer('John', 1900)
>>> bob.rating
1600
>>> john.rating
1900
>>> bob.match(john, 'Bob')
>>> bob.rating
1627.1686541692377
>>> john.rating
1872.8313458307623
>>> mark = ChessPlayer('Mark', 2100)
>>> mark.match(bob, 'Draw')
>>> mark.rating
2085.974306956907
>>> bob.rating
1641.1943472123305

Here is my original python implementation:
class ChessPlayer(object):
    def __init__(self, name, rating):
        self.rating = rating
        self.name = name
    def match(self, other, result):
        if result == self.name:
            self.rating += 10
            other.rating -= 10
        elif result == other.name:
            self.rating += 10
            other.rating -= 10
        elif result == 'Draw':
            pass

This works as follows:
>>> bob = ChessPlayer('Bob', 1600)
>>> john = ChessPlayer('John', 1900)
>>> bob.match(john, 'Bob')
>>> bob.rating
1610
>>> john.rating
1890
>>> mark = ChessPlayer('Mark', 2100)
>>> mark.match(bob, 'Mark')
>>> mark.rating
2110
>>> bob.rating
1600
>>> mark.match(john, 'Draw')
>>> mark.rating
2110
>>> john.rating
1890  


159: <p>Is there any software (or web-based service) that allows you to keep track of local, club-level Elo ratings? </p>

<p>These ratings would not have any connection with official Elo ratings, it would be just an Elo rating within the universe of players in a club (i.e. games in various social tournaments would compute for the rating).</p>
 9207: <p>I recently built <a href="https://sortmatch.ca" rel="nofollow">https://sortmatch.ca</a> to do this kind of thing. It uses Glicko2 instead of Elo, but the effect is roughly equivalent.</p>
 3467: <p>If anyone is still looking for something like this, I've build a fairly simple one here:
<a href="https://github.com/richardadalton/EloRate" rel="nofollow">https://github.com/richardadalton/EloRate</a></p>

<p>At the moment you'll have to host it yourself, but I may offer a hosted service in the future.</p>

<p>-Rd</p>
 21130: <p>The free Excel add-in Chess Ranking Assistant found at <a href="https://www.add-ins.com/free-products/chess-ranking-assistant.htm" rel="nofollow noreferrer">https://www.add-ins.com/free-products/chess-ranking-assistant.htm</a> uses the glicko system and is menu driven for easy of use. It is designed for chess clubs</p>
 167: <p>I just downloaded and played around with a lightweight freeware item for Windows called <a href="http://www.garnergaggle.org/papa/chess/ELORater/" rel="nofollow">ELORater</a> that seems to provide what you're after. You can create a "group" for your club, and then add players to the group, along with whatever initial ratings you want them to have. Then you can just input the results of any games that get played and the program maintains an updated list of player ratings for you.</p>
 7575: <p>It seems that <a href="https://rankade.com" rel="nofollow">rankade</a>, our ranking system for sports, games, and more, fits your needs. </p>

<p>It's free to use and it's designed to manage <strong>rankings</strong> (and <strong>stats</strong>, including matchup stats, and more) for small to large groups of players.</p>

<p>Rankade doesn't use <strong>Elo</strong>, but its algorithm (called <em>ree</em> algorithm), although more complex (here's a <a href="https://rankade.com/ree#ranking-system-comparison" rel="nofollow">comparison</a> between most known rating system, including <em>Elo</em>, <em>Glicko</em> and <em>TrueSkill</em>), is similar to Elo if you play 1-on-1 matches only.</p>
 307: <p>Even if it is not available, something like this is not too hard to implement yourself. Here is an example with extremely silly and simple rating system that is just meant to give you an idea. But I don't think that using actual Elo formula that much harder.</p>

<p><strong>EDIT:</strong> I edit my implementation to use Elo formula (not including floors) given by the formula <a href="http://en.wikipedia.org/wiki/Elo_rating_system">here</a></p>

<pre><code>def get_exp_score_a(rating_a, rating_b):
    return 1.0 /(1 + 10**((rating_b - rating_a)/400.0))

def rating_adj(rating, exp_score, score, k=32):
    return rating + k * (score - exp_score)

class ChessPlayer(object):
    def __init__(self, name, rating):
        self.rating = rating
        self.name = name
    def match(self, other, result):

        exp_score_a = get_exp_score_a(self.rating, other.rating)

        if result == self.name:
            self.rating = rating_adj(self.rating, exp_score_a, 1)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 0)
        elif result == other.name:
            self.rating = rating_adj(self.rating, exp_score_a, 0)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 1)
        elif result == 'Draw':
            self.rating = rating_adj(self.rating, exp_score_a, 0.5)
            other.rating = rating_adj(other.rating, 1 - exp_score_a, 0.5)
</code></pre>

<p>This works as follows:</p>

<pre><code>&gt;&gt;&gt; bob = ChessPlayer('Bob', 1600)
&gt;&gt;&gt; john = ChessPlayer('John', 1900)
&gt;&gt;&gt; bob.rating
1600
&gt;&gt;&gt; john.rating
1900
&gt;&gt;&gt; bob.match(john, 'Bob')
&gt;&gt;&gt; bob.rating
1627.1686541692377
&gt;&gt;&gt; john.rating
1872.8313458307623
&gt;&gt;&gt; mark = ChessPlayer('Mark', 2100)
&gt;&gt;&gt; mark.match(bob, 'Draw')
&gt;&gt;&gt; mark.rating
2085.974306956907
&gt;&gt;&gt; bob.rating
1641.1943472123305
</code></pre>

<p>Here is my original python implementation:</p>

<pre><code>class ChessPlayer(object):
    def __init__(self, name, rating):
        self.rating = rating
        self.name = name
    def match(self, other, result):
        if result == self.name:
            self.rating += 10
            other.rating -= 10
        elif result == other.name:
            self.rating += 10
            other.rating -= 10
        elif result == 'Draw':
            pass
</code></pre>

<p>This works as follows:</p>

<pre><code>&gt;&gt;&gt; bob = ChessPlayer('Bob', 1600)
&gt;&gt;&gt; john = ChessPlayer('John', 1900)
&gt;&gt;&gt; bob.match(john, 'Bob')
&gt;&gt;&gt; bob.rating
1610
&gt;&gt;&gt; john.rating
1890
&gt;&gt;&gt; mark = ChessPlayer('Mark', 2100)
&gt;&gt;&gt; mark.match(bob, 'Mark')
&gt;&gt;&gt; mark.rating
2110
&gt;&gt;&gt; bob.rating
1600
&gt;&gt;&gt; mark.match(john, 'Draw')
&gt;&gt;&gt; mark.rating
2110
&gt;&gt;&gt; john.rating
1890  
</code></pre>
