+For example, you could write in your `keymap.c`:
+
+```c
+enum custom_keycodes {
+ MY_CUSTOM_MACRO = SAFE_RANGE
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch(keycode) {
+ case MY_CUSTOM_MACRO:
+ SEND_STRING("QMK is the best thing ever!");
+ return false; break;
+ }
+ }
+ return true;
+};
+```
+
+To activate this macro, assign the keycode `MY_CUSTOM_MACRO` to one of your keys in your keymap.
+
+What happens here is this:
+We first define a new custom keycode in the range not occupied by any other keycodes.
+Then we use the `process_record_user` function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated.
+If yes, we send the string `"QMK is the best thing ever!"` to the computer via the `SEND_STRING` macro (this is a C preprocessor macro, not to be confused with QMK macros).
+We return `false` to indicate to the caller that the key press we just processed need not be processed any further.
+
+You might want to add more than one macro.
+You can do that by adding another keycode and adding another case to the switch statement, like so: