I don't know what's the proper way of implementing macros but I can tell you how I did it in my toy lisp implementation:
I compiled defmacro as a normal function but I also added it to a macro table, then in my compile-form function I would use this table to decide if the form is
a) a special form b) a function call c) a macro
(a) and (b) are obvious, (c) means I would call the compiled macro "function" on the rest of the form and the execute compile-form on the result.
It's unhygenic and there's probably some fatal flaw I didn't catch.