A scraper that works on your machine and an actor that survives in production are two different things. I found this out the hard way shipping ten of them on the Apify Store. Here's what actually breaks, and what fixes it.

Pinned dependencies, or the build silently breaks

Crawlee and Apify's SDK move fast enough that an unpinned apify or pydantic version can break the import at build time, with an error message that points nowhere useful. The fix is boring: pin everything (apify==2.7.3, pydantic==2.10.6, browserforge==1.2.3, httpx==0.27.0), and build on Python 3.11, not whatever your local machine runs. I lost an afternoon to this before pinning became a habit.

The default key-value store does not persist

If your actor needs to remember anything between runs, deduplicated items, a rolling window for trend detection, whatever, the default KV store gets wiped every run. You need Actor.open_key_value_store(name="something-persistent") explicitly. Easy to miss once, annoying to debug when your "new item" detector fires on the same item every single run.