Skip to main content

Publishing Decision Logic

When you click Publish, Whathead analyzes each node and decides whether to CREATE a new entity, UPDATE an existing entity, or SKIP the entity entirely. Understanding this decision logic helps you predict publishing behavior and avoid unexpected results.
What you’ll learn:
  • How Whathead decides CREATE vs UPDATE vs SKIP
  • What existing IDs are and how they work
  • Canvas-origin nodes vs loaded entities
  • Change detection and SKIP behavior
  • Decision trees and matrices for all scenarios

The Core Decision

Whathead makes publishing decisions based on two factors:
  1. Does the node have an existing platform ID?
  2. Has the node been changed since it was loaded or last published?
This simple logic determines all publishing behavior across all scenarios.

Existing Platform IDs

Platform IDs are unique identifiers assigned by advertising platforms when entities are created.

Types of Platform IDs

Whathead tracks three types of platform IDs:
  • existingCampaignId: Unique ID for a campaign (e.g., camp_123456789)
  • existingAdSetId: Unique ID for an ad set/ad group/ad squad (e.g., adset_987654321)
  • existingAdId: Unique ID for an ad (e.g., ad_456789123)

When Nodes Get Platform IDs

Nodes receive platform IDs in two ways: 1. Loaded from Platform When you use Select Existing or Expand to load campaigns from your connected platforms, Whathead fetches the platform IDs and stores them on the nodes.
You click "Select Existing" → Choose Campaign A
Result: Node has existingCampaignId = "camp_123"
2. After First Publish When you publish a canvas-origin node (created with + Campaign), the platform assigns an ID. Whathead stores this ID on the node after successful publish.
First publish: Campaign node has no ID → Platform creates campaign → Returns ID
Result: Node now has existingCampaignId = "camp_456"
You can see platform IDs in the node details panel. Nodes without IDs show “No existing ID” or similar indicator.

When Platform IDs Are Cleared

Whathead clears platform IDs in specific scenarios: 1. Copy/Paste When you copy and paste nodes, platform IDs are cleared from the pasted nodes. This ensures pasted nodes create new entities rather than updating the originals.
Original node: existingCampaignId = "camp_123"
Pasted node: existingCampaignId = null (cleared)
2. Duplicate When you duplicate nodes, the duplicates have no platform IDs.
Original node: existingCampaignId = "camp_123"
Duplicated node: existingCampaignId = null (cleared)
3. Reconnect When you change a node’s parent connection, the platform ID is cleared. This is because platforms don’t support moving entities between parents—you must create a new entity under the new parent.
Ad under Ad Set A: existingAdId = "ad_789"
Reconnect ad to Ad Set B: existingAdId = null (cleared)
For complete details on reconnect behavior, scenarios, and managing duplicates, see Reconnect (Relink).

Canvas-Origin Nodes vs Loaded Entities

Understanding the difference between canvas-origin nodes and loaded entities is key to predicting publishing behavior.

Canvas-Origin Nodes

Canvas-origin nodes are created directly on the canvas using + Campaign, + Ad Set, or + Ad. Characteristics:
  • Have no platform ID initially
  • Always CREATE on first publish
  • Receive platform ID after first publish
  • Can UPDATE on subsequent publishes (if you edit them)
Publishing behavior:
First publish: CREATE (no ID)
Edit and republish: UPDATE (now has ID from first publish)
Republish without changes: SKIP (has ID, no changes)
After the first publish, canvas-origin nodes behave like loaded entities. They have platform IDs and can UPDATE or SKIP on subsequent publishes.

Loaded Entities

Loaded entities are fetched from platforms using Select Existing or Expand. Characteristics:
  • Have platform IDs from the start
  • Can UPDATE if you make changes
  • Can SKIP if you make no changes
  • Never CREATE (unless you clear the ID by pasting or reconnecting)
Publishing behavior:
Load from platform: Has ID
Edit and publish: UPDATE (has ID, has changes)
Publish without changes: SKIP (has ID, no changes)

Comparison Table

AspectCanvas-Origin NodeLoaded Entity
Initial IDNoneHas platform ID
First publishCREATEUPDATE or SKIP
After first publishHas ID (behaves like loaded)Still has ID
Edit and republishUPDATE (after first publish)UPDATE
Republish unchangedSKIP (after first publish)SKIP
Copy/pasteCreates new node (no ID)Creates new node (ID cleared)

Change Detection

Whathead tracks changes to determine whether to UPDATE or SKIP entities that have platform IDs.

What Counts as a Change

Whathead detects changes to:
  • Campaign fields: Name, budget, schedule, status, objective settings
  • Ad set fields: Name, targeting, placements, schedule, budget, optimization settings
  • Ad fields: Name, copy text, headline, description, CTA, destination URL, creative assets

How Change Detection Works

1

Load or publish entity

When you load an entity or publish it for the first time, Whathead stores a snapshot of its current configuration.
2

Edit entity

When you edit fields in the node configuration, Whathead marks the node as changed.
3

Publish

When you publish, Whathead compares the current configuration to the stored snapshot. If they differ, the entity is marked for UPDATE.
4

After publish

After successful UPDATE, Whathead updates the stored snapshot to match the new configuration.

SKIP Behavior

Entities are skipped when:
  1. Has platform ID: The node has an existingCampaignId, existingAdSetId, or existingAdId
  2. No changes: The current configuration matches the stored snapshot
  3. Parent unchanged: The node’s parent connection hasn’t changed
Example:
Load Campaign A (budget: $100)
Don't change anything
Publish
Result: Campaign A SKIP (has ID, no changes)
Skipping unchanged entities is efficient. It reduces API calls, improves publish speed, and avoids unnecessary platform updates.

Forcing an Update

If you want to force an update even when nothing changed:
  1. Make a minor change (e.g., add a space to a field)
  2. Save the change
  3. Publish (entity will UPDATE)
  4. Optionally, revert the change and publish again
This is rarely needed but can be useful for troubleshooting or forcing a platform refresh.

Decision Matrix

This table shows CREATE vs UPDATE vs SKIP decisions for all common scenarios:
ScenarioHas ID?Has Changes?ActionReason
New canvas node, first publishNoN/ACREATENo ID means create new
Canvas node, republish unchangedYesNoSKIPHas ID, no changes
Canvas node, edit and republishYesYesUPDATEHas ID, has changes
Loaded entity, no changesYesNoSKIPHas ID, no changes
Loaded entity, with changesYesYesUPDATEHas ID, has changes
Pasted nodeNoN/ACREATEID cleared on paste
Duplicated nodeNoN/ACREATEDuplicate has no ID
Reconnected nodeNoN/ACREATEID cleared on reconnect
Failed entity, retryNoN/ACREATENever received ID
Successful entity, retryYesNoSKIPAlready published, no changes

Decision Trees

Campaign Publishing Decision Tree

Copy/Paste Decision Tree

Reconnect Decision Tree

See Reconnect (Relink) for detailed reconnect behavior, scenarios, and decision trees.

Practical Examples

Example 1: Building and Publishing New Campaign

Scenario: You build a new campaign from scratch and publish it. Steps:
  1. Click + Campaign → Configure campaign (no ID)
  2. Click + Ad Set → Configure ad set (no ID)
  3. Click + Ad → Configure ad (no ID)
  4. Click Publish
Decision logic:
  • Campaign: No ID → CREATE
  • Ad Set: No ID → CREATE
  • Ad: No ID → CREATE
Result: New campaign with 1 ad set and 1 ad created on platform. All nodes receive platform IDs.

Example 2: Editing and Republishing

Scenario: You edit the campaign from Example 1 and republish. Steps:
  1. Campaign now has ID from first publish
  2. Edit campaign budget
  3. Click Publish
Decision logic:
  • Campaign: Has ID, has changes → UPDATE
  • Ad Set: Has ID, no changes → SKIP
  • Ad: Has ID, no changes → SKIP
Result: Campaign budget updated on platform. Ad set and ad unchanged.

Example 3: Loading and Editing Existing Campaign

Scenario: You load an existing campaign and edit it. Steps:
  1. Click Select Existing → Choose Campaign A (has ID)
  2. Click Expand → Load ad sets and ads (all have IDs)
  3. Edit Ad Set 1 targeting
  4. Edit Ad 1 copy text
  5. Click Publish
Decision logic:
  • Campaign: Has ID, no changes → SKIP
  • Ad Set 1: Has ID, has changes → UPDATE
  • Ad Set 2: Has ID, no changes → SKIP
  • Ad 1: Has ID, has changes → UPDATE
  • Ad 2: Has ID, no changes → SKIP
Result: Ad Set 1 and Ad 1 updated on platform. Campaign and other entities unchanged.

Example 4: Copy/Paste to Duplicate

Scenario: You copy an existing campaign to create a duplicate. Steps:
  1. Load Campaign A (has ID)
  2. Copy Campaign A (Ctrl+C)
  3. Paste (Ctrl+V) → IDs cleared
  4. Edit campaign name to “Campaign B”
  5. Click Publish
Decision logic:
  • Campaign B: No ID (cleared on paste) → CREATE
  • Ad Sets: No IDs (cleared on paste) → CREATE
  • Ads: No IDs (cleared on paste) → CREATE
Result: New Campaign B created with all ad sets and ads. Campaign A unchanged.

Example 5: Reconnecting Ad to Different Ad Set

Scenario: You move an ad from one ad set to another. Steps:
  1. Load Campaign A with Ad Set 1 and Ad Set 2
  2. Ad 1 is under Ad Set 1 (has ID)
  3. Drag Ad 1’s connection to Ad Set 2 (ID cleared)
  4. Click Publish
Decision logic:
  • Campaign: Has ID, no changes → SKIP
  • Ad Set 1: Has ID, no changes → SKIP
  • Ad Set 2: Has ID, no changes → SKIP
  • Ad 1 (under Ad Set 2): No ID (cleared on reconnect) → CREATE
Result: New Ad 1 created under Ad Set 2. Original Ad 1 remains under Ad Set 1 on platform.
For detailed reconnect scenarios and managing duplicates, see Reconnect (Relink).

Special Cases

Partial Publish Failures

When some entities succeed and others fail: Successful entities:
  • Receive platform IDs
  • Are skipped on retry (have ID, no changes)
Failed entities:
  • Do not receive platform IDs
  • Are created on retry (no ID)
Example:
First publish attempt:
- Campaign A: SUCCESS (receives ID)
- Ad Set A1: FAILED (no ID)

Retry:
- Campaign A: SKIP (has ID, no changes)
- Ad Set A1: CREATE (no ID, will be created)

Platform-Specific Behavior

Some platforms have special behavior: Snapchat Creative Updates:
  • Changing creative on an existing ad creates a new ad instead of updating
  • Whathead clears the ad ID when you change creative on Snapchat
  • This ensures a new ad is created rather than attempting an update that would fail
Meta Creative Updates:
  • Changing creative on an existing ad updates the ad
  • The ad retains its ID and social proof
  • No special handling needed

Best Practices

Understand Your Intent

Before publishing, ask yourself:
  • Do I want to create new entities? → Use canvas nodes or copy/paste
  • Do I want to update existing entities? → Load them with Select Existing or Expand
  • Do I want to duplicate entities? → Copy/paste or duplicate

Check the Preview

Always review the preview before confirming publish:
  • CREATE actions: Verify you want new entities
  • UPDATE actions: Verify you’re updating the right entities
  • SKIP actions: Verify you’re okay with no changes

Avoid Accidental Duplicates

  • Don’t republish canvas-origin nodes expecting updates (they create duplicates)
  • Don’t reconnect nodes unless you want duplicates
  • Use Select Existing to load campaigns you want to update

Use Platform IDs as Indicators

Check for platform IDs to understand node state:
  • No ID: Will create new on publish
  • Has ID: Will update or skip on publish

Troubleshooting

Cause: The node didn’t have a platform ID, so it created new.Resolution:
  • Check if the node has a platform ID in the node details
  • If you want to update, load the campaign using Select Existing
  • If you want to create new, this is expected behavior
Cause: The entity has a platform ID but no changes were detected.Resolution:
  • Verify you saved changes in the node configuration
  • Make a change to force an update
  • Check that you edited the right node
Cause: Platforms don’t support moving entities between parents, so Whathead creates a new entity under the new parent.Resolution:
  • This is expected behavior
  • See Reconnect (Relink) for detailed scenarios and alternatives
Cause: You want to update an entity but haven’t made changes.Resolution:
  1. Make a minor change (add a space to a field)
  2. Save and publish (entity will UPDATE)
  3. Optionally, revert the change and publish again

Next Steps