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

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
December 26, 2025
Microsoft Power Automate
Contributors

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:

  1. Find the email address that appears after Subscriber Email:
  2. Use that email in the flow
  3. 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:

  1. Split on "Subscriber Email:"
  2. Take the part after it
  3. Split again on the next line break (or HTML break)
  4. 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>.

Subscribe to newsletter
By subscribing you agree to with our Privacy Policy.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

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:

  1. Find the email address that appears after Subscriber Email:
  2. Use that email in the flow
  3. 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:

  1. Split on "Subscriber Email:"
  2. Take the part after it
  3. Split again on the next line break (or HTML break)
  4. 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>.

Subscribe to newsletter
By subscribing you agree to with our Privacy Policy.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
More

Related Blog Posts