Extracting an email from a Webflow form notification in Power Automate (and cleaning up the extra line breaks)

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 first attempt (and why it failed)
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.
The working approach: Split + Trim (no regex needed)
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
✅ Best “clear text” expression to copy
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')))
Why you were getting extra junk after the email
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.
Removing the extra line breaks at the end (<br><br>)
Since your raw output was:
test@test.com<br><br>
There are two good cleanup options.
Option A (recommended): stop at the first <br> (already solved)
This prevents the breaks from ever being included:
trim(first(split(last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '<br>')))
Option B: replace <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.)
Final result
With the split/trim approach, the Compose output becomes:
test@test.com
No dashed lines. No “Number of submissions received”. No <br><br>.
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 first attempt (and why it failed)
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.
The working approach: Split + Trim (no regex needed)
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
✅ Best “clear text” expression to copy
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')))
Why you were getting extra junk after the email
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.
Removing the extra line breaks at the end (<br><br>)
Since your raw output was:
test@test.com<br><br>
There are two good cleanup options.
Option A (recommended): stop at the first <br> (already solved)
This prevents the breaks from ever being included:
trim(first(split(last(split(triggerOutputs()?['body/body'], 'Subscriber Email:')), '<br>')))
Option B: replace <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.)
Final result
With the split/trim approach, the Compose output becomes:
test@test.com
No dashed lines. No “Number of submissions received”. No <br><br>.
Related Blog Posts

Microsoft Power Automate vs. Make (Integromat): A User Experience Comparison from Beginner to Pro

Microsoft Power Platform vs. Google AppSheet & Looker Studio: The Ultimate Low-Code Comparison (2025)


.jpg)