Automating ShotGrid Version Approval Notifications with the Event Daemon
Use ShotGrid's Event Daemon to push instant approval emails to artists the moment a version status flips to Approved — cutting manual check-ins and keeping downstream tasks moving.
18 Sept 2026, 08:54 UTC

The problem: artists wait, pipelines stall
In a typical ShotGrid workflow, a supervisor changes a version's status to Approved and the artist only finds out at the next daily review meeting or by manually refreshing the page. That lag can be hours — enough to delay downstream tasks like comp, lighting, or client delivery. The fix isn't a new tool; it's wiring ShotGrid's built-in Event Daemon to push an instant notification the moment the status flips.
Why the Event Daemon fits
The Event Daemon runs on the ShotGrid server (or your self-hosted instance) and executes registered Python callbacks when specific entity events fire. It has direct access to the database, so there's no polling overhead. For version approvals, you only need to listen for Shotgun_Version_Change events where sg_status_list becomes apr (or your site's custom approval code). The callback runs in the same transaction context, so latency stays under two seconds on ShotGrid Cloud.
Worked example: a minimal notification script
Save this as version_approved_notify.py in your Event Daemon plugins directory (e.g., /opt/shotgun/event_daemon/plugins/ on Linux). The daemon must have read access to the file and execute permission.
import os
import smtplib
from email.mime.text import MIMEText
from shotgun_api3 import Shotgun
# ShotGrid connection — uses the daemon's built-in credentials
sg = Shotgun(os.environ["SHOTGUN_URL"],
script_name="event_daemon",
api_key=os.environ["SHOTGUN_API_KEY"])
def registerCallbacks(reg):
reg.registerCallback(
script_name="version_approved_notify",
script_version=1,
event_type="Shotgun_Version_Change",
event_filter={"sg_status_list": ["apr"]}, # adjust if your status code differs
callback=notify_artist
)
def notify_artist(sg, logger, event, args):
version_id = event["entity"]["id"]
version = sg.find_one("Version", [["id", "is", version_id]],
["code", "sg_status_list", "user", "project"])
if not version or version["sg_status_list"] != "apr":
return
artist = version.get("user")
if not artist or not artist.get("email"):
logger.warning(f"Version {version_id} has no assigned artist with email")
return
# Build a direct link to the version in ShotGrid
url = f"{os.environ['SHOTGUN_URL']}/detail/Version/{version_id}"
subject = f"Version approved: {version['code']}"
body = f"Hi {artist['name']},
Your version {version['code']} has been approved.
Open it here: {url}
— ShotGrid Automation"
msg = MIMEText(body, "html")
msg["Subject"] = subject
msg["From"] = os.environ.get("NOTIFY_FROM", "[contact removed]")
msg["To"] = artist["email"]
try:
with smtplib.SMTP(os.environ.get("SMTP_HOST", "localhost"),
int(os.environ.get("SMTP_PORT", 25))) as s:
s.send_message(msg)
logger.info(f"Sent approval email for version {version_id} to {artist['email']}")
except Exception as e:
logger.error(f"Failed to send email: {e}")
Key points in the script:
- Uses the daemon's environment variables for credentials — no hard‑coded secrets.
- Filters on
sg_status_list": ["apr"]; replaceaprwith your site's exact status code (checkAdmin > Status List). - Queries only the fields needed (
code,user,project) to keep the API call light. - Sends via SMTP; you can swap in ShotGrid's
sg.send_mail()if you prefer the built‑in service.
Trade‑offs and gotchas
| Factor | Impact |
|---|---|
| Administrative access | Installing plugins requires root or sudo on the daemon host; not possible on ShotGrid Cloud without a support ticket. |
| Custom status lists | If your pipeline uses Client Approved or Supervisor Approved as separate steps, extend the event_filter or add a second callback. |
| Email deliverability | SMTP from the daemon host may hit spam filters; configure SPF/DKIM or route through a relay. |
| Event storms | A bulk status change (e.g., 200 versions via CSV import) fires 200 callbacks. Add a rate‑limit or batch digest if that's a concern. |
Verify it works
- Restart the Event Daemon:
sudo systemctl restart shotgun-event-daemon(or your init equivalent). - In ShotGrid, create a test version assigned to your own user.
- Change its status to
Approved. - Open
Admin > Event Daemon > Logsand filter by script nameversion_approved_notify. You should see anINFOline confirming the email send. - Check your inbox for the notification with the direct version link.
If the log shows an error, the traceback will point to the exact line — usually a missing environment variable or SMTP auth failure.
Next step
Add a second callback for sg_status_list" changing to "ret" (Retake) so artists also get instant feedback when work needs revision. The same pattern scales to any entity — publishes, notes, or custom review rounds — keeping the whole crew in sync without extra meetings.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.