One of the management options Jamf Pro provides is sending MDM commands or DDM declarations to managed Macs run macOS software updates automatically. For Macs, Jamf Pro includes this functionality in the Software Updates section under Computers. If you have not previously used the Software Updates functionality, by default it is turned off and needs to be enabled.
Once enabled, you should see a list of the smart and static computer groups set up on your Jamf Pro server. To set up a software update plan for one of those groups, click the desired group and then click Update 1 Selected.
Note: It’s possible to select multiple groups at once and set the same software plan for all selected groups.
Once the groups have been selected for update, you’ll be provided with the various options available. Four of these options use MDM commands and one will use a DDM declaration:
MDM commands:
DDM declaration:
One reason it is important to know which use MDM commands and which use DDM declarations is that the MDM command method is supported on the following versions of macOS:
The DDM declaration method is supported on the following versions of macOS:
Note: The DDM declaration method works for Jamf Pro instances hosted in Jamf Cloud and does not work for on-premise Jamf Pro installations. If you are using an on-premise Jamf Pro installation, the Download and schedule to install option is grayed out and there is a note explaining that this method is only supported for Jamf Cloud-hosted environments.
You will also get various update options:
Note: The Specific version setting assumes that the version in question is still available from Apple’s software update feed. If it is not, then that version will not be downloaded or installed.
Managed software update plan behavior:
Something important to know about managed software update plans is that they were built to act like Jamf Pro’s functionality for sending out MDM commands via a mass action. You select the devices you wanted to apply the mass action to (or in this case, the software update plan) and Jamf Pro would send the commands out. When choosing a smart or static group and setting up a software update plan, the commands for that software update plan will be sent to only the devices in that group at that point in time.
If a device subsequently enters the smart group or static group in question, it will not receive the commands which had been previously sent out. Please note that this also means that leaving the smart or static group will not remove a previously applied software update plan.
For more details, please see below the jump.
Setting up managed software update plans:
For how this works, let’s run through an example workflow. For this example workflow, the following assumptions are being made:
With these assumptions, my first step is selecting a group to apply the software update plan to. For this example, I’ve set up a static group named Managed Software Update Deployment Group and assigned one device to it.
1. From the list of groups in the Software Updates window, select the Managed Software Update Deployment Group static group.
2. Click the Update 1 Selected button.
3. Select the following option to choose the available DDM declaration method:
4. Choose a date by which the software update should apply.
5. Choose the OS version update option.
In this example, I am choosing the Latest version based on device eligibility option.
6. Once all choices have been made, verify that they are what is desired. Once verified, click the Apply button.
7. You should be notified how many devices have received the software update plan.
Once the software update plan has been deployed, you should be able to check in the computer inventory record for the device(s) and verify that they have received the software update plan.
For details, you can click the View event store link in the computer inventory record.
You can also check on the managed device’s end by opening System Settings: General: Device Management, locating the MDM enrollment profile in the list of profiles and double-clicking on it. When you scroll to the bottom of the enrollment profile’s window, you should see a Device Declarations section.
If you’re deploying a software update plan via DDM, you should see a listing for that software update plan in the Device Declarations section.
If you click on that listing, you should see the details of the plan.
From the user’s perspective, they should see a Notifications center notification appear with two available options:
When you click the Details button, you should see behavior similar to what’s shown below:
When you click the Update button, you should see behavior similar to what’s shown below:
Note: The video above has been edited to artificially reduce the amount of time the OS update took to run. Run time of the pre-edited video was 27 minutes 32 seconds.
Once the update has completed, you should be able to check in the computer inventory record for the device(s) and verify that they do not have an active software update plan.
You should also be able to check the history and verify whether the software update was successful or not. For details about the process, click the Details button.
Something that is important to know about the reporting is that when Jamf Pro deploys a software update plan which uses DDM declarations, it is doing two things:
Any reported errors which show up in Jamf Pro are coming back from macOS, so if macOS reports a failure on its end, that’s what Jamf Pro also reports. When Jamf Pro gets a failure message from a managed Mac, it stops listening at that point and does not pick up on any subsequent activity from that managed device for that software update plan. However, on the managed device side, macOS may retry running the software update process and subsequently succeed. This may lead to some results which seem paradoxical, where the managed device reports that the software update plan failed, but the managed device is separately reporting that it’s running the desired version of macOS.
The reporting that Jamf Pro gets back from the managed Mac may also not include a lot of information about the software update process. For example, here’s a report I received from a macOS VM which updated from 15.4.1 to 15.5.0. It does not include a lot of information about the update process itself but the report does include a VerificationResultEvent item, which tells Jamf Pro that the overall DDM software update process was successful.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"events" : [ | |
{ | |
"type" : ".PlanCreatedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 76, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623056095 | |
}, | |
{ | |
"type" : ".PlanAcceptedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 78, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623064767 | |
}, | |
{ | |
"type" : ".StartPlanEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 79, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623074737 | |
}, | |
{ | |
"type" : ".QueueDeclarativeCommand", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"eventSentEpoch" : 1748623084750, | |
"deviceObjectId" : 1, | |
"payload" : { | |
"targetOSVersion" : "15.5", | |
"targetBuildVersion" : "24F74", | |
"targetLocalDateTime" : "2025-05-30T12:00:00", | |
"detailsURL" : null | |
} | |
}, | |
{ | |
"type" : ".DDMPlanScheduledEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 80, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623085285 | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 82, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623100844, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748623100844, | |
"installState" : "UNKNOWN", | |
"failureReason" : { | |
"reason" : null, | |
"count" : null, | |
"timestamp" : null | |
}, | |
"installReason" : null, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : { | |
"osVersion" : "15.5", | |
"buildVersion" : "24F74" | |
} | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 81, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623094764, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748623094764, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : { | |
"reason" : [ | |
"declaration" | |
], | |
"declarationId" : null | |
}, | |
"deviceOperatingSystem" : null, | |
"management" : { | |
"clientCapabilities" : null, | |
"declarations" : { | |
"activations" : [ | |
{ | |
"active" : true, | |
"identifier" : "2770004c-ef75-49f6-898e-094704a983a2", | |
"valid" : "valid", | |
"serverToken" : "f1112d09fbdc0b6d59638276977d47e7cba99170a58b5becbdf35d8d91640aad" | |
}, | |
{ | |
"active" : true, | |
"identifier" : "9e2a4b4a-5525-4d1b-a8e5-eb4f239864fa", | |
"valid" : "valid", | |
"serverToken" : "55142de5818e027b45ba9475161b7602f6dbb827bf3bf3b128fca00899b363e6" | |
} | |
], | |
"configurations" : [ | |
{ | |
"active" : true, | |
"identifier" : "1bb6448b-1909-478d-a22d-6df95db2f95a", | |
"valid" : "valid", | |
"serverToken" : "a2c593871e1662840d3a1fec10383f2d12da27fa36b3d9641db64430b8f60005" | |
}, | |
{ | |
"active" : true, | |
"identifier" : "24c5af07-2a05-4bfb-9e47-e5a6892f023f", | |
"valid" : "valid", | |
"serverToken" : "a9be7c568e9f59fc18512d5c990142c0cf7a283e614a1672bba63f8fc2c163b0" | |
} | |
] | |
} | |
}, | |
"validDeclaration" : true, | |
"pendingVersion" : null | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 83, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623106333, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748623106333, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : null, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : null | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 84, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748623816601, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748623816601, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : null, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : null | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 85, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748627202881, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748627202881, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : null, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : { | |
"osVersion" : "15.5", | |
"buildVersion" : "24F74" | |
} | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 86, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748627220442, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748627220442, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : null, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : null | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 87, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748627523813, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748627523813, | |
"installState" : "UNKNOWN", | |
"failureReason" : { | |
"reason" : null, | |
"count" : 0, | |
"timestamp" : null | |
}, | |
"installReason" : null, | |
"deviceOperatingSystem" : { | |
"family" : null, | |
"buildVersion" : "24F74", | |
"version" : "15.5", | |
"supplemental" : { | |
"buildVersion" : "24F74", | |
"extraVersion" : null | |
}, | |
"marketingName" : "macOS 15.5" | |
}, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : null | |
} | |
}, | |
{ | |
"type" : ".DDMStatusResponseReceivedEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 88, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748627529761, | |
"statusReportDto" : { | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"deviceObjectId" : 1, | |
"deviceId" : 28, | |
"eventReceivedEpoch" : 1748627529761, | |
"installState" : "UNKNOWN", | |
"failureReason" : null, | |
"installReason" : { | |
"reason" : [ ], | |
"declarationId" : null | |
}, | |
"deviceOperatingSystem" : null, | |
"management" : null, | |
"validDeclaration" : true, | |
"pendingVersion" : { | |
"osVersion" : null, | |
"buildVersion" : null | |
} | |
} | |
}, | |
{ | |
"type" : ".VerificationResultEvent", | |
"managementUUID" : "dc528a2e-2bec-46ee-9beb-ba3403540804", | |
"processManagerUUID" : "6cf1e543-4499-4fa3-9899-9fe9e9ac460c", | |
"id" : 89, | |
"deviceObjectId" : 1, | |
"eventReceivedEpoch" : 1748627534788 | |
} | |
] | |
} |
Clearing existing managed software update plans:
As mentioned previously, managed software update plans function in a similar way to mass actions, where the commands for that software update plan will be sent to only the devices in that group at that point in time. Since it can be a challenge to track which devices may be affected once that plan has been deployed, it may be easiest to cancel all current software update plans and set up new ones when needed. To do this, use the procedure shown below:
1. Go to the Software Updates section.
2. Click the Use new feature toggle to turn the managed software update function off.
3. Jamf Pro will confirm that you want to turn the managed software update function off, along with a count of the devices that have software update plans currently applied. Click the Disable button to confirm.
4. Jamf Pro will clear all existing software update plans from managed devices.
5. The managed software update function will be turned off.
6. To turn the managed software update function back on, click the Enable button.
7. Jamf Pro will confirm that you want to turn the managed software update function on, along with a count of the devices that have software update plans currently applied. Click the Enable button to confirm.
8. The Software Updates section will again show a list of the smart and static computer groups set up on your Jamf Pro server.
Note: Turning the Software Updates functionality off and back on will clear all previously existing records of software update plans or those plans’ results. Jamf Pro will have no records of any previous software update plans at this point.
For more information on using Jamf Pro’s managed software updates, please see the documentation linked below: