# Template settings - removing the tag() expressions

**URL:** <https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088>\
**Category:** Ignition\
**Tags:** ignition81, vision\
**Created:** [September 15, 2026, 10:22pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088 "2026-09-15T22:22:39Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![tgish](https://avatars.discourse-cdn.com/v4/letter/t/34f0e0/32.png) [@tgish](https://forum.inductiveautomation.com/u/tgish)\
**Post date:** [September 15, 2026, 10:22pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/1 "2026-09-15T22:22:39Z")

</div>

Hello

Long story short, our windows are slow to the point of unresponsiveness. Based on previous posts, we suspect one culprit might be the use of the tag() expression in our templates.

I think I've worked a way around it by using a lot of internal properties to replace the tag() expressions, but I want to be sure I won't be making things worse before we go through and redo everything 😢

The issue is that we created templates to be flexible enough to handle UDTs that may or may not contain all the items we want to display. So the template has multiple custom parameters for the tagpath for various inputs, and if the tagpath is blank, the template ignores by using the isgood(tag({tagpath})) logic. The only way I managed to get around that when converting to internal properties is the set the "Overlay Opt-out" checkbox on the internal properties that have indirect tags. Since sometimes the parameter is blank so the indirect tag property is in error status with no way to check isgood() since we can't use the expression within an indirect tag assignment.

**Will having these errors existing but hidden, just cause new problems?**

Also is there a better way than creating like 40 internal properties separately on all our templates? Could we abstract those properties to a shared dataset or something? But again, there will be a lot of properties that don't exist or don't apply to every template so I'm worried we are just moving the problem.

I was so disappointed to learn about the tag() function issues. It is super frustrating that IA provides something that makes complicated tasks easier and even teaches you how to use it without warning about the side effects. We were so proud of our smart templates that could accept all manner of tags.

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [September 15, 2026, 11:46pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/2 "2026-09-15T23:46:42Z")

</div>

You're going about it correctly. The tag() expression is fine to use in expression tags but has the severe performance impact you're seeing when used in expression bindings. It gets even worse once you get a lot of templates on the screen to the point where it's almost unusable. I've had to go behind other integrators myself to redo their templates because the end user was having performance problems. One was so bad that they were unable to launch the client from a remote location and only clients on the local network would work.

---

<div class="post-metadata">

**Author:** ![justinedwards.jle](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/justinedwards.jle/32/37854_2.png) [@justinedwards.jle](https://forum.inductiveautomation.com/u/justinedwards.jle)\
**Post date:** [September 16, 2026, 4:37am UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/3 "2026-09-16T04:37:00Z")

</div>

If you haven't already, consider installing the [Tag Expression Blocker](https://inductiveautomation.com/exchange/2969/installation) resource from the Ignition Exchange. It removes the tag() option from the advanced functions popup and will block future developers from adding anymore tag expressions to the project while directing them toward proper indirect bindings.

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/0/9/09148dd74c5442f779b24bc12042ebbe42e4cee0.png)  
 ![Tag Expression Blocker DEMO](https://us1.discourse-cdn.com/inductiveautomation/original/3X/f/d/fd8181a67a9b0fd317df83f5c42807f72c7dde5f.gif)  
 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/e/4eec5986f6eb96195a7195b71cadd456e8286576.jpeg)

---

<div class="post-metadata">

**Author:** ![tgish](https://avatars.discourse-cdn.com/v4/letter/t/34f0e0/32.png) [@tgish](https://forum.inductiveautomation.com/u/tgish)\
**Post date:** [September 16, 2026, 3:38pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/4 "2026-09-16T15:38:49Z")

</div>

Ok, so it's normal for template to have a huge number of internal properties? Is it still safe to use the isgood() function on the internal property to check if it exists? If that is ok then I wouldn't have to have a separate property that is checking the .Enabled bit of each tag that I want to read, I could just do an isgood() on the property that is indirecting to the actual value.

---

<div class="post-metadata">

**Author:** ![michael.flagler](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/michael.flagler/32/26272_2.png) [@michael.flagler](https://forum.inductiveautomation.com/u/michael.flagler)\
**Post date:** [September 16, 2026, 4:39pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/5 "2026-09-16T16:39:24Z")

</div>

I typically make individual templates for the different types, but I'd think you could do it this way if you want. I don't know how much overhead it takes to have bindings to tags that don't exist. (Do the tags exist and just aren't enabled, or do they simply not exist?) Client will still be trying to read them and at scale, this would create a lot of excessive bindings that aren't necessary.

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [September 16, 2026, 6:25pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/6 "2026-09-16T18:25:51Z")

</div>

You might check out the [Ignition Extensions](https://forum.inductiveautomation.com/t/ignition-extensions-convenience-utilities-for-advanced-users/64615) module which has an `isAvailable()` expression that checks that a tag path is both found and enabled.

> [@tgish](#):
>
> template to have a huge number of internal properties

I would say this is fairly normal, though there could be an argument that you might want to refactor the template into more less generic templates.

For instance, while it is possible to have a template that handles both a motor with a starter and a motor with VFD, I would create two separte templates. ( A bit of a contrived example, but not invalid.)

From a performance perspective, you really don't want to be wasting a lot of processing on properties that are not going to be used. In some situations it probably isn't going to be that impactiful, but in others it might be very impactful. There is a balancing act there between performance impact and development/maintenance time/work. Personally, I try to minimize the number of properties which are being processed needlessly.

---

<div class="post-metadata">

**Author:** ![tgish](https://avatars.discourse-cdn.com/v4/letter/t/34f0e0/32.png) [@tgish](https://forum.inductiveautomation.com/u/tgish)\
**Post date:** [September 16, 2026, 6:47pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/7 "2026-09-16T18:47:46Z")

</div>

Yes, we've had this "balancing act" conversation so much. We have a lot of different equipment. So yes, we have a separate UDT and template for fixed pumps versus VFDs, but some have faults, some don't, some have two commands, some have one command, some have "available" tags, some don't, some have leak detection, some don't. So if we have to make a new UDT and template for every combination of those, I'm honestly not sure a template would even be useful, we might not even have more than 2 pumps that are exactly the same. We thought we had landed on a good solution - where the tag() expression let us handle all these different cases. ☹

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [September 16, 2026, 8:23pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/8 "2026-09-16T20:23:33Z")

</div>

I haven't read your whole post yet (nor this thread... No time atm), but have you got any calls to system.alarm.queryStatus in your ui anywhere? These will absolutely destroy your edt and hence your ui responsiveness. Look for any other scripts calling functions that wait for a gateway response as well. I have my doubts that `tag` is the culprit. I replaced a huge number of tag expression functions on a page to test this year's ago and found no perceived increase to _user_ experience. (From a system perspective it's still a good idea not to use the however outside of expression tag expressions)

---

<div class="post-metadata">

**Author:** ![tgish](https://avatars.discourse-cdn.com/v4/letter/t/34f0e0/32.png) [@tgish](https://forum.inductiveautomation.com/u/tgish)\
**Post date:** [September 17, 2026, 7:04pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/9 "2026-09-17T19:04:17Z")

</div>

we have a few - just three readbacks to show the total number of alarms on a banner. We'll remove those and see if it helps.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 17, 2026, 7:10pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/10 "2026-09-17T19:10:31Z")

</div>

> [@nminchin](#):
>
> I replaced a huge number of tag expression functions on a page to test this year's ago and found no perceived increase to _user_ experience.

The worst impact of `tag()` is on window/template **startup** , with its pathological timeouts per function in the EDT. Once running, it isn't much worse than an indirect tag binding.

---

<div class="post-metadata">

**Author:** ![Ervin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ervin/32/57644_2.png) [@Ervin](https://forum.inductiveautomation.com/u/Ervin)\
**Post date:** [September 22, 2026, 11:25am UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/11 "2026-09-22T11:25:09Z")

</div>

I did not read all replies to this post yet, but I have a large project with 800+ OPC-UA connections for a very high variety of objects where none of them are identical.  
I use a lot of UDT's for building each object from individual components and each sub-component type has a generic UDT (sometimes two-three) and based on what elements that UDT has or has not, or has enabled or not, my views build themself up accordingly.  
I use a way without using any tag() expressions.  
To detect if a tag is or isn't present, I use indirect binding to the tag's ".Enabled" property and I have a transform expression on it like

> coalesce({value},false)

I have this bonded to the position.display of each individual element that can be (or not) present to a specific component (like a pump).  
based on this property, I then enable and do other stuff like activating the proper embedded view by

> if({this.position.display},"PathToView",None)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [September 23, 2026, 2:09pm UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/12 "2026-09-23T14:09:01Z")

</div>

> [@Ervin](#):
>
> my **views** build themself

{My Bold}

This is a Vision topic. Vision doesn't have views.

---

<div class="post-metadata">

**Author:** ![Ervin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ervin/32/57644_2.png) [@Ervin](https://forum.inductiveautomation.com/u/Ervin)\
**Post date:** [September 24, 2026, 4:52am UTC](https://forum.inductiveautomation.com/t/template-settings-removing-the-tag-expressions/117088/13 "2026-09-24T04:52:53Z")

</div>

Sorry, my mistake. i finally read the whole post, but even then I did not notice the vision at the top. Sorry again.  
Please delete my post if necessary.
