You write the content. The machine sharpens the SEO, generates a real gym image, uploads it to img.fit901.com, and preps everything for GHL import — automatically.
You set Status = Ready. The machine picks it up within 5 minutes, processes it, and updates the row. When done, you get a notification on ntfy.
Open the Content Input sheet and add a row in the Content Input tab.
| Column | Who Fills It | What to Put |
|---|---|---|
| Row ID | You | Any unique ID — e.g. B001, S001, IG001 |
| Topic Title | You | Your working title. Machine will sharpen it. |
| Content Type | You | Blog, Facebook, Instagram-Square, Instagram-Portrait, Reel, All-In-One |
| Article Body | You | For Blog — paste the full article HTML from Claude/ChatGPT/Gemini |
| Facebook Post | You | For Facebook content type — paste the post text |
| Instagram Post | You | For Instagram — paste the caption |
| Reel Script | You | For Reel — paste the script/caption |
| Notes | You | Optional. Extra context for the image — e.g. "female athlete, morning light" |
| Status | You | Set to Ready when you're done writing |
| SEO Title | Machine | Auto-filled. Max 60 chars, keyword-optimized. |
| Meta Description | Machine | Auto-filled. Max 155 chars. |
| Slug | Machine | Auto-filled. URL slug. |
| Image URL | Machine | Auto-filled. Public URL on img.fit901.com |
| Image Filename | Machine | Auto-filled. Descriptive filename. |
| Image Alt Text | Machine | Auto-filled. Accessibility alt text. |
| Type | Image Size | Uses |
|---|---|---|
| Blog | 1200×628 | Article Body column. Exports to GHL Blog Importer. |
| 1200×628 | Facebook Post column. Exports to GHL Social Scheduler. | |
| Instagram-Square | 1080×1080 | Instagram Post column. Exports to Social Scheduler. |
| Instagram-Portrait | 1080×1350 | Instagram Post column. Taller image for feed. |
| Reel | 1080×1920 | Reel Script column. Vertical cover image. |
| All-In-One | 1200×628 | Fill any combination of Article Body, Facebook Post, Instagram Post. → Exports to Blog Export if Article Body is filled. → Exports to Social Export if Facebook Post or Instagram Post is filled. One row can export to both. |
The machine checks the sheet every 5 minutes. When it sees a row with Status = Ready, it:
Calls Gemini Flash with your title and article body. Returns an SEO-optimized title (max 60 chars), meta description (max 155 chars), and URL slug. Writes them to the sheet.
First, Gemini writes a detailed visual prompt describing exactly what should be in the image — real people, real gym environment, specific actions. Then FAL.ai (Flux Schnell model) generates the image at the right dimensions for your content type.
Image filename format:
Example: fit901_woman-box-jumps-brick-gym_1200x628_2026-03-24.jpg
FTPs the image to the correct folder:
img.fit901.com/content-images/blog/img.fit901.com/content-images/social/Public URL pattern: https://img.fit901.com/content-images/blog/[filename].jpg
Updates the row with SEO Title, Meta Description, Slug, Image URL, Filename, Alt Text. Sets Status = Image Done. Logs the image to the Image Registry tab. Sends you a notification on ntfy.
When you have a batch of Image Done rows ready to push to GHL:
⚠️ Always clear the Blog Export and Social Export tabs after importing to GHL. The machine appends rows — it doesn't overwrite. If you don't clear, you'll get duplicates on the next run.
If you want to fire the machine immediately instead of waiting:
You can do this from a browser using a tool like Postman, or ask Claude to trigger it for you.
| Content Type | FTP Path | Public URL Base |
|---|---|---|
| Blog | /content-images/blog/ | https://img.fit901.com/content-images/blog/ |
| Facebook, Instagram, Reel, All-In-One (social) | /content-images/social/ | https://img.fit901.com/content-images/social/ |
Every blog post automatically gets this CTA added at the end if it's not already in the article body. Never use /intro or any other path.
| Problem | What to Check |
|---|---|
| Row stuck in "Processing" for more than 10 minutes | Open n8n → Executions → look for errors. Most likely: Gemini API issue or FAL.ai key not set. Clear the Processing Lock cell and set Status back to Ready. |
| Status shows "Error" | Check the row — there may be an "Error Notes" column. Common cause: article body was empty when submitted. |
| Image not appearing at img.fit901.com | Check FTP credentials in n8n. Go to n8n → Credentials → FTP - img.fit901.com. Also verify the workflow is active. |
| Machine not picking up rows | Make sure Status is exactly "Ready" (capital R, no spaces). Also make sure the Lean Image Machine workflow is Active in n8n. |
| FAL.ai image generation fails | FAL.ai API key may be wrong or depleted. Go to n8n → Credentials → FAL.ai - Fit 901 → update the key. |
✅ The Lean Image Machine is active and running. It checks for Ready rows every 5 minutes. FAL.ai key is set, FTP is connected, Google Sheet tabs are ready.