---
title: "How to manually check hundreds of animal shelters - every 14 days"
date: 2025-11-08T12:05:10+02:00
lastmod: 2025-11-09T21:05:10+02:00
draft: false
image: "uploads/checking-shelters.png"
categories: [ 'English' ]
tags: [ 'notfellchen', 'animal shelter', 'animal welfare', 'django' ]
---

I run a website called [Notfellchen](https://notfellchen.org) that list animals that are waiting for adoption. It's
currently restricted to fancy rats in Germany and that for good reason: Running this website involves **checking every
shelter every two weeks manually**. You need to visit the website, check if there are new animals, contact the shelter
and add them to notfellchen if they allow it. This takes time. A lot.

This blog post will outline some of the things I did in order to streamline this and make it possible to **check every
german shelter in 2.5 hours**.

## General process

When you establish a process. want others to help you or if you want to find inefficiencies, it's a good idea to
formalize it. So here is a rough BPMN diagram of the whole process.

{{< html animal-discovery.drawio.html >}}

## List of animal shelters

Focusing on the first step: We want to check the website of an animal shelter - but where do we get a list of animal
shelters from? Luckily there is an easy answer: [OpenStreetMap](https://openstreetmap.org) and I wrote a
whole [other blog post on how I imported and improved this data](https://hyteck.de/post/improve-osm-by-using-it/).

## Species-specific link

Importing this data provides us (most of the time) with a link to the shelter's website. However, rats are usually not
listed on the home page but on a subsite.
In order to save time, I introduced the concept of a species-specific link per organization and species.

So for the Tierheim Entenhausen this might look like this

| Species | Species specific link                                  |
|---------|--------------------------------------------------------| 
| Cat     | https://tierheim-entenhausen.de/adoption/cats          |
| Rats    | https://tierheim-entenhausen.de/adoption/small-mammals |

As animal shelter pages look very different from each other, clicking this link provides an enormous time benefit
compared to clicking through a homepage manually.

# Org check page

I set up a special page to make it most efficient to check shelters. It's structured in four parts:

* **Stats**: The stats show how many animal shelters are checked in the last two weeks and how many to go.
* **Not checked for the longest period**: Shows the animal shelters to check next, it's therefore sorted by the date
  they were last checked
* **In active communication**: A overview of the organizations where there is communication (or an attempt thereof).
  This can take multiple das or even weeks so the internal comment field is very useful to keep track.
* **Last checked** It sometimes happens that I accidentally set a organization to "Checked" by accident. I added this
  section to make it easier to revert that.

![A screenshot of the Notfellchen-Website showing the mentiond sections. Each rescue organization is listed with their website, species specific urls and shows the internal comment. There are three color coded buttons: "Organization checked", "Active Communication" and "Exclude from check"](screenshot-checking-site.png)

## Shortcuts

To make it even faster to work through the organizations I added some shortcuts for the most common functionality and
documented the browser own shortcut to close a tab.

* `O`: Open website of the first organization
* `CTRL+W`: Close tab (Firefox, Chrome)
* `C`: Mark first organization as checked

## Results

After implementing all this, how long does it take now to check all organizations? Here are the numbers

| Measurement                                               |              |
|-----------------------------------------------------------|--------------|
| Time to check one organization (avg.)                     | 12.1s        |
| Organization checked per minute                           | 4.96 org/min |
| Time to check all (eligible) german animal shelters (429) | 1 h 16 min   | 

This excludes the time, it takes to add animals or contact rescue organizations. One of these actions must be taken
whenever an eligible animal is found on a website. Here you can see how this interrupts the process:

![A diagramm showing time on the x axis and number of shelters checked on the y axis. In the period from 11am to 12:15pm there are over 200 shelters checked at a relativly constanct rate. The checking is interrupted two times by adding animals and three times by contacting](progress.png)

And here is the breakdown of time per activity. A big caveat here is, that I did not follow up on previous conversations
here, therefore the contacting number is likely an underestimation.

| Activity   | Time spent | Percentage |
|------------|------------|------------|
| Checking   | 54 min 44s | 72.3%      |
| Adding     | 11 min 15s | 14.9%      |
| Contacting | 9min 41s   | 12.8%      |

To me, this looks like a pretty good result. I can't say which optimizations brought how much improvement, but I'd argue
they all play a role in reaching the 12s per rescue organizations that is checked.

In order to check all german animal shelters, one needs to put in about 2 and a half hours every two weeks. That seems
reasonable to me. Further improvements of the likely do not lie in the organization check page but the contact process
and adoption notice form.

For now, I'm happy with the results.

# Addendum: Common annoyances

When doing this over the last few months I encountered some recurring issues that not only were annoying but also take
up a majority of the time. Here are some that stood out

* **Broken SSL encryption** So many animal shelters do not have a functioning SSL certificate. It takes time to work
  around the warnings.
* **No results not indicated** More often than not, animal shelters do not have rats. However, when you visit a page
  like [this](https://tierschutzliga.de/tierheime/tierparadies-oberdinger-moos/tiervermittlung/#?THM=TOM&Tierart=Kleintiere)
  it's hard to know if there is a technical issue or if there are no animals for your search.
* **No static links** Sites where you have to click through a menu to get to the right page, but you can not link
  directly to it.
* **No website** Seriously, there are some animal shelters that only use Instagram or Facebook to tell people about the
  animals they have. This is not only a privacy nightmare, it's also incredibly hard to find out which information is
  up-to-date. Furthermore, there exists no data structure, so posts about animals often miss crucial information like
  the sex.

While I obviously have some grievances here, I know the organizations never have enough resources, and they'd
usually love to have a nicer website. Just keep that in mind too.