December 26, 2025 · 3 min read · Justin Trantham

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

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:

  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>.

‍

Next step

Have this problem in your business?

We build the systems described here. A short call is usually enough to tell whether it's worth building.

Book a call