Add-on modules

Renewal Pricing for CoreInto

Change the renewal price of products, services and domain extensions in one place; unpaid renewal invoices are updated to match.

Price
Included in every plan
Kind
Add-on module
Version
1.0.0
By
CoreInto

Change what products, services and domain extensions renew at, in one place, and carry the new price into the unpaid renewal invoices that are already out.

Installing#

  1. Copy the renewalprices folder into the modules folder of CoreInto (next to app).
  2. In the admin area open Settings > Add-on Modules and press Activate next to Renewal Pricing. Activating creates the table renewal_price_changes.
  3. The page is under Add-ons > Renewal Pricing (/admin/addons/renewalprices).

Deactivating keeps the table and the recorded changes.

Permissions#

  • Use add-on modules (addon_modules): see the page, preview and save price changes.
  • Configure add-on modules (settings.addon_modules): the Options card (how the two switches start).

The three tabs#

  • Products: every product by product group, for the chosen currency, with per billing cycle the catalogue price, how many active or suspended services renew on it, the amounts they renew at now, and a box for the new renewal price. Two switches per product: Also use this price for new orders (changes the catalogue price; the setup fee is kept) and Update the renewal price of existing services (on by default). Pressing Preview changes lists what will change; nothing is saved until Save these changes.
  • Services: a searchable, paged list of services (client, product, domain, cycle, renewal amount in the client's currency, next due date, status) with a box to set one service's renewal amount (asked to confirm, no preview).
  • Domain extensions: every extension with its renew price per number of years in the chosen currency, how many domains renew on it, and the same two switches (existing domains means active, grace period and pending domains of that extension, period and currency).

Prices are per currency: pick the currency at the top; a service or domain belongs to the currency of its client.

How the new amount is worked out#

  • Service: new price x quantity + its configurable options at their current prices.
  • Domain: new renew price + the yearly price of the extras it has (DNS management, email forwarding, ID protection) x years.
  • Services and domains renewing at 0.00 (free, or a free domain with hosting) stay free.
  • On the Services tab the amount written is the whole renewal amount.

Unpaid invoices#

For every service or domain whose renewal amount changes, its renewal lines on invoices with status unpaid or draft get the new amount; the line's description stays, and the totals and tax are worked out again (Invoices::recalc). When the Gateway Fee module is active, its fee line is brought up to date first (fees()->apply()), so a percentage fee follows the new amount; fee lines are never treated as renewal lines.

A line is a renewal line when it is of kind service (services) or domain_renew (domains), has a period start (due_on, written by the daily billing task and by early renewals), is not on the invoice of an order (orders.invoice_id) and, for a service, its period starts after the service's registration date. First payments, setup fees, domain registrations and transfers are therefore never changed. These are left alone and listed as skipped in the preview and summary:

  • lines whose amount is not the old renewal amount (prorated, discounted or edited by hand);
  • invoices with a payment or credit on them already;
  • invoices in payment pending or collections.

Paid, cancelled and refunded invoices are never looked at.

After saving, a summary shows how many services or domains changed and which invoices were updated (with links); the change is kept under Recent changes and written to the activity log.