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



