Constrain the Problem, Not the Intelligence
Effective AI prompting requires constraining the problem, permissions, and success criteria, not the intelligence. Learn how to empower your AI agents.
Aug 1, 2026 · 4 min read
Read moreDecember 26, 2025 · 3 min read · Justin Trantham
Power Automate Webflow email parsing guide: learn how to extract a subscriber email address from a Webflow form notification using split + trim (no regex), fix the common "match() not defined" error, and remove trailing line breaks like <br><br> for clean output. Includes a step-by-step example and video walkthrough: https://www.youtube.com/watch?v=lUFiGgA7HqM

If you've ever wired Webflow form notifications into Power Automate, you've probably hit the same tiny-but-annoying problem I ran into: the email address is in the body of the message, not neatly provided as a structured field.
Here's what the incoming email looked like (simplified):
You just received a new form submission on your website flowdevs site. Subscriber Email: test@test.com
...(more Webflow boilerplate)...
The goal was straightforward:
Find the email address that appears after Subscriber Email:
Use that email in the flow
Make sure the result is clean (no trailing line breaks like <br><br>)
If you want to follow along visually, here's our walkthrough video: https://www.youtube.com/watch?v=lUFiGgA7HqM
The initial idea was to use a regex "match" style expression:
@{first(match( last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}'))}
But Power Automate responded with:
The template function 'match' is not defined or not valid.
That's the key lesson: Power Automate expressions do not include a match() function (even though it feels like they should).
So we needed a different approach using functions that do exist.
Since Webflow emails follow a predictable format, you can reliably do this:
Split on "Subscriber Email:"
Take the part after it
Split again on the next line break (or HTML break)
Trim whitespace
Use this in a Compose action (or wherever you need the extracted email):
trim(first(split(last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '<br>')))
This version assumes the body uses HTML breaks (<br>), which matches your raw output looking like:
"test@test.com<br><br>"
If your body is plain text with newline characters instead, use this version:
trim(first(split(last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '\n')))
You mentioned it "grabbed" something like:
test@test.com----------------------------------------------------------Number...
That happens when you split on Subscriber Email: but don't stop at the first break, so the expression keeps everything after the email too.
The fix is exactly what we did above: split again on the first break (<br> or \n) and take the first piece.
<br><br>)Since your raw output was:
test@test.com<br><br>
There are two good cleanup options.
<br> (already solved)This prevents the breaks from ever being included:
trim(first(split(last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '<br>')))
<br> with nothing (if you already extracted the string)If you already have "test@test.com<br><br>" in a variable/compose output, clean it like:
trim(replace(outputs('Compose_EmailRaw'), '<br>', ''))
(Replace Compose_EmailRaw with the name of your step.)
With the split/trim approach, the Compose output becomes:
test@test.com
No dashed lines. No "Number of submissions received". No <br><br>.
Effective AI prompting requires constraining the problem, permissions, and success criteria, not the intelligence. Learn how to empower your AI agents.
Aug 1, 2026 · 4 min read
Read moreStop copy-pasting standard code snippets. Learn how AI coding agents use system context to automate workflows, fix bugs, and build better software.
Jul 30, 2026 · 5 min read
Read moreA case study on why fixed UI is becoming less important and how runtime-rendered interfaces can revolutionize operational software and business workflows.
Jul 30, 2026 · 7 min read
Read moreWe build the systems described here. A short call is usually enough to tell whether it's worth building.