The matchCase trap that ruins your template
Presentation.replaceAllText(searchText, replacement) accepts an optional third argument, matchCase. It defaults to false. That sounds harmless until you have both {{name}} and {{full_name}} in the same deck: a case-insensitive search for {{name}} will match inside {{full_name}} first, leaving you with a garbled token like {{fullMaria}} on slide 3.
Passing true as the third argument locks the search to an exact byte-for-byte match. Combined with a consistent delimiter convention — double curly braces, lowercase, underscores for spaces — your tokens never collide with real slide copy. The first time I hit the garbled-token bug it was in a 40-slide sales deck sent to a live prospect; the fix is one boolean.
Choose your delimiter once and enforce it in the template. {{first_name}} is unambiguous; name or FIRST_NAME without delimiters will eventually match something in a headline and you will not catch it until after the send.