I think the key is to understand how these changes come about in real languages.
What usually happens is that a phonetic change happens which creates the beginning of a pattern, and then speakers pick up on the pattern and regularize/systematize it to more words (all of this unconsciously of course).
Here's a fictional example to visualize:
Imagine a language that has the following:
i — definite article, "the"
tau — "cat"
-s — mark of genitive/possessive ("of")
-k — mark of dative ("to")
-m — mark of instrumental/commitative ("with")
So you get the following paradigm:
i tau — "the cat"
is taus — "of the cat"
ik tauk — "to the cat"
im taum — "with the cat"
Then the following changes happen: if t is preceded by a vowel, it
lenites to d; if it's preceded by a fricative (like s) it
spirantizes to þ; and if it's preceded by a nasal (like m) it
nasalizes to n.
So now we get:
i dau
is þaus
ik tauk
im naum
And now let's add a further change: final consonants are lost; and so we get:
i dau
i þau
i tau
i nau
And we have created an initial consonant mutation pattern! This is, in a simplified way, more or less what happened in the celtic languages.
Vowel changes operate by the same logic. In Germanic language, a widespread change was the i-umlaut: the vowels a o u changed to ä/æ ö/ø ü/y when the next syllabled contained an i or a y/j.
So for instance, in the proto-germanic language, the word for "foot" was "fots" in the singular nominative and "fotiz" in the plural nominative. The "i" in the second vowel colored the "o" in the first, and was then later lost or weakened, leading to the following alternations in the modern languages:
German: Fuß — Füße
Yiddish: fus — fis*
Swedish: fot — fötter
English: foot — feet*
Icelandic: fótur — fætur*
*: Yiddish, English and Icelandic were later affected by other vowel changes which changed the pattern, but didn't erase it.
So the best way to replicate this in a conlang is to look up for the "sound changes" of real languages and see what they did — yes, this can be quite a lot of research, but realism in conlang comes at a price. Wikipedia has quite a lot of things on the subject:
https://en.wikipedia.org/wiki/Sound_changehttps://en.wikipedia.org/wiki/Germanic_umlauthttps://en.wikipedia.org/wiki/Consonant_mutationWhile doing these changes, it's important to keep in mind that languages don't simply let these changes accumulate without control: there is always a great deal of
analogy going on, that is, forms and paradigms are made more regular in order to try to fit patterns.
Here's an example of what analogy can do, with the evolution of Latin to Italian verbs.
Here's a bunch of Latin verbs, in 1st person singular, 2nd person singular, and 3rd person singular and plural:
(to be)
sum
es
est
sunt
(to have)
habeo
habes
habet
habent
(to sing)
canto
cantas
cantat
cantant
(to fear)
timeo
times
timet
timent
(to sleep)
dormio
dormis
dormit
dormiunt
While there are some irregularities, there also clearly are patterns going on. Now, if we'd just apply the known sound changes from Latin to Italian to these forms, without anything else, here's what we would get:
son
ei
è
son
ho
hai
ha
han
canto
cante
canta
canta
temio
temi
teme
teme
dormio
dormi
dorme
dormio
That is less functional, so instead the following changes occured:
An -o was added to the first person singular form of "to be", by analogy with the other verbs. To preserve the symetry, it was added to the third person plural too. So now both forms looked like "sono".
From this, a new pattern was created: the new form "-no" was taken as new third person plural marker and applied to all verbs. Like wise, the -i which shows up in many of the verbs was reanalysed as a second person marker, and applied to all verbs.
The forms in -io were simplified to -o, and the paradigms of "to fear" and "to sleep" were remodelled to become more like each other.
Finally, the second person form of "to be" got prefixed with s- to be more similar to the 1sg and 3pl forms.
So now we get the actual Italian verbs:
sono
sei
è
sono
ho
hai
ha
hanno
canto
canti
canta
cantano
temo
temi
teme
temono
dormo
dormi
dorme
dormono
And now there are much more obvious patterns.
So to sum it up: apply sound changes, look for resulting patterns and regularize/extend those patterns. Good luck!
Edit: I should add, you don't necessarily have to literally, concretely do all these steps — coming up with a convincing explanation for the current state of the language and explaining things that do not fit by "analogy" is often enough.
Basically any vowel/consonant change for which you can think of a possible underlying/historical mechanism that is attested in real language can be considered realistic.