In this section, the researchers present the proposed algorithm. The algorithm was named spreading factor congestion-aware ADR approach and is specified in Algorithm 1. The name of the algorithm came from the fact that it uses the congestion statuses of each spreading factor in the network to determine the best one for the end device that requested the ADR. The development of this algorithm was performed to answer the question: how can a modified Adaptive Data Rate algorithm be developed to efficiently manage and reduce signal interferences in LoRaWAN? And to carry out the defined research objective (i). The proposed algorithm has seven main global variables (i.e., snrList, sfList, uplinkCnt, optimizedSF, defaultMargin, snrLimit, sfUsageIndex). These variables are explained as follows: snrList: a list of SNR values to be used in determining the best **data** rate. The list is initially empty and is updated each time the end device sends an uplink to the network server. sfList: a list of SFs that corresponds to the collected SNR values. The list is also initially empty and is updated each time the end device sends an uplink to the network server. uplinkCnt: a counter to keep track of the number of uplinks that the end device has sent to the network server since the ADR was requested. optimizedSF: the SF that will represent the optimized **data** rate. This variable stores the value that the algorithm will calculate once enough **data** has been collected. defaultMargin: the device-specific margin. This value is given in the devices' datasheets. A value of 10 is used in this experiment as it is generally the value for most devices. snrLimit: a list of limits required for each SF for the receiver to be able to demodulate the received signal. These values are used in determining the margin required for optimizing the **data** rate. sfUsageIndex: a list of stored values representing the number of devices using each SF. The values will be used to determine the SF with the fewest devices using it. This list is one of the most important pieces required by the algorithm.