You are using
IS NOT NULL in your conditional which is not viable in AMPScript conditional logic and likely always returning as false, skipping your Insert.
If you just want to see if it exists, you can use
IF @id then which will see if
@id exists/has a value and if it returns true, will display your conditions.
If you are looking to see if it is empty or null then you can use the EMPTY() or ISNULL() functions as well. e.g.
IF NOT EMPTY(@id) then
Also, as @JohannesSchapdick stated, you are using the send time function InsertDE() which is only used inside an email at send time - you will instead want to use the InsertData() function on your cloud page.
A final note (opinion only) I usually recommend using RequestParameter() instead of QueryParameter() as Query will only return a value if the name/value is inside the displayed URL (e.g. Manual string append or GET) but RequestParameter() will also return a value if the name/value pair is passed in the header and not the displayed URL (e.g. via HTML POST). This is not a necessary change as it sounds like your value is coming in as an append string, not a POST - just a personal preference defensive coding recommendation.
My final recommended code would be:
SET @id = QueryParameter("id") /* or SET @id = RequestParameter("id") */
IF @id THEN