A polished property gallery can still fail at delivery time: files may be missing, incorrectly named, exported in the wrong color space, or inconsistent in size. A small validation pipeline catches these problems before the client downloads the folder.
This guide outlines a lightweight, repeatable workflow for photographers, editing teams, and developers who manage real estate image deliveries.
1. Define the delivery contract
Treat the delivery specification as data, not a note buried in email. For each property, record:
- expected image count or approved range
- file type, usually JPEG
- color space, usually sRGB
- minimum and maximum pixel dimensions
- filename pattern
- whether virtually staged images require a suffix
- whether both web and print sets are required
A simple JSON contract is enough:
{
"property_id": "PS-2026-0712",
"expected_min": 24,
"expected_max": 36,
"format": "JPEG",
"color_space": "sRGB",
"min_width": 2000,
"filename_pattern": "PS-2026-0712_[0-9]{2}.jpg"
}
The important part is consistency. The same rules should be used by the editor, the uploader, and the final reviewer.
2. Validate filenames before visual review
A sortable filename makes omissions obvious and prevents accidental overwrites. Check that:
- every file starts with the property identifier;
- sequence numbers are unique;
- no temporary labels such as
final-finalorcopyremain; - staged variants are explicitly identified;
- hidden system files are excluded.
A basic Python check can flag duplicates and naming errors:
from pathlib import Path
import re
folder = Path("delivery")
pattern = re.compile(r"PS-2026-0712_(\d{2})(_staged)?\.jpg$", re.I)
seen = set()
errors = []
for file in folder.glob("*.jpg"):
match = pattern.fullmatch(file.name)
if not match:
errors.append(f"Invalid name: {file.name}")
continue
key = (match.group(1), bool(match.group(2)))
if key in seen:
errors.append(f"Duplicate sequence: {file.name}")
seen.add(key)
print("\n".join(errors) if errors else "Filename check passed")
This does not replace editorial judgment, but it removes repetitive checks from the reviewer.
3. Inspect technical metadata
Pixel dimensions alone do not prove that an image is ready. Read the metadata and confirm:
- width and height meet the destination requirement;
- orientation is correct after EXIF rotation;
- the embedded profile is sRGB;
- the file opens without decoder warnings;
- compression has not created visible banding or blocking;
- metadata does not expose information the client asked to remove.
ImageMagick can provide a compact report:
magick identify -format "%f,%wx%h,%[colorspace]\n" delivery/*.jpg
Store the report beside the delivery manifest. It creates a useful record when a portal later recompresses or resizes an upload.
4. Run visual checks at two scales
Automation finds measurable defects. It does not reliably decide whether a room looks natural.
Review thumbnails first to assess the gallery as a set:
- exposure and white balance should remain consistent;
- room order should make sense;
- exterior and interior images should not feel like different jobs;
- staged images should match the camera height and perspective of the source set.
Then inspect every final file at 100% for halos, masking errors, repeated textures, window-frame damage, warped verticals, sensor dust, and compression artifacts.
For teams that need specialist production support, PixelShouters real estate photo editing services cover the editing stage; the validation workflow in this guide remains useful whether production is internal or outsourced.
5. Detect duplicates with hashes
Cryptographic hashes identify exact duplicates even when filenames differ:
from pathlib import Path
from hashlib import sha256
hashes = {}
for file in Path("delivery").glob("*.jpg"):
digest = sha256(file.read_bytes()).hexdigest()
if digest in hashes:
print(f"Exact duplicate: {file.name} = {hashes[digest]}")
else:
hashes[digest] = file.name
Perceptual hashes can find near-duplicates, but use them as review flags rather than automatic deletion rules. Two bracketed exposures or two intentionally similar angles may be legitimate.
6. Generate a manifest
A delivery manifest should include each filename, dimensions, byte size, and checksum. This makes client-side verification possible and provides a reliable audit trail.
Example columns:
filename,width,height,bytes,sha256
PS-2026-0712_01.jpg,3000,2000,1842251,…
PS-2026-0712_02.jpg,3000,2000,1768940,…
Keep the manifest machine-readable. A CSV or JSON file is easier to compare than a screenshot.
7. Test the actual delivery path
The final check should happen through the same path the client will use:
- upload the completed folder;
- download it into a clean temporary directory;
- compare file count and checksums;
- open a sample from the downloaded copy;
- confirm share permissions and link expiry;
- verify that folder names and staged-image disclosures survived packaging.
This catches incomplete uploads, sync conflicts, expired links, and archive corruption that a local-only review cannot see.
A practical release gate
A property is ready only when all four gates pass:
- Contract: count, format, dimensions, and naming match the brief.
- Technical: files decode correctly, use the intended profile, and pass duplicate checks.
- Visual: the gallery is consistent and every final file survives full-resolution inspection.
- Transfer: a clean download matches the approved source manifest.
The best QA pipeline is not the most complicated one. It is the one the team can run on every property without skipping steps.
Top comments (0)