Possible caveat with your solution, if a subscription starts, for example, on the 31st and you set a 1-month interval, the second invoice will be charged on the 1st of the month after the next, and every subsequent invoice will be charged on the first of the next month.
>>> $start = Carbon::now();
=> Carbon\Carbon {#1062
+"date": "2017-10-31 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2017-12-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-01-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-02-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-03-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-04-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-05-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-06-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-07-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-08-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-09-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}
>>> $start->addMonths(1);
=> Carbon\Carbon {#1062
+"date": "2018-10-01 16:09:04.423699",
+"timezone_type": 3,
+"timezone": "UTC",
}