# Deployment mode tag definition

**URL:** <https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125>\
**Category:** Ignition\
**Created:** [February 23, 2026, 2:35pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125 "2026-02-23T14:35:25Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [February 23, 2026, 2:35pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/1 "2026-02-23T14:35:25Z")

</div>

Hello, is it possible to create deployment mode override for tag definitions?

I have the mode=prod active. I have tag provider plc\_data. In other modes, the plc’s aren’t connected, so I want to change the paths to the prod’s OPC connection.

at [http://localhost:8088/app/services/tags](http://localhost:8088/app/services/tags) I created the prod override, but that only created config/resources/prod/ignition/tag-provider/plc\_data directory structure. I would expect that the config/resources/prod/ignition/tag-definition/plc\_data will be also created from the config/resources/core/ignition/tag-definition/plc\_data structure.

Is there a way to do this? Can I just copy the directory? Is it safe?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 23, 2026, 4:21pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/2 "2026-02-23T16:21:24Z")

</div>

Deployment modes are an _overlay_ on the base resource configuration defined in (generally) the 'core' resource collection:

> [@Deployment modes override and rename to override with another type?](https://forum.inductiveautomation.com/t/deployment-modes-override-and-rename-to-override-with-another-type/111339/3):
>
> Deployment modes can change anything (though it's not necessarily recommended). If it helps, think of it as a single project inheritance tree. If you're in the dev mode, you're consuming external -\> system -\> core, then whatever dev defines, and then potentially overridden by anything local: Tree External External System System External-\>System Core Core System-\>Core Dev Dev Core-\>Dev Test Test Core-\>Test Prod Prod Core-\>Prod Local Local …

You can copy resources from core to a deployment mode at any time, you'll just have to re-scan your config directory afterwards if you do it while the gateway is running.

But conceptually it's important to only copy the specific paths/resources you actually want to override in the deployment mode, not absolutely everything, or you're giving up most of the benefit of the inheritance cascade.

---

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [February 25, 2026, 10:44am UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/3 "2026-02-25T10:44:41Z")

</div>

_OK, I needed to do stop and start the gateway. Now it works. I need to do more testing. I would like to update the prod GW during runtime._

Thanks for the reply. Unfortunately, I am missing something. I created a testing environment and started the GW in mode=crash.

I did:

```python
cp -r config/resources/core/ignition/tag-definition/plc_data/* \
config/resources/crash/ignition/tag-definition/plc_data/

```

I did GW Scan File system,

```python
git add config/resources/crash/*;

git commit -m “create crash plc_data copy”

```

Then I deleted tags via designer in plc\_data tag provider and I imported my modified tags.json.

I get:

```python
git status
...
...
modified: config/resources/core/ignition/tag-definition/plc_data/plc_data/PV03_26/Valves_PCSAuto/tags.json
...
...

```

I see the core tag-definitions were modified. I expected that the crash definitions are active and that they would be modified.

ignition81  
crash  
Ignition standard 8.3.3 (b2026012009)

---

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [February 25, 2026, 10:55am UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/4 "2026-02-25T10:55:19Z")

</div>

OK, I needed to do stop and start the gateway. Now it works. I need to do more testing. I would like to update the prod GW during runtime.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [February 25, 2026, 4:30pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/5 "2026-02-25T16:30:35Z")

</div>

> [@paul-griffith](#):
>
> you'll just have to re-scan your config directory afterwards

> **[Scanning the File System for Deployment Mode Changes​ - Gateway Deployment Modes...](https://www.docs.inductiveautomation.com/docs/8.3/platform/gateway/web-interface/platform/gateway-deployment-modes#scanning-the-file-system-for-deployment-mode-changes)**
>
> 💡Have feedback for this page? Let us know on the IA Forum. | Gateway Deployment Modes allow you to configure different running environments for your Gateway. This can be useful in cases where you want to use your Gateway in different capacities, such...

---

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [February 26, 2026, 11:55am UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/6 "2026-02-26T11:55:12Z")

</div>

Thanks. It looks like a problem with the Designer. I created copy of tag definition from core to prod:

```python
2003@ignition-prod:/work(main)$ cat ignition.conf | grep mode=
wrapper.java.additional.7=-Dignition.config.mode=prod

2003@ignition-prod:/work(main)$ ll config/resources/core/ignition/tag-definition/plc_data
total 4K
drwxrwxrwx 1 2003 2003 318 Sep 29 12:20 lab
drwxrwxrwx 1 2003 2003 408 Oct 28 11:37 plc_data
-rw-r--r-- 1 2003 2003 135 Feb 26 11:43 unary-resource.json
2003@ignition-prod:/work(main)$ ll config/resources/prod//ignition/tag-definition/plc_data
total 4K
drwxr-xr-x 1 2003 2003 318 Feb 26 11:38 lab
drwxr-xr-x 1 2003 2003 408 Feb 26 11:38 plc_data
-rw-r--r-- 1 2003 2003 135 Feb 26 11:38 unary-resource.json

git add .
git ci -m "cp plc tag def core to prod"

```

I did scan Filesytem, both for gateway and projects. I did it two times. I opened designer and created New Tag in plc\_data root. The file was created config/resources/core/ignition/tag-definition/plc\_data/tags.json. Which is wrong I think.

OK, I closed the Designer. Then I did:

```python
2003@ignition-prod:/work(main)$ git st
On branch main
Your branch is ahead of 'origin/main' by 1 commit.

        modified: config/resources/core/ignition/tag-definition/plc_data/unary-resource.json
        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/props.json
        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/resource.json

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        config/resources/core/ignition/tag-definition/plc_data/tags.json

git checkout . #reverts ...plc_data/unary-resource.json and session-props
rm config/resources/core/ignition/tag-definition/plc_data/tags.json

```

I did scan Filesytem, both for gateway and projects. I did it two times. I opened designer and I still see the New Tag in the plc\_data root.

I did rename the New Tag to New Tag Edit. I did git status and I see:

```python
git st
On branch main
Your branch is ahead of 'origin/main' by 1 commit.

        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/props.json
        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/resource.json

```

I bit expected the tags.json would be created again, but it seems its just in some buffer memory.

LATER:  
My patience went off. I did restart the production GW. I opened the Designer and the New Tag is gone! I created tag Tag Later in the root of plc\_data. And it works! The Filesystem Scan is broken in relation to the Designer. Somehow.

```python
2003@ignition-prod:/work(main)$ git st
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified: config/resources/prod/ignition/tag-definition/plc_data/unary-resource.json
        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/props.json
        modified: projects/minifactory/com.inductiveautomation.perspective/session-props/resource.json

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        config/resources/prod/ignition/tag-definition/plc_data/tags.json

no changes added to commit (use "git add" and/or "git commit -a")

2003@ignition-prod:/work(main)$ cat config/resources/prod/ignition/tag-definition/plc_data/tags.json
[
  {
    "valueSource": "memory",
    "name": "Tag Later",
    "tagType": "AtomicTag"
  }

```

---

<div class="post-metadata">

**Author:** ![dmcwilliam](https://avatars.discourse-cdn.com/v4/letter/d/e480ec/32.png) [@dmcwilliam](https://forum.inductiveautomation.com/u/dmcwilliam)\
**Post date:** [March 10, 2026, 11:59am UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/7 "2026-03-10T11:59:38Z")

</div>

To expand on this topic slightly we are looking to do something similar and have different tags for our production and dev environments. Basically we would have the tags configured as memory tags in the dev environment and as OPC tags in the production environment, seeing as we don’t have the field equipment connected for dev.

Is there a way to import tag definitions for each deployment mode through the tag importer on the designer or does this have to be manually overridden using the json files? It seems whenever I do an import there it always imports to core regardless of the mode that the gateway is started in.

---

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [March 18, 2026, 4:59pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/8 "2026-03-18T16:59:42Z")

</div>

> [@dmcwilliam](#):
>
> To expand on this topic slightly we are looking to do something similar and have different tags for our production and dev environments.

you have to create the mode override first. for tag definitions this means cp -r the tag dir as stated above. then restart the gw.

I use export tags to json, then modify with a python script and then import back.

---

<div class="post-metadata">

**Author:** ![amarks](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/amarks/32/45610_2.png) [@amarks](https://forum.inductiveautomation.com/u/amarks)\
**Post date:** [March 18, 2026, 5:13pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/9 "2026-03-18T17:13:43Z")

</div>

An easy way that I hand this is by just swapping the device names in the background.

For instance, you have 2 devices created - an OPC `Device_PRO` and a "simulated" `Device_DEV`.

When in "dev mode", change the `Device_DEV` device name to `Device` and leave `Device_PRO` alone. When in "production mode", change the `Device` back to `Device_DEV` and change `Device_PRO` to `Device`. Of course, this relies on the underlying OPC path and "simulated" path being the same - I would suggest using @pturmel 's IP module for your simulated OPC devices.

I've not used a mode override before and it's a little over my head at the moment, but it definitely sounds like a cool solution.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [March 18, 2026, 7:08pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/10 "2026-03-18T19:08:18Z")

</div>

With deployment modes, you could have a single "device" (addressed by name) and swap the underlying configuration to point to the real device/the simulator based on your environment. So you wouldn't need configuration in all your tags, it would just be an aspect of the gateway's configuration that changes.

---

<div class="post-metadata">

**Author:** ![hulla](https://avatars.discourse-cdn.com/v4/letter/h/49beb7/32.png) [@hulla](https://forum.inductiveautomation.com/u/hulla)\
**Post date:** [March 25, 2026, 1:50pm UTC](https://forum.inductiveautomation.com/t/deployment-mode-tag-definition/114125/11 "2026-03-25T13:50:56Z")

</div>

We found a flaw to the copy method. We created a tag group hw\_data with some dirs, like plc1, plc2. Then copy from config/resources/core/ignition/tag-definition/hw\_data to config/resources/prod/ignition/tag-definition/hw\_data. Then restart the prod gateway.

After the restart I reopen the designer. When I modify tags, the tags in the prod get changed. But when I create new directory, it is created in the core structure. What is even worse, when I delete a directory it is deleted in the prod and when I recreate it, it is created in the core. Now, we are doing this a lot, because the development on the PLC side is quite dynamic.

My goal is to have all device data in one tag group. In other deployment modes I have to run a script to redirect the tags to the prod server OPC server (read only). This is not optimal, but it worked, except the issue above.

Another idea is to redirect the device OPC clients to elsewhere? But I have no simulator, I am happy with the live data. The flaw above makes the solution very ineffective.

How to solve this? What are my options?

My other idea was to have all device tags in a group. Then access all these tags through the OPC loopback client. Then in other deployment modes redirect the loopback OPC client to prod OPC server. But my colleague argues that thats very slow, as there in extra communication level on the way. We have thousands of device tags.
