Step 2: Creating a Zapier Zap to Catch the Webhook
- Trigger: "Webhooks by Zapier"
- Event: "Catch Hook"
- This step listens for incoming data from Plex.
Step 3: Using TMDb to Get Movie Posters
Plex sends basic movie details, but I wanted to add a high-quality movie poster to my post. I already have an API key from The Movie Database that I've used for years in a Siri Shortcut. I had Chat GPT write me some Javascript that uses that API to search for the movie I'm watching and pull the poster image from The Movie Database API.
API Request URL
https://api.themoviedb.org/3/movie/?api_key=YOUR_TMDB_API_KEY
Returned Data
title: The movie’s name
release_date: Release year
poster_path: URL for the movie poster
Step 4: Setting up a filter in Zapier for Plex media.play events
One major problem I encountered was that Plex fires multiple webhook events whenever I pause, resume, or stop a movie. This caused my Zap to post repeatedly for the same movie, which I didn’t want. This took me a couple days to figure out. I kept trying to figure out how to solve the problem from my current vantage point.
A good night's sleep proved to be the cure. I realized I never looked for a media.play payload. Once I found that, the end came into focus.
The solution? A simple Zapier Filter step.
Add a "Filter by Zapier" Step. I set up a filter to check the Payload Event value from Plex.
Set the Condition: Payload Event (Text) Exactly Matches "media.play"
Why This Works
Plex sends webhooks for media.play, media.pause, media.resume, and media.stop.
By filtering only for "media.play", I ensured that my Zap only triggers once per movie session, when playback first starts.
Now, pausing and resuming doesn’t create duplicate posts—only the initial play event is processed.
With this fix, I no longer needed complex timestamp logic or storage-based tracking. A simple filter was all it took.
Step 5: Formatting the Final Post
To keep my posts consistent and engaging, I used Formatter by Zapier. Text Formatting Step:
- 🎥 {{Payload Metadata Title}}
- 🏷️ {{Payload Metadata Tagline}}
- 🎬 {{Payload Metadata Director Tag}}
- 📝 {{Payload Metadata Writer Tag}}
- 📆 {{Payload Metadata Year}}
Hashtag Storage:
I created a Storage by Zapier key for custom hashtags. This lets me update them anytime without editing the Zap. As of the time of this post, there's a small issue with how the hashtags appear on BlueSky, but I'm optimistic I can work through that small issue.
Step 6: Posting to Bluesky & Threads
Finally, I connected Bluesky & Threads as action steps in Zapier. Each post:
- Includes the movie title, year release, director, writer and the tagline of the film.
- Attaches a TMDb movie poster
- Adds dynamic hashtags
- Only posts ONCE per viewing session
The Final Result
Now, every time I start a movie on Plex, my Zap automatically posts a formatted update to Bluesky and Threads—without me having to do anything.
I don’t have to remember to post, I don’t have to type anything manually, and I’ve created a simple automation that works in the background.
What I Learned From This Project
- Webhooks Aren’t as Scary as They Seem
- Once I figured out how they work, they became an amazing automation tool.
- Zapier Can Do Way More Than I Expected
- Between Filters, Formatter, and Storage, I didn’t need any actual code.
- Sometimes the Best Solution Is the Simplest One
- I went through multiple failed approaches before realizing Plex Webhooks already had what I needed.
Final Thoughts
This was a fun project that started with a random idea and turned into a fully automated system.
Now, I can focus on watching movies while my Zap takes care of the rest. No code, no problem!
Have you automated anything cool with Plex or Zapier? Let me know in the comments!
Troubleshooting and Advanced Tips
How to prevent duplicate social media posts from Plex webhooks:
One of the most common issues users encounter is duplicate posts due to Plex sending multiple webhook events. To prevent this, use Zapier's 'Filter by Zapier' step. Set the filter condition to 'Payload Event (Text) Exactly Matches "media.play"'. This ensures that the Zap only triggers when a movie first starts playing, preventing duplicate posts from pause, resume, or stop events.
Troubleshooting Plex webhook not triggering Zapier:
If your Plex webhook isn't triggering your Zap, first, double-check that you've correctly copied the Zapier Webhook URL into your Plex settings. Then, test the connection by playing a movie on Plex. If the Zapier trigger still doesn't activate, verify that your Plex server has internet access and that there are no firewall restrictions blocking the webhook requests.
How to get movie posters from TMDb API using Zapier without code:
To get movie posters, utilize Zapier's 'Webhooks by Zapier' to make an API call to TMDb. In the action step, configure the API request URL using the movie title from the Plex webhook data. Then, parse the API response to extract the 'poster_path' URL. Finally, use this URL to attach the movie poster to your social media posts.
Setting up a filter in Zapier for Plex media.play events:
Within your Zap, add a 'Filter by Zapier' step after the 'Webhooks by Zapier' trigger. In the filter setup, select the 'Payload Event' field from the Plex webhook data. Set the condition to 'Text Exactly Matches' and enter 'media.play'. This will ensure that only events with the 'media.play' payload are processed by the Zap.
Using Storage by Zapier for dynamic hashtags in social media automation:
To use dynamic hashtags, create a 'Storage by Zapier' key to store your hashtag list. In your Zap, use the 'Storage by Zapier' action to retrieve the hashtags. Then, use Zapier's 'Formatter by Zapier' to format the hashtags for your social media posts. This allows you to update your hashtags without editing the Zap itself.