Bred Cows & Pairs for Sale · Southwest MissouriCattle worth building a herd around.
Quality bred cows, productive cow-calf pairs, and select feeder cattle—represented clearly, grouped intentionally, and prepared for cattlemen who want to know what they are buying before they pull in.
Preg checkedBred females represented with pregnancy information.
Fully vaccinatedHealth preparation before cattle are offered.
VitaFerm fedNutrition program built around cattle condition.
Pickup or deliveryHelp loading or arranging transportation.
Stone Wall Farms
Cattle you can buy with confidence.
We focus on bred females, cow-calf pairs, and select feeder cattle that make sense for working cattlemen. Every active listing is built around the actual cattle being sold—not generic photos or dressed-up descriptions.
Actual cattle.Listing photos and videos come from the exact group being offered.
Useful details.Age, stage, quantity, tags, calf information, price, and known issues when available.
Easy to inspect.Ask for another photo, video, or clarification before making the trip.
How we sell
A better cattle-buying experience.
From preparation through pickup, the goal is to make buying replacement cattle clear, comfortable, and straightforward.
01
Prepared before they are offered
Our cattle are fully vaccinated, fed VitaFerm products as part of our nutrition program, and pregnancy checked so bred females can be represented accurately before they are listed.
02
Documentation for your cattle
Buyers receive available pregnancy documentation and cattle information that supports what was represented before pickup.
03
View, load, and head home
Come see the cattle in person and choose what fits your operation. We help get them safely loaded for the trip to your farm, or help coordinate delivery when needed.
Frequently asked
Before you make the drive.
Straight answers about the cattle, how they are prepared, and what to expect when you come see them.
What breeds do you sell?
We sell all types of cattle, not just one breed. Each listing shows the breed, age, pregnancy stage, and head count so you know exactly what you are looking at before you call.
What cattle do you typically offer?
We focus primarily on bred cows, bred heifers, and cow-calf pairs across a range of breeds, with select feeder cattle added as inventory allows.
Are bred females pregnancy checked?
Yes. Bred females are pregnancy checked before they are offered, and buyers receive the available pregnancy information for the cattle they purchase.
How are the cattle prepared?
Cattle are fully vaccinated and fed VitaFerm products as part of our nutrition program, with an emphasis on health, condition, and accurate representation.
Can I inspect cattle before buying?
Yes. Buyers can view cattle in person and request additional photos, videos, or clarification before making the trip.
What area do you serve?
We are based in Southwest Missouri and market cattle throughout the Springfield area and roughly 150 miles surrounding Springfield, including buyers across southern Missouri and northern Arkansas.
Can you help with delivery?
Yes. We can help load cattle for your trailer or help coordinate delivery when needed.
Where are you located?
Stone Wall Farms is based in Bois D'Arc, Missouri, in Greene County just west of Springfield. Call 417-818-3223 to set up a time to see cattle.
How much do bred cows and pairs cost?
Prices depend on age, breed, pregnancy stage, and condition, and follow the current cattle market. Each listing on our Available Cattle page shows its price or says call for price. Call 417-818-3223 for current pricing.
How do I find out when new cattle are available?
Join our buyer list. Tell us what you are looking for, such as bred cows, pairs, age range, or head count, and we will follow up when cattle fit your request.
Buyer list
Want first look at the next set?
Tell us what you are looking for—bred cows, pairs, age range, head count, or feeder cattle. We will keep your request on file and can follow up when cattle fit it.
Current bred cows, bred heifers, cow-calf pairs, and select feeder cattle. Every sale listing uses photos and videos of the actual cattle being offered.
Current inventory
Cattle currently for sale.
Browse the cattle below, open a listing for complete details, and contact us if you would like additional photos, video, or information before coming to view them.
Manage cattle listings, actual listing media, and availability.
Connect this file to Supabase before signing in.
One-time setup
Supabase Connected
This site is already connected to the Supabase project COWS. The database tables, Row Level Security policies, and cattle-media storage bucket have been provisioned. Create your admin user in Supabase Authentication, keep public signup disabled, then sign in here with that email and password.
-- Stone Wall Farms Supabase backend
-- Run this entire file once in Supabase SQL Editor.
create extension if not exists pgcrypto;
create table if not exists public.cattle_listings (
id uuid primary key default gen_random_uuid(),
slug text not null unique,
title text not null,
category text not null check (category in ('bred','pairs','feeders')),
category_label text,
status text not null default 'draft' check (status in ('draft','available','pending','sold')),
breed text,
head_count integer check (head_count is null or head_count > 0),
age_text text,
pregnancy_stage text,
preg_check_date date,
vaccinated boolean default true,
nutrition_program text default 'VitaFerm',
price_text text,
location text default 'Southwest Missouri',
description text,
sort_order integer default 100,
published_at timestamptz,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
create table if not exists public.listing_media (
id uuid primary key default gen_random_uuid(),
listing_id uuid not null references public.cattle_listings(id) on delete cascade,
storage_path text not null,
public_url text not null,
media_type text not null default 'image' check (media_type in ('image','video')),
alt_text text,
sort_order integer default 0,
is_cover boolean default false,
created_at timestamptz not null default now()
);
create table if not exists public.buyer_subscribers (
id uuid primary key default gen_random_uuid(),
name text,
phone text,
email text not null,
interest text,
head_count_text text,
notes text,
source text default 'website',
created_at timestamptz not null default now(),
unique(email)
);
create table if not exists public.leads (
id uuid primary key default gen_random_uuid(),
name text not null,
phone text,
email text,
interest text,
head_count_text text,
message text,
listing_id uuid references public.cattle_listings(id) on delete set null,
listing_title text,
source text default 'website',
status text not null default 'new' check (status in ('new','contacted','closed')),
created_at timestamptz not null default now(),
contacted_at timestamptz
);
-- Public-safe buyer list signup. This lets an anonymous visitor join or update
-- their own email record without granting public read access to the buyer list.
create or replace function public.join_buyer_list(
p_name text,
p_phone text,
p_email text,
p_interest text,
p_head_count_text text,
p_notes text,
p_source text default 'website'
) returns void
language plpgsql
security definer
set search_path = public
as $$
begin
if nullif(trim(p_email),'') is null then
raise exception 'Email is required';
end if;
insert into public.buyer_subscribers(name,phone,email,interest,head_count_text,notes,source)
values (nullif(trim(p_name),''),nullif(trim(p_phone),''),lower(trim(p_email)),p_interest,p_head_count_text,p_notes,coalesce(p_source,'website'))
on conflict (email) do update set
name=coalesce(excluded.name,public.buyer_subscribers.name),
phone=coalesce(excluded.phone,public.buyer_subscribers.phone),
interest=coalesce(excluded.interest,public.buyer_subscribers.interest),
head_count_text=coalesce(excluded.head_count_text,public.buyer_subscribers.head_count_text),
notes=coalesce(excluded.notes,public.buyer_subscribers.notes),
source=coalesce(excluded.source,public.buyer_subscribers.source);
end; $$;
revoke all on function public.join_buyer_list(text,text,text,text,text,text,text) from public;
grant execute on function public.join_buyer_list(text,text,text,text,text,text,text) to anon, authenticated;
create or replace function public.set_updated_at() returns trigger language plpgsql as $$
begin new.updated_at = now(); return new; end; $$;
drop trigger if exists cattle_listings_set_updated_at on public.cattle_listings;
create trigger cattle_listings_set_updated_at before update on public.cattle_listings for each row execute function public.set_updated_at();
alter table public.cattle_listings enable row level security;
alter table public.listing_media enable row level security;
alter table public.buyer_subscribers enable row level security;
alter table public.leads enable row level security;
-- Public website: read only currently available cattle and their media.
drop policy if exists "public read available cattle" on public.cattle_listings;
create policy "public read available cattle" on public.cattle_listings for select to anon using (status='available');
drop policy if exists "public read available media" on public.listing_media;
create policy "public read available media" on public.listing_media for select to anon using (exists (select 1 from public.cattle_listings c where c.id=listing_id and c.status='available'));
-- Admin: any authenticated Supabase user can manage listings. Keep public signup disabled.
drop policy if exists "admin manage cattle" on public.cattle_listings;
create policy "admin manage cattle" on public.cattle_listings for all to authenticated using (true) with check (true);
drop policy if exists "admin manage media" on public.listing_media;
create policy "admin manage media" on public.listing_media for all to authenticated using (true) with check (true);
-- Buyer list: public may join, only admin may read/update/delete.
drop policy if exists "public join buyer list" on public.buyer_subscribers;
-- Anonymous signups use the join_buyer_list() RPC above; no public table read/update access is granted.
drop policy if exists "admin manage buyer list" on public.buyer_subscribers;
create policy "admin manage buyer list" on public.buyer_subscribers for all to authenticated using (true) with check (true);
-- Leads: public may submit, only admin may read/update/delete.
drop policy if exists "public submit leads" on public.leads;
create policy "public submit leads" on public.leads for insert to anon with check (true);
drop policy if exists "admin manage leads" on public.leads;
create policy "admin manage leads" on public.leads for all to authenticated using (true) with check (true);
insert into storage.buckets (id,name,public,file_size_limit,allowed_mime_types) values (
'listing-media','listing-media',true,52428800,array['image/jpeg','image/png','image/webp','video/mp4','video/quicktime']
) on conflict (id) do update set public=true, file_size_limit=52428800;
drop policy if exists "public read listing media files" on storage.objects;
create policy "public read listing media files" on storage.objects for select to public using (bucket_id='listing-media');
drop policy if exists "admin upload listing media files" on storage.objects;
create policy "admin upload listing media files" on storage.objects for insert to authenticated with check (bucket_id='listing-media');
drop policy if exists "admin update listing media files" on storage.objects;
create policy "admin update listing media files" on storage.objects for update to authenticated using (bucket_id='listing-media') with check (bucket_id='listing-media');
drop policy if exists "admin delete listing media files" on storage.objects;
create policy "admin delete listing media files" on storage.objects for delete to authenticated using (bucket_id='listing-media');
create index if not exists cattle_listings_status_idx on public.cattle_listings(status,sort_order,published_at desc);
create index if not exists listing_media_listing_idx on public.listing_media(listing_id,sort_order);
create index if not exists buyer_subscribers_created_idx on public.buyer_subscribers(created_at desc);
create index if not exists leads_created_idx on public.leads(created_at desc);
create index if not exists leads_status_idx on public.leads(status,created_at desc);
-- Company info + logos (run once in Supabase SQL Editor)
create table if not exists public.site_settings (
id integer primary key default 1 check (id = 1),
data jsonb not null default '{}'::jsonb,
updated_at timestamptz not null default now()
);
insert into public.site_settings (id) values (1) on conflict (id) do nothing;
alter table public.site_settings enable row level security;
drop policy if exists "public read site settings" on public.site_settings;
create policy "public read site settings" on public.site_settings for select to anon, authenticated using (true);
drop policy if exists "admin insert site settings" on public.site_settings;
create policy "admin insert site settings" on public.site_settings for insert to authenticated with check (true);
drop policy if exists "admin update site settings" on public.site_settings;
create policy "admin update site settings" on public.site_settings for update to authenticated using (true) with check (true);
-- Custom listing tags (run once in Supabase SQL Editor)
alter table public.cattle_listings add column if not exists tags text[] not null default '{}';
update public.cattle_listings set tags = array[category] where (tags is null or tags = '{}') and category is not null;
do $$ declare r record; begin
for r in select conname from pg_constraint
where conrelid = 'public.cattle_listings'::regclass and contype = 'c' and pg_get_constraintdef(oid) ilike '%category%'
loop execute format('alter table public.cattle_listings drop constraint %I', r.conname); end loop;
end $$;
create index if not exists cattle_listings_tags_idx on public.cattle_listings using gin (tags);
Stone Wall Farms
Admin Dashboard
Manage cattle, buyer-list signups, and incoming leads.
These are the filter buttons on the Available Cattle page. Use the arrows to change the order.
Custom tags need a one-time database update. Copy the SQL, paste it into Supabase → SQL Editor → New query, click Run, then refresh this page. Your existing listings keep their current category.
-- Custom listing tags (run once in Supabase SQL Editor)
alter table public.cattle_listings add column if not exists tags text[] not null default '{}';
update public.cattle_listings set tags = array[category] where (tags is null or tags = '{}') and category is not null;
do $$ declare r record; begin
for r in select conname from pg_constraint
where conrelid = 'public.cattle_listings'::regclass and contype = 'c' and pg_get_constraintdef(oid) ilike '%category%'
loop execute format('alter table public.cattle_listings drop constraint %I', r.conname); end loop;
end $$;
create index if not exists cattle_listings_tags_idx on public.cattle_listings using gin (tags);
Add listing
Listings
Buyer List
Everyone who has signed up to hear about future cattle.
Name
Email
Phone
Interest
Head count
Joined
Company Info
Logos and contact details shown in the website footer. Leave a field blank to hide it.
Company info isn't set up in the database yet. Copy the SQL below, paste it into Supabase → SQL Editor → New query, click Run, then refresh this page.
-- Company info + logos (run once in Supabase SQL Editor)
create table if not exists public.site_settings (
id integer primary key default 1 check (id = 1),
data jsonb not null default '{}'::jsonb,
updated_at timestamptz not null default now()
);
insert into public.site_settings (id) values (1) on conflict (id) do nothing;
alter table public.site_settings enable row level security;
drop policy if exists "public read site settings" on public.site_settings;
create policy "public read site settings" on public.site_settings for select to anon, authenticated using (true);
drop policy if exists "admin insert site settings" on public.site_settings;
create policy "admin insert site settings" on public.site_settings for insert to authenticated with check (true);
drop policy if exists "admin update site settings" on public.site_settings;
create policy "admin update site settings" on public.site_settings for update to authenticated using (true) with check (true);
Leads
Buyer questions and cattle inquiries submitted from the website.
Status
Buyer
Contact
Interest / Listing
Message
Received
Buyer list
Get first look at new cattle.
Tell us what you are looking for. We will keep your information on the buyer list and can reach out when a matching group is posted.