Site name
Case Studies

The 'No-App' Workflow: How I Built a Construction Photo System with Power Automate

PMTheTechGuy
··3 min read
The 'No-App' Workflow: How I Built a Construction Photo System with Power Automate cover image

If there is one thing I've learned working with field teams, it's this: Resistance to new apps is high.

You can build the most beautiful React Native app in the world, but if a Superintendent has to log in, navigate three menus, and wait for an upload bar just to save a photo of a broken pipe, they won't do it. They will just text it to you.

And that's where the data dies.

For my recent project, SiteLog Automator, I decided to lean into that behavior rather than fight it. I built a system where the "Interface" is just the email app they already use.

The Architecture

The goal was simple: Field Team sends photo -> Photo appears in correct SharePoint folder.

Here is the high-level stack:

  • Input: Outlook (Email with attachments)
  • Logic: Power Automate (Cloud Flow)
  • Storage: SharePoint Online (Project Document Library)

Step 1: The Trigger

I set up a dedicated inbox (e.g., photos@company.com). The Power Automate trigger is "When a new email arrives (V3)".

I added a filter to only trigger if the email has attachments. This saves run history limits and filters out random "Test" emails.

Step 2: Parsing the Project ID

This was the tricky part. I needed a way to tell the bot which project folder to use without asking the user to type JSON.

The Solution: The Subject Line.

I trained the team to use a simple format: ProjectID - Description.

  • Example: 101 - Kitchen Framing

In Power Automate, I used the split() function to grab the first part of the subject line:

// Expression to get "101"
trim(first(split(triggerOutputs()?['body/subject'], '-')))

Step 3: Handling the Attachments

The flow loops through each attachment. But you can't just save the file with its original name (e.g., image(1).jpg) because the next email will overwrite it.

I implemented a Smart Renaming logic using the current timestamp and the sender's name:

// Filename Logic
concat(
  formatDateTime(utcNow(), 'yyyy-MM-dd_HH-mm'),
  '_',
  triggerOutputs()?['body/from/emailAddress/name'],
  '_',
  items('Apply_to_each')?['name']
)

This turns image.jpg into 2026-02-10_14-30_Paul_image.jpg. Searchable, sortable, and unique.

Step 4: Routing to SharePoint

Finally, the "Create File" action needs a dynamic path.

Since I parsed the Project ID (101) in Step 2, I can construct the folder path dynamically:

/Sites/Construction/Shared Documents/Projects/101/Site Photos/

If the folder 101 doesn't exist, SharePoint (usually) handles it gracefully or creates it depending on your API settings. In this production build, I added a "Check if Folder Exists" step to be safe.

The Result

The field team changed zero habits. They still pull out their phone, snap a picture, and hit send. But now, instead of that photo dying in a manager's inbox, it is instantly archived in the company's central server, accessible by the billing team, the project manager, and the client.

That is the power of "Invisible Automation."


Want to build this?

I have packaged the exact Setup Checklist and Flow Diagram for this system. You can get it for free in my Automation Vault.


Cover image credit: Microsoft Support - All about approval workflows

Tags

#Power Automate#SharePoint#Construction Tech#Workflow Automation
Newsletter

Stay updated with my latest projects

Get notified when I publish new tutorials, tools, and automation workflows. No spam, unsubscribe anytime.

Follow Me

Share This Post

You might also like