Generating the pretty bit at the end of a URL
F# does have a String module, but it's almost empty. If you want to make string manipulations look more idiomatic, you'll have write functions that wrap System.String methods yourself (quick search didn't find anything existing):

let trim (input:string) =
    input.Trim()

let regexReplace (pattern:string) (replacement:string) (input:string) =
    Regex.Replace(input, pattern, replacement)

let replace (pattern:string) (replacement:string) (input:string) =
    input.Replace(pattern, replacement)

let toLower (input:string) =
    input.ToLower()

…

let parsed =
    x
    |&gt; trim
    |&gt; regexReplace "[^0-9a-zA-Z ]" ""
    |&gt; replace " " "-"
    |&gt; toLower




match String.length parsed with
    | m when m &gt; 30 -&gt; …
    | _ -&gt; parsed


You don't need to try to differentiate from C# so hard. if would be more appropriate here:

if String.length parsed &gt; 30 then …
else parsed




match parsed.IndexOf("-",30-1) with
    | p when p &lt; 0 -&gt; parsed
    | p -&gt; parsed.[..p]


You can rewrite this to avoid having to reference p in both branches:

match parsed.IndexOf("-",30-1) with
    | p when p &gt;= 0 -&gt; parsed.[..p]
    | _ -&gt; parsed


Also, use more descriptive names than p, like index or maybe pos.



Also, this code usually returns a string that's over 30 characters and ends with -. Is that what you intended?