Skip to content

Instantly share code, notes, and snippets.

@benoitjadinon
Last active January 14, 2026 19:51
Show Gist options
  • Select an option

  • Save benoitjadinon/58616ddaa3b5480bedae761ed24c7447 to your computer and use it in GitHub Desktop.

Select an option

Save benoitjadinon/58616ddaa3b5480bedae761ed24c7447 to your computer and use it in GitHub Desktop.
Subscriptions obsidian base
model:
version: 1
kind: Table
columns: []
pluginVersion: 1.0.0
summaries:
Unique: values.unique().length
Total: values.reduce(number(acc)+number(value), 0).toFixed(2)
filters:
and:
- file.folder == "Finance/Subscriptions"
- file.ext == "md"
- file.name != "Subscriptions"
formulas:
icon: image(if(favicon, favicon, "https://www.google.com/s2/favicons?domain="+url))
enabled: endDate>=now().date() || formula.isRenewing
price-adjusted: (price+formula["shared-adjustment"]).toFixed(2)
shared-adjustment: (number(if(note["share-price"], -number(note["share-price"]) * shared, 0)))
next-payment-date: |-
if(cycle == "lifetime", null,
if(startDate > now(), startDate,
if(endDate, endDate,
if(cycle.endsWith("d"),
startDate + duration((((today() - startDate).days/number(cycle)).ceil() * 28) + "d"),
if(cycle.endsWith("M"),
startDate + duration((((today() - startDate).months/number(cycle)).ceil() * number(cycle)) + "M"),
if(cycle.endsWith("y"),
startDate + duration((((today() - startDate).years/number(cycle)).ceil() * number(cycle)) + "y"),
startDate
)
)
)
)
)
)
started: startDate.relative()
duration: if (endDate, endDate, now())-startDate
next-payment-duration: if (formula["next-payment-date"].date() == today(), "TODAY",date(formula["next-payment-date"]).relative())
isRenewing: endDate.isEmpty()
status: |-
if(cycle == "lifetime", 'lifetime',
if (formula.isRenewing, if (startDate > now(), "starts", "renews"), if (endDate > now(), "ends", "ended"))+" "+formula["next-payment-duration"]
)
next-payment-days: |-
if(cycle == "lifetime", 0,
number((date(formula["next-payment-date"])-now()).days.toFixed(0))
)
cycleDays: |-
if(cycle == "lifetime", 'lifetime',
(date("1970-01-01")-cycle-date("1970-01-01")).days.abs()
)
pricePerMonth: |-
if(cycle == "lifetime", (price / formula.duration.months).toFixed(2),
number((price/formula.cycleDays*31) + (if (shared, (formula["shared-adjustment"]),0))).toFixed(2)
)
priceInFuture: if(formula.willRenew && startDate < now(),formula.pricePerMonth,number(0).toFixed(2))
willRenew: |-
if(cycle == "lifetime", 'lifetime',
endDate == null || (endDate.relative() > now()+cycle)
)
totalCost: |-
if(cycle == "lifetime", price.toFixed(2),
if(startDate > now(),number(0).toFixed(2),(formula.duration.months *number(formula.pricePerMonth)).toFixed(2))
)
duration-precise: formula.duration.months.toFixed(2)
endDateOrForever: if (endDate, endDate, date('2099-01-01'))
properties:
formula.enabled:
displayName: active
formula.price-adjusted:
displayName: price-adjusted
formula.next-payment-date:
displayName: next-payment-date
formula.started:
displayName: started
formula.cycleDays:
displayName: cycleDays
formula.priceInFuture:
displayName: priceThisMonth
views:
- type: table
name: Subscriptions
groupBy:
property: formula.enabled
direction: DESC
order:
- formula.icon
- file.name
- product
- formula.status
- formula.next-payment-date
- cycle
- price
- formula.price-adjusted
- formula.pricePerMonth
- formula.priceInFuture
- formula.totalCost
- currency
- formula.started
- startDate
- endDate
- formula.duration
- formula.duration-precise
- account
- account-holder
- category
- tags
- shared
- share-price
- notes
- formula.shared-adjustment
sort:
- property: formula.status
direction: ASC
- property: file.name
direction: DESC
- property: formula.totalCost
direction: ASC
- property: formula.started
direction: ASC
- property: formula.price-adjusted
direction: ASC
summaries:
price: Sum
formula.pricePerMonth: Empty
formula.priceInFuture: Total
columnSize:
formula.icon: 38
note.product: 129
formula.status: 128
formula.next-payment-date: 116
note.cycle: 47
note.price: 69
formula.price-adjusted: 80
formula.pricePerMonth: 60
formula.priceInFuture: 61
formula.totalCost: 66
note.currency: 55
note.endDate: 126
formula.duration-precise: 62
note.account: 172
note.account-holder: 53
note.category: 112
note.share-price: 67
note.notes: 204
- type: table
name: Subscriptions Active
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- formula.next-payment-date
- cycle
- price
- formula.pricePerMonth
- currency
- formula.started
- endDate
- formula.duration
- account
- account-holder
- category
- tags
- shared
- share-price
- formula.price-adjusted
- notes
sort:
- property: formula.next-payment-date
direction: ASC
- property: file.name
direction: ASC
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.cycle: 47
formula.pricePerMonth: 58
note.currency: 55
note.endDate: 126
formula.duration_precise: 254
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: table
name: Subscriptions Inactive
filters:
and:
- formula.enabled == false
order:
- formula.icon
- file.name
- endDate
- cycle
- price
- formula.pricePerMonth
- currency
- formula.started
- formula.duration
- account
- account-holder
- category
- tags
- shared
- share-price
- formula.price-adjusted
- notes
sort:
- property: endDate
direction: DESC
- property: formula.started
direction: ASC
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.cycle: 47
formula.pricePerMonth: 58
note.currency: 55
note.endDate: 126
formula.duration_precise: 254
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: calendar
name: Renewals
filters:
and:
- formula.enabled == true
- formula.isRenewing == true
startDate: formula.next-payment-date
- type: calendar
name: Ending
filters:
and:
- formula.isRenewing == false
- formula.enabled == true
startDate: formula.next-payment-date
- type: table
name: Subscriptions Soon
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- formula.next-payment-date
- notes
sort:
- property: formula.next-payment-date
direction: ASC
limit: 3
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.currency: 55
note.cycle: 66
note.endDate: 126
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
- type: list
name: Subscriptions Soon List
filters:
and:
- formula.enabled == true
order:
- formula.icon
- file.name
- formula.status
- notes
- formula.next-payment-date
sort:
- property: formula.next-payment-date
direction: ASC
limit: 3
columnSize:
formula.icon: 38
formula.status: 128
formula.next-payment-date: 116
note.currency: 55
note.cycle: 66
note.endDate: 126
note.account: 172
note.account-holder: 53
note.category: 112
formula.price-adjusted: 80
note.notes: 204
separator: " "
markers: number
nestedProperties: false
- type: tasknotesCalendar
name: Ending Calendar View
calendarView: dayGridMonth
showICS_ics_bb91vhfdemf12oemw: false
showICS_ics_q3765di1smf12p46b: false
showICS_ics_0k7qvgafnmghaso1i: false
titleProperty: note.endDate
startDateProperty: note.endDate
- type: calendar
name: Opened Calendar
order:
- file.name
startDate: note.startDate
endDate: formula.endDateOrForever
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment