Skip to main content

Resource

AI Pet Adoption Matching: How PawPlacer Built It

How PawPlacer's matching engine uses vector embeddings and smart guardrails to pair shelter animals with the right adopters and fosters.

Cover for AI Pet Adoption Matching: How PawPlacer Built It

Matching animals with adopters has always been part intuition, part guesswork. An experienced shelter worker can look at a family's application, look at a dog's profile, and have a pretty good sense of whether it'll work. The problem is that intuition lives inside one person's head. It doesn't transfer when they leave, and it doesn't help much at 2 AM when you're scrolling through 40 applications trying to figure out which ones to prioritize.

So we wanted to build something that could do the pattern-matching part for you: look at what an animal needs, look at what a person can offer, and figure out how well they line up. It's not meant to replace your judgment. It just gets the best candidates in front of you so your team isn't starting from scratch every time.

The simple version

Here's what it does from a shelter worker's perspective: you open a pet's profile, click on the Matches tab, and you see a ranked list of adopters and fosters who might be a good fit. Each one has a score (Excellent, Good, Fair, or Low) along with a short summary of why the match works (or doesn't). You can also go the other direction: open an adopter's profile and see which available animals are the best fit for them.

The matching considers things like species preference, living situation, experience with animals, whether they have kids or other pets, the animal's temperament and medical needs, and a bunch of other factors pulled from your custom forms. It flags potential problems (reactive dog + household with small children, for example) and highlights strengths (experienced foster offering exactly the kind of environment a shy dog needs).

You can run a quick match that takes a few seconds, or a full match that takes a bit longer but gives you detailed explanations for each pairing. Either way, the results show up right in the profile page. No separate app, no export, no extra steps.

How we actually built it

If you don't care about the technical stuff, skip this section. But if you're the kind of person who wants to know what's under the hood, here you go.

The system works in three layers.

Profile building. When a pet or a person's data changes, we build a compatibility profile: a text summary of what matters for matching purposes. For animals, this is deterministic. We pull species, breed, temperament, medical complexity, behavioral notes, and custom form fields into a structured format. For adopters and fosters, we use an LLM to synthesize their application answers into a summary of what they offer and what they're looking for. All of this runs through a PII redaction pipeline first, so emails, phone numbers, addresses, and names get stripped before anything leaves your database.

Embeddings and vector search. Each profile gets turned into a 512-dimensional vector using OpenAI's text-embedding-3-large model. Those vectors live in your Postgres database using pgvector, indexed with HNSW for fast approximate nearest-neighbor retrieval. When you request matches, we do a cosine similarity search to find the closest vectors (basically, the profiles that are most semantically similar to each other). This is the "quick match" mode and it runs in a couple seconds even with thousands of profiles.

Guardrails and scoring. Deterministic checks reject explicit household safety conflicts with children, dogs, or cats, and cases where an applicant has declined bonded-pair, medical, special-needs, or behavioral care that the pet needs. Species preferences, housing, and available foster capacity are evaluated separately through profile evidence, readiness, and AI scoring.

The final score combines AI scores for the available fit dimensions with retrieval evidence. Confidence depends on the less complete profile, so a detailed pet record cannot make an empty applicant profile look well supported. Missing preferences stay unknown rather than being presented as a requested type of pet.

For full matches (not quick), we also generate a natural-language explanation for each top candidate: what makes the match strong, what the concerns are, and what the shelter should consider. These are generated on-demand so they're always based on current data.

What it is and isn't

It surfaces suggestions, not decisions. Your team still reviews every match and makes the final call. The AI doesn't approve adoptions, reject applicants, or message anyone. All it does is take the stack of possibilities and put the most promising ones near the top.

Privacy was a real concern for us from the start. The matching engine never sees names, phone numbers, email addresses, or physical addresses. It works with compatibility-relevant information only: living situation, pet experience, what people are looking for, what the animal needs. The PII redaction runs three separate layers (field type exclusion, column deny lists, and regex content scanning) to keep personal data out of the pipeline. And if your organization is in the EU, UK, or Switzerland, the feature is automatically disabled to comply with GDPR.

Setting it up

It's an opt-in feature. Go to Settings > AI, flip the toggle, and choose which custom form fields should be included in matching profiles. (We only use fields you explicitly enable; we don't just vacuum up everything.) Then hit "Generate Profiles" to build the initial batch. After that, profiles update automatically when data changes.

The whole thing is included with your PawPlacer account, with no third-party integrations to configure.

Why this way and not a simpler rules engine

We could have built something simpler: a rules engine that checks a few boxes and spits out a yes/no. But the reality of matching is that the best fits often aren't obvious. A family that looks mediocre on paper might be perfect for a specific animal because of some combination of experience, patience, and lifestyle that a checkbox system would never catch.

Vector embeddings let us capture that kind of nuance. The text profiles describe compatibility in natural language, and the embedding space puts similar descriptions close together, even when they use completely different words. An adopter who writes "I work from home and have a quiet house" ends up near an animal profile that says "needs a calm environment with a present owner," even though they share zero keywords.

The guardrails keep it grounded. Embeddings are good at fuzzy matching but bad at hard constraints. A high similarity score must not override an explicit household safety conflict or a refusal to provide care the pet needs. So we layer deterministic rules where they matter and let the AI handle the judgment calls where it's actually useful.

If you're already on PawPlacer, go check it out. Settings > AI, enable matching, pick your fields, generate profiles. And if you haven't signed up yet, matching is included along with everything else.

Manage your rescue with PawPlacer

Free for every shelter, rescue, and foster network, with every feature included.