Add API functionality for support requests and subscription management
Please add an API for handling support requests and subscription management. Most builders process the same requests repeatedly, and around 90% are straightforward enough for a basic LLM to handle without manual attention. API access would let builders create automation suited to their workflows. Builders should use this responsibly, but the infrastructure would help many people optimize their operations.

Val K About 1 month ago
Add API functionality for support requests and subscription management
Please add an API for handling support requests and subscription management. Most builders process the same requests repeatedly, and around 90% are straightforward enough for a basic LLM to handle without manual attention. API access would let builders create automation suited to their workflows. Builders should use this responsibly, but the infrastructure would help many people optimize their operations.

Val K About 1 month ago
Control the number of devices where the subscription is used
The pain is to monetize those who buy 1 subscription for 5+ devices (which fits the Enterprice description and should be billed differently) As far as I understand some kind of fingerprinting is already built into peivol, so we can break the task down into subtasks: 1) to start with it would be cool to be able to see on how many devices the subscriber has activated the app on 2) The next step would be logical to give functionality to limit the number of uses for certain plans. That will allow to create a separate ala Enterprise plan for the number of users. P.S Perhaps this task is somehow related to the task about discount coupons, because in fact it introduces additional customization of the flat payment system.

DreamBuilder Team About 1 month ago
Control the number of devices where the subscription is used
The pain is to monetize those who buy 1 subscription for 5+ devices (which fits the Enterprice description and should be billed differently) As far as I understand some kind of fingerprinting is already built into peivol, so we can break the task down into subtasks: 1) to start with it would be cool to be able to see on how many devices the subscriber has activated the app on 2) The next step would be logical to give functionality to limit the number of uses for certain plans. That will allow to create a separate ala Enterprise plan for the number of users. P.S Perhaps this task is somehow related to the task about discount coupons, because in fact it introduces additional customization of the flat payment system.

DreamBuilder Team About 1 month ago
Fight with "Attempts To Charge"
In my paywall, there is a huge amount of “Attempts To Charge” statuses. This might indicate a scam card or a real issue. I think it's worth adding a card check, if possible.

Alexej Plate 2 months ago
Fight with "Attempts To Charge"
In my paywall, there is a huge amount of “Attempts To Charge” statuses. This might indicate a scam card or a real issue. I think it's worth adding a card check, if possible.

Alexej Plate 2 months ago
Previous day of week comparison
Hello! Please add a comparison not with the previous date of last month, but with the previous day of last week (and name of day). This way, the comparison will be more objective.

Boris Zabolotskikh 2 months ago
Previous day of week comparison
Hello! Please add a comparison not with the previous date of last month, but with the previous day of last week (and name of day). This way, the comparison will be more objective.

Boris Zabolotskikh 2 months ago
Поддержать нативный российский пэйволл без модерации
Например Robokassa поддерживает оплату с западных карт - https://robokassa.com/payments/payment-method/inostrannye-karty/ , кажется слышал и о других подобных сервисах. Не очень важно какой именно поддерживать - лишь бы вы могли смело использовать боевую версию. Какую проблему решает: позволяет проще экспериментировать. Будет дорого и наверное часть клиентов отвалятся не увидев знакомого stripe, но можно хоть каждый месяц пробовать на новом продукте без необходимости рассмотрения и одобрения monetize software (а часто же собственно готовность пользователей оплатить и подтверждает полезность проекта). А если хоть какие-то оплаты пойдут, тогда уже переходить с беседам о поддержке основных payment providers через monetize software. P.S. Годятся даже сильные ограничения, например, не больше N подписок на M долларов через robokassa. Речь не о том, чтобы “на самом деле” пользоваться робокассой - у них и цены негуманные, и они не совсем про построение комьюнити разработчиков. Цель в снижении барьера для “попробовать оплатит ли хоть кто-то хоть что-нибудь” и желательно так, чтобы переезд на правильное решение в дальнейшем был бы не сложен.

Artem Marchenko 3 months ago
Поддержать нативный российский пэйволл без модерации
Например Robokassa поддерживает оплату с западных карт - https://robokassa.com/payments/payment-method/inostrannye-karty/ , кажется слышал и о других подобных сервисах. Не очень важно какой именно поддерживать - лишь бы вы могли смело использовать боевую версию. Какую проблему решает: позволяет проще экспериментировать. Будет дорого и наверное часть клиентов отвалятся не увидев знакомого stripe, но можно хоть каждый месяц пробовать на новом продукте без необходимости рассмотрения и одобрения monetize software (а часто же собственно готовность пользователей оплатить и подтверждает полезность проекта). А если хоть какие-то оплаты пойдут, тогда уже переходить с беседам о поддержке основных payment providers через monetize software. P.S. Годятся даже сильные ограничения, например, не больше N подписок на M долларов через robokassa. Речь не о том, чтобы “на самом деле” пользоваться робокассой - у них и цены негуманные, и они не совсем про построение комьюнити разработчиков. Цель в снижении барьера для “попробовать оплатит ли хоть кто-то хоть что-нибудь” и желательно так, чтобы переезд на правильное решение в дальнейшем был бы не сложен.

Artem Marchenko 3 months ago
A/B tests in the Paywall
Hi team! Please add the ability to run A/B tests in the Paywall. It would be very convenient to compare different pricing sets and then, based on this data, determine which price is more profitable to sell at. Thank you!

Boris Zabolotskikh 3 months ago
A/B tests in the Paywall
Hi team! Please add the ability to run A/B tests in the Paywall. It would be very convenient to compare different pricing sets and then, based on this data, determine which price is more profitable to sell at. Thank you!

Boris Zabolotskikh 3 months ago
Add TypeScript Example to Install Script Instructions
Hey team. It would be great to include a TypeScript implementation in the install/setup script examples of background.js. Right now, the docs only show a plain JavaScript version, which causes TypeScript to complain about missing types or implicit anys. Since most projects today use TS by default, having a TypeScript-friendly snippet (with proper typings) would make onboarding much smoother. Here’s an example of a version with typings: // use same paywall id everywhere export const PAYWALL_ID = XXX; const connectedPorts = new Set (); chrome.runtime.onConnectExternal.addListener(port => { if ( port.sender?.url && (port.sender.url.includes('onlineapp.pro') || port.sender.url.includes('onlineapp.live') || port.sender.url.includes('onlineapp.stream')) ) { connectedPorts.add(port); port.onDisconnect.addListener(() => { connectedPorts.delete(port); }); } else { console.warn('Connection attempt from unauthorized domain:', port.sender?.url); port.disconnect(); } }); function trackEvent(eventName: string, additionalData = {}) { getUserId((userId: string) => { fetch('https://onlineapp.pro/api/track-event', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event: eventName, wallId: PAYWALL_ID, extensionId: chrome.runtime.id, userId: userId, ...additionalData, }), }); }); } function notifyConnectedClients(notification: Record) { connectedPorts.forEach(port => { try { port.postMessage(notification); } catch (error) { console.error('Error sending notification to port:', error); connectedPorts.delete(port); } }); } function getUserId(callback: (user_id: string) => void) { chrome.storage.sync.get(['user_id'], result => { if (result.user_id) { callback(result.user_id); } else { const userId = crypto.randomUUID(); chrome.storage.sync.set({ user_id: userId, ['pw-591-visitor-id']: userId }, () => { callback(userId); }); } }); } chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => { if ( sender.url && (sender.url.includes('onlineapp.pro') || sender.url.includes('onlineapp.live') || sender.url.includes('onlineapp.stream')) ) { if (message.source === 'supabase-auth-adapter') { switch (message.action) { case 'ping': sendResponse({ status: 'ok' }); break; case 'getItem': try { const { key } = message.data; chrome.storage.sync.get(key, result => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { sendResponse({ status: 'success', value: result[key] || null }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in getItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; case 'setItem': try { const { key, value } = message.data; chrome.storage.sync.set({ [key]: value }, () => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { sendResponse({ status: 'success' }); notifyConnectedClients({ type: 'storage_update', action: 'set', key, value, timestamp: Date.now(), }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in setItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; case 'removeItem': try { const { key } = message.data; chrome.storage.sync.remove(key, () => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { notifyConnectedClients({ type: 'storage_update', action: 'remove', key, timestamp: Date.now(), }); sendResponse({ status: 'success' }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in removeItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; default: console.warn('Unknown action:', message.action); sendResponse({ status: 'error', message: 'Unknown action' }); break; } } else if (message.type === 'broadcast') { notifyConnectedClients(message.data || message); sendResponse({ status: 'success', message: 'Message broadcasted successfully', clientsCount: connectedPorts.size, }); } else { console.warn('Message has neither source nor type'); sendResponse({ status: 'error', message: 'Invalid message format' }); } } else { console.warn('Message from unauthorized domain:', sender.url); sendResponse({ status: 'error', message: 'Unauthorized domain' }); } return true; });

Alexander Kozhurkin 3 months ago
Add TypeScript Example to Install Script Instructions
Hey team. It would be great to include a TypeScript implementation in the install/setup script examples of background.js. Right now, the docs only show a plain JavaScript version, which causes TypeScript to complain about missing types or implicit anys. Since most projects today use TS by default, having a TypeScript-friendly snippet (with proper typings) would make onboarding much smoother. Here’s an example of a version with typings: // use same paywall id everywhere export const PAYWALL_ID = XXX; const connectedPorts = new Set (); chrome.runtime.onConnectExternal.addListener(port => { if ( port.sender?.url && (port.sender.url.includes('onlineapp.pro') || port.sender.url.includes('onlineapp.live') || port.sender.url.includes('onlineapp.stream')) ) { connectedPorts.add(port); port.onDisconnect.addListener(() => { connectedPorts.delete(port); }); } else { console.warn('Connection attempt from unauthorized domain:', port.sender?.url); port.disconnect(); } }); function trackEvent(eventName: string, additionalData = {}) { getUserId((userId: string) => { fetch('https://onlineapp.pro/api/track-event', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event: eventName, wallId: PAYWALL_ID, extensionId: chrome.runtime.id, userId: userId, ...additionalData, }), }); }); } function notifyConnectedClients(notification: Record) { connectedPorts.forEach(port => { try { port.postMessage(notification); } catch (error) { console.error('Error sending notification to port:', error); connectedPorts.delete(port); } }); } function getUserId(callback: (user_id: string) => void) { chrome.storage.sync.get(['user_id'], result => { if (result.user_id) { callback(result.user_id); } else { const userId = crypto.randomUUID(); chrome.storage.sync.set({ user_id: userId, ['pw-591-visitor-id']: userId }, () => { callback(userId); }); } }); } chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => { if ( sender.url && (sender.url.includes('onlineapp.pro') || sender.url.includes('onlineapp.live') || sender.url.includes('onlineapp.stream')) ) { if (message.source === 'supabase-auth-adapter') { switch (message.action) { case 'ping': sendResponse({ status: 'ok' }); break; case 'getItem': try { const { key } = message.data; chrome.storage.sync.get(key, result => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { sendResponse({ status: 'success', value: result[key] || null }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in getItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; case 'setItem': try { const { key, value } = message.data; chrome.storage.sync.set({ [key]: value }, () => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { sendResponse({ status: 'success' }); notifyConnectedClients({ type: 'storage_update', action: 'set', key, value, timestamp: Date.now(), }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in setItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; case 'removeItem': try { const { key } = message.data; chrome.storage.sync.remove(key, () => { if (chrome.runtime.lastError) { const errorMessage = chrome.runtime.lastError.message; console.error('Storage error:', errorMessage); sendResponse({ status: 'error', message: errorMessage }); } else { notifyConnectedClients({ type: 'storage_update', action: 'remove', key, timestamp: Date.now(), }); sendResponse({ status: 'success' }); } }); return true; } catch (error) { if (error instanceof Error) { console.error('Error in removeItem:', error); sendResponse({ status: 'error', message: error.message }); } } break; default: console.warn('Unknown action:', message.action); sendResponse({ status: 'error', message: 'Unknown action' }); break; } } else if (message.type === 'broadcast') { notifyConnectedClients(message.data || message); sendResponse({ status: 'success', message: 'Message broadcasted successfully', clientsCount: connectedPorts.size, }); } else { console.warn('Message has neither source nor type'); sendResponse({ status: 'error', message: 'Invalid message format' }); } } else { console.warn('Message from unauthorized domain:', sender.url); sendResponse({ status: 'error', message: 'Unauthorized domain' }); } return true; });

Alexander Kozhurkin 3 months ago
Name of day of week on charts
Please add name of days of week to the chart. This is necessary for convenient comparison of data with the previous day of the week.

Boris Zabolotskikh 3 months ago
Name of day of week on charts
Please add name of days of week to the chart. This is necessary for convenient comparison of data with the previous day of the week.

Boris Zabolotskikh 3 months ago
Completed
Tickets notification
Hello! Please add email/telegram notifications about new tickets in the Support section. Thanks!

Boris Zabolotskikh 3 months ago
Completed
Tickets notification
Hello! Please add email/telegram notifications about new tickets in the Support section. Thanks!

Boris Zabolotskikh 3 months ago
Add an ability to set different trial days to different paywall options
I’d like to set up the paywall and trial days in the following: – Monthly subscription – without trial – Yearly subscription – 3 days trial This way, I’ll be able to drive more users to choose the yearly subscription Here, I’m talking about the paywall trials, not the trials before the first opening of the paywall.

Alexej Plate 4 months ago
Add an ability to set different trial days to different paywall options
I’d like to set up the paywall and trial days in the following: – Monthly subscription – without trial – Yearly subscription – 3 days trial This way, I’ll be able to drive more users to choose the yearly subscription Here, I’m talking about the paywall trials, not the trials before the first opening of the paywall.

Alexej Plate 4 months ago
Completed
Доступный баланс по месяцам
Просьба добавить отображение доступного баланса наравне с карточками на вкладке Overview, чтобы можно было смотреть доступный баланс по месяцам. Сейчас там есть Net revenue, но это не то же самое, что Available Balance.

Boris Zabolotskikh 4 months ago
Completed
Доступный баланс по месяцам
Просьба добавить отображение доступного баланса наравне с карточками на вкладке Overview, чтобы можно было смотреть доступный баланс по месяцам. Сейчас там есть Net revenue, но это не то же самое, что Available Balance.

Boris Zabolotskikh 4 months ago
Paywall promo codes
Hello! Please add the ability to create promo codes in Paywall with settings: code word, period of use/number of uses, amount/percentage of discount. Thank you!

Boris Zabolotskikh 4 months ago
Paywall promo codes
Hello! Please add the ability to create promo codes in Paywall with settings: code word, period of use/number of uses, amount/percentage of discount. Thank you!

Boris Zabolotskikh 4 months ago
Часто на вкалдке Users и subscriptions показываает разные страны
Часто на вкалдке Users и subscriptions показываает разные страны Кто-то говорил что там есть разница по определению стран на разных этапах (IP или карта оплаты) - если так, то надо как-то это в UI разделить чтобы было поянтно почему так. Пример monetize.software/ru/publisher/overview Step 1: Navigate to: monetize.software/ru/publisher/overview Step 2: Select area on page Step 3: Navigate to: https://monetize.software/ru/publisher/overview?tab=subscriptions Step 4: Select area on page Created using Step by step instructions: Guide To Docs 1.3.0.1

DreamBuilder Team 4 months ago
Часто на вкалдке Users и subscriptions показываает разные страны
Часто на вкалдке Users и subscriptions показываает разные страны Кто-то говорил что там есть разница по определению стран на разных этапах (IP или карта оплаты) - если так, то надо как-то это в UI разделить чтобы было поянтно почему так. Пример monetize.software/ru/publisher/overview Step 1: Navigate to: monetize.software/ru/publisher/overview Step 2: Select area on page Step 3: Navigate to: https://monetize.software/ru/publisher/overview?tab=subscriptions Step 4: Select area on page Created using Step by step instructions: Guide To Docs 1.3.0.1

DreamBuilder Team 4 months ago
Completed
Please add feature Export Emails
Add ability to export subsribers emails with details of Plan and Active\Canceled user status in Subscriptions tab

DreamBuilder Team 5 months ago
Completed
Please add feature Export Emails
Add ability to export subsribers emails with details of Plan and Active\Canceled user status in Subscriptions tab

DreamBuilder Team 5 months ago
Completed
Allow un-sequenced executions of paywall functions
I’ve noticed that if some functions of paywall are called at the same time, they don’t work. Example: call getTrialInfo and getUser without awaiting the calls. As a result, the functions won’t be properly executed. This is important because the paywall functions can be used for checking the state and showing some parts of the UI based on the result. E.g. I want to call getTrialInfo to show or hide the “Restore Account” button, but if at the same time openPaywall will be called, the first function will fail. So, for this to work properly I have to create some kind of a queue where the calls are totally flat.

Alexej Plate 6 months ago
Completed
Allow un-sequenced executions of paywall functions
I’ve noticed that if some functions of paywall are called at the same time, they don’t work. Example: call getTrialInfo and getUser without awaiting the calls. As a result, the functions won’t be properly executed. This is important because the paywall functions can be used for checking the state and showing some parts of the UI based on the result. E.g. I want to call getTrialInfo to show or hide the “Restore Account” button, but if at the same time openPaywall will be called, the first function will fail. So, for this to work properly I have to create some kind of a queue where the calls are totally flat.

Alexej Plate 6 months ago
Completed
Add an ability to open the paywall regardless of trial opens setup
If there are trial opens configured, I’d like to have the ability to open the paywall regardless of the trial opens and without wasting a trial open. Example: I have 3 trial opens. I call the function paywall.open({‘show’: ‘always’, consumeTrialOpen: false}) and the paywall is opened, and there are still 3 trials remaining. Use cases: Hide premium features behind the paywall from the start.

Alexej Plate 6 months ago
Completed
Add an ability to open the paywall regardless of trial opens setup
If there are trial opens configured, I’d like to have the ability to open the paywall regardless of the trial opens and without wasting a trial open. Example: I have 3 trial opens. I call the function paywall.open({‘show’: ‘always’, consumeTrialOpen: false}) and the paywall is opened, and there are still 3 trials remaining. Use cases: Hide premium features behind the paywall from the start.

Alexej Plate 6 months ago
Completed
Whitelist Users by Email to Bypass Paywall Display
Add the ability to whitelist users by their email addresses, allowing them to bypass the paywall. This feature is essential for granting direct access to specific individuals, such as corporate clients or manually approved users, without requiring them to interact with the standard payment flow. Frontend Requirements: Implement a UI component on the paywall page to manage a whitelist. The component should display a list of email addresses. Allow adding and removing email entries from this list. Backend Requirements: Store and manage the whitelist on the backend. When paywall.open() is triggered, skip displaying the paywall for users whose email is on the whitelist. This functionality ensures a smoother experience for special access cases, such as direct corporate agreements or promotional access.

Andrey Volkov 7 months ago
Completed
Whitelist Users by Email to Bypass Paywall Display
Add the ability to whitelist users by their email addresses, allowing them to bypass the paywall. This feature is essential for granting direct access to specific individuals, such as corporate clients or manually approved users, without requiring them to interact with the standard payment flow. Frontend Requirements: Implement a UI component on the paywall page to manage a whitelist. The component should display a list of email addresses. Allow adding and removing email entries from this list. Backend Requirements: Store and manage the whitelist on the backend. When paywall.open() is triggered, skip displaying the paywall for users whose email is on the whitelist. This functionality ensures a smoother experience for special access cases, such as direct corporate agreements or promotional access.

Andrey Volkov 7 months ago
Completed
Add ability to issue free daily queries for tokenized paywalls
This should help to keep users at the early stage and might be a useful feature for some other cases.

Nick L 8 months ago
Completed
Add ability to issue free daily queries for tokenized paywalls
This should help to keep users at the early stage and might be a useful feature for some other cases.

Nick L 8 months ago