It has been my experience that timers will not work reliably in ScriptEffectStart or ScriptEffectFinish. It appears that this is because ScriptEffectStart and ScriptEffectFinish only run once in a script.
Fortunately, ScriptEffectUpdate runs multiple times unless terminated by another call. Timers appear to work only if placed in ScriptEffectUpdate for this reason.
I offer this as an example of a timer in a magic effect script. This is almost certainly terrible bloated code written by my cognitive challenged self. It does work, which the only positive thing to be said for it. Hopefully, one of the scary smart mod wizards prone to helping out here will be able to field a better reply and example.
SCN DR00EnemyDrinkShort SDEDGoldShort SDEDGATShort SDEDStartShort SDEDRAIShort SDEDInitFloat SDEDTimerShort SDEDKillShort SDEDPayGoldShort SDEDFinalBegin ScriptEffectStart Set SDEDGold to ((GetBaseActorValue Health) + (GetBaseActorValue Magicka) + (GetBaseActorValue Fatigue) + (GetBaseActorValue Strength) + (GetBaseActorValue Intelligence) + (GetBaseActorValue Willpower) + (GetBaseActorValue Agility) + (GetBaseActorValue Speed) + (GetBaseActorValue Endurance) + (GetBaseActorValue Personality) + (GetBaseActorValue Luck)) Set SDEDGAT to ((GetIsCreature * 8) + (GetIsGhost) + (GetVampire * 2) + (IsActor) + (IsEssential * 4) - 1) If (SDEDGAT >= 0) If (SDEDGAT <= 3) If (SDEDStart == 0) AddItem DR33ShivaSoda, 1 Set SDEDStart to 1 EndIf ElseIf (SDEDGAT >= 8) If (SDEDStart == 0) Set SDEDStart to 2 EndIf EndIf EndIfEndBegin ScriptEffectUpdate If (SDEDStart == 1) If (SDEDInit == 0) Set SDEDTimer to 15 Set SDEDInit to 1 AddScriptPackage AAAAAADrinkDR00 Else If (SDEDTimer > 0) Set SDEDTimer to (SDEDTimer - ScriptEffectElapsedSeconds) If (GetIsCurrentPackage AAAAAADrinkDR00 == 0) AddScriptPackage AAAAAADrinkDR00 EndIf Else If (GetEquipped DR25AllyAmulet == 1) UnEquipItem DR25AllyAmulet, 1 Dispel DR31AllyAmulet EndIf If (GetEquipped DR25AllyRing == 1) UnEquipItem DR25AllyRing, 1 Dispel DR31AllyRing EndIf If (GetEquipped DR25CombatRing == 1) UnEquipItem DR25CombatRing, 1 Dispel DR31CombatRing EndIf If (GetEquipped DR25DarkRavenAmulet == 1) UnEquipItem DR25DarkRavenAmulet, 1 Dispel DR31DarkRavenAmulet EndIf If (GetEquipped DR25DarkRavenSignet == 1) UnEquipItem DR25DarkRavenSignet, 1 Dispel DR31DarkRavenSignet EndIf If (GetEquipped DR25EnemyAmulet == 1) UnEquipItem DR25EnemyAmulet, 1 Dispel DR31EnemyAmulet EndIf If (GetEquipped DR25StarDragonSignet == 1) UnEquipItem DR25StarDragonSignet, 1 Dispel DR31StarDragonSignet EndIf RemoveSpell DR34AAvatarAbility RemoveSpell DR34ADKRace RemoveSpell DR34ARavenAbility RemoveSpell DR34ALifeDetect RemoveSpell DR34ANightEye RemoveSpell DR34ARavenVision RemoveSpell DR34AUnseen RemoveSpell DR34AWaterwalk Dispel DR34AAvatarAbility Dispel DR34ADKRace Dispel DR34ARavenAbility Dispel DR34ALifeDetect Dispel DR34ANightEye Dispel DR34ARavenVision Dispel DR34AUnseen Dispel DR34AWaterwalk Dispel StandardBoundArmorBootsNovice Dispel StandardBoundBowJourneyman Dispel StandardBoundArmorCuriassJourneyman Dispel StandardBoundDaggerNovice Dispel StandardBoundArmorGauntletsNovice Dispel StandardBoundArmorGreavesApprentice Dispel StandardBoundArmorHelmetNovice Dispel StandardBoundMaceJourneyman Dispel StandardBoundArmorShieldExpert Dispel StandardBoundSwordExpert Dispel StandardBoundAxeApprentice Dispel AbBoundDagger Dispel LpBoundDagger Dispel SEPriestDagger Dispel AbBoundArmorDaggerMD Dispel AbBoundArmorMaceMD Dispel AbBoundArmorMaceNoHelmetMD Dispel LpBoundArmorMaceMD Dispel LpBoundArmorSwordMD Dispel SEAbOrderKnight1BoundArmorWeapon Dispel SEAbOrderKnight2BoundArmorWeapon Dispel SEAbOrderKnight3BoundArmorWeapon Dispel SEAbOrderKnight4BoundArmorWeapon Dispel SEAbOrderKnight5BoundArmorWeapon Dispel SEAbOrderKnight6BoundArmorWeapon If (GetEquipped SEObeliskPriestStaff01 == 1) UnEquipItem SEObeliskPriestStaff01, 1 ElseIf (GetEquipped SEObeliskPriestStaff02 == 1) UnEquipItem SEObeliskPriestStaff02, 1 ElseIf (GetEquipped SEObeliskPriestStaff03 == 1) UnEquipItem SEObeliskPriestStaff03, 1 ElseIf (GetEquipped SEObeliskPriestStaff04 == 1) UnEquipItem SEObeliskPriestStaff04, 1 ElseIf (GetEquipped SEObeliskPriestStaff05 == 1) UnEquipItem SEObeliskPriestStaff05, 1 ElseIf (GetEquipped SEObeliskPriestStaff06 == 1) UnEquipItem SEObeliskPriestStaff06, 1 EndIf RemoveAllItems Player Set SDEDFinal to 1 If (SDEDFinal == 1) AddItem DR33ShivaSoda, 1 EquipItem DR33ShivaSoda, 1 EndIf EndIf EndIf If (GetDead == 1) Set SDEDKill to 1 EndIf ElseIf (SDEDStart == 2) If (SDEDRAI == 0) RemoveAllItems Player Set SDEDRAI to 1 ElseIf (SDEDRAI == 1) AddItem DR25EnemyAmuletPoison, 1 EquipItem DR25EnemyAmuletPoison, 1 Set SDEDRAI to 2 EndIf If (GetDead == 1) Set SDEDRAI to 3 EndIf EndIfEndBegin ScriptEffectFinish If (SDEDRAI == 3) If (SDEDPayGold == 0) Player.AddItem Gold001, SDEDGold Set SDEDPayGold to 1 EndIf EndIf If (SDEDKill == 1) If (SDEDPayGold == 0) If (GetEquipped DR25AllyAmulet == 1) UnEquipItem DR25AllyAmulet, 1 Dispel DR31AllyAmulet EndIf If (GetEquipped DR25AllyRing == 1) UnEquipItem DR25AllyRing, 1 Dispel DR31AllyRing EndIf If (GetEquipped DR25CombatRing == 1) UnEquipItem DR25CombatRing, 1 Dispel DR31CombatRing EndIf If (GetEquipped DR25DarkRavenAmulet == 1) UnEquipItem DR25DarkRavenAmulet, 1 Dispel DR31DarkRavenAmulet EndIf If (GetEquipped DR25DarkRavenSignet == 1) UnEquipItem DR25DarkRavenSignet, 1 Dispel DR31DarkRavenSignet EndIf If (GetEquipped DR25EnemyAmulet == 1) UnEquipItem DR25EnemyAmulet, 1 Dispel DR31EnemyAmulet EndIf If (GetEquipped DR25StarDragonSignet == 1) UnEquipItem DR25StarDragonSignet, 1 Dispel DR31StarDragonSignet EndIf RemoveSpell DR34AAvatarAbility RemoveSpell DR34ADKRace RemoveSpell DR34ARavenAbility RemoveSpell DR34ALifeDetect RemoveSpell DR34ANightEye RemoveSpell DR34ARavenVision RemoveSpell DR34AUnseen RemoveSpell DR34AWaterwalk Dispel DR34AAvatarAbility Dispel DR34ADKRace Dispel DR34ARavenAbility Dispel DR34ALifeDetect Dispel DR34ANightEye Dispel DR34ARavenVision Dispel DR34AUnseen Dispel DR34AWaterwalk Dispel StandardBoundArmorBootsNovice Dispel StandardBoundBowJourneyman Dispel StandardBoundArmorCuriassJourneyman Dispel StandardBoundDaggerNovice Dispel StandardBoundArmorGauntletsNovice Dispel StandardBoundArmorGreavesApprentice Dispel StandardBoundArmorHelmetNovice Dispel StandardBoundMaceJourneyman Dispel StandardBoundArmorShieldExpert Dispel StandardBoundSwordExpert Dispel StandardBoundAxeApprentice Dispel AbBoundDagger Dispel LpBoundDagger Dispel SEPriestDagger Dispel AbBoundArmorDaggerMD Dispel AbBoundArmorMaceMD Dispel AbBoundArmorMaceNoHelmetMD Dispel LpBoundArmorMaceMD Dispel LpBoundArmorSwordMD Dispel SEAbOrderKnight1BoundArmorWeapon Dispel SEAbOrderKnight2BoundArmorWeapon Dispel SEAbOrderKnight3BoundArmorWeapon Dispel SEAbOrderKnight4BoundArmorWeapon Dispel SEAbOrderKnight5BoundArmorWeapon Dispel SEAbOrderKnight6BoundArmorWeapon If (GetEquipped SEObeliskPriestStaff01 == 1) UnEquipItem SEObeliskPriestStaff01, 1 ElseIf (GetEquipped SEObeliskPriestStaff02 == 1) UnEquipItem SEObeliskPriestStaff02, 1 ElseIf (GetEquipped SEObeliskPriestStaff03 == 1) UnEquipItem SEObeliskPriestStaff03, 1 ElseIf (GetEquipped SEObeliskPriestStaff04 == 1) UnEquipItem SEObeliskPriestStaff04, 1 ElseIf (GetEquipped SEObeliskPriestStaff05 == 1) UnEquipItem SEObeliskPriestStaff05, 1 ElseIf (GetEquipped SEObeliskPriestStaff06 == 1) UnEquipItem SEObeliskPriestStaff06, 1 EndIf Player.AddItem Gold001, SDEDGold RemoveAllItems Player Set SDEDPayGold to 1 EndIf EndIfEnd
If any part of that mess is of use to you or anyone else, please feel free to use it.