Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import TabItem from '@theme/TabItem';
Each Actor run has a status, represented by the `status` field. The following table describes the possible values:

|Status|Type|Description|
|--- |--- |--- |
|---|---|---|
|`READY`|initial|Started but not allocated to any worker yet|
|`RUNNING`|transitional|Executing on a worker|
|`SUCCEEDED`|terminal|Finished successfully|
Expand Down Expand Up @@ -76,3 +76,11 @@ async def main():

</TabItem>
</Tabs>

## Communicating limitations

If your Actor has specific limitations for users on the Apify free plan (e.g., restricted features, limited results), it is crucial to communicate these clearly to avoid confusion.

- Status messages: Use `setStatusMessage` or the exit message to explain why a run finished early or failed (e.g., "Daily limit for free plan reached. Upgrade to continue.").
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's be more direct so they don't need to search the docs. Many devs don't know that Actor.exit has a status message

Suggested change
- Status messages: Use `setStatusMessage` or the exit message to explain why a run finished early or failed (e.g., "Daily limit for free plan reached. Upgrade to continue.").
- Status messages: Use `Actor.setStatusMessage` or `Actor.exit` message to explain why a run finished early or failed (e.g., "Daily limit for free plan reached. Upgrade to continue.").

- Avoid false errors: Do not return generic system errors or fail the run in a way that looks like a platform issue. This frustrates users and makes troubleshooting difficult.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, let's be more perscriptive

Suggested change
- Avoid false errors: Do not return generic system errors or fail the run in a way that looks like a platform issue. This frustrates users and makes troubleshooting difficult.
- Avoid false errors: Do not return generic system errors or fail the run in a way that looks like a platform issue. This frustrates users and makes troubleshooting difficult.
- Wrong: API usage is limited to 10 results
- Right: This Actor only allows up to 10 results for free users. Upgrade to a paid plan to receive unlimited results.

- Documentation: Clearly state any limitations in your Actor's `README` and input schema descriptions so users know what to expect before running the Actor.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Documentation: Clearly state any limitations in your Actor's `README` and input schema descriptions so users know what to expect before running the Actor.
- Documentation: Clearly state any limitations in your Actor's `README` and input schema descriptions so users know what to expect before running the Actor.
- General restrictions (like limiting the number of results) must be explained in the top-level input schema description that renders above the input editor UI.
- Feature-specific limitations must be included in the title of an input field. The title must include explanation in parenthesis such as `(paying users only)` or `(limited for free users`). E.g. `Max comments (paying users only)`.

28 changes: 18 additions & 10 deletions sources/platform/actors/publishing/monetize/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ For a detailed comparison of pricing models from the perspective of your users,

The following table compares the two main pricing models available for monetizing your Actors:

| Feature/Category | Rental | Pay-per-result (PPR) | Pay-per-event (PPE) |
|-------------------------|-------------------------------|-------------------------------|-------------------------------|
| Revenue scalability | Capped at monthly fee | Unlimited, scales with usage | Unlimited, scales with usage |
| AI/MCP compatibility | ❌ Not compatible | ✅ Fully compatible | ✅ Fully compatible |
| User cost predictability| Unpredictable (rental + usage) | Predictable | Predictable |
| Store discounts | ❌ Single price only | ✅ Store discounts available | ✅ Store discounts available |
| Marketing boost | Standard visibility | Standard visibility | Priority store placement |
| Commission opportunities| Standard 20% | Standard 20% | Standard 20% |
| Custom event billing | Not available | Not available | ✅ Charge for any event |
| Per-result billing | Not available | ✅ Charge per dataset item | Optional (via event; automatic via `apify-default-dataset-item`) |
| Feature/Category | Rental | Pay-per-result (PPR) | Pay-per-event (PPE) |
|--------------------------|--------------------------------|-------------------------------|------------------------------------------------------------------|
| Revenue scalability | Capped at monthly fee | Unlimited, scales with usage | Unlimited, scales with usage |
| AI/MCP compatibility | ❌ Not compatible | ✅ Fully compatible | ✅ Fully compatible |
| User cost predictability | Unpredictable (rental + usage) | Predictable | Predictable |
| Store discounts | ❌ Single price only | ✅ Store discounts available | ✅ Store discounts available |
| Marketing boost | Standard visibility | Standard visibility | Priority store placement |
| Commission opportunities | Standard 20% | Standard 20% | Standard 20% |
| Custom event billing | Not available | Not available | ✅ Charge for any event |
| Per-result billing | Not available | ✅ Charge per dataset item | Optional (via event; automatic via `apify-default-dataset-item`) |

## Setting up monetization

Expand Down Expand Up @@ -100,6 +100,14 @@ If no action is taken, the payout will be automatically approved on the 14th, wi

If the monthly profit does not meet these thresholds, as per our [Terms & Conditions](https://apify.com/store-terms-and-conditions), the funds will roll over to the next month until the threshold is reached.

## Handling free users

When monetizing your Actor, you might want to limit features or usage for users on the Apify free plan. If you choose to do this, you **must** handle it transparently:

- Communicate upfront: Clearly state any limitations in your Actor's `README` and input schema. Users should know about restrictions _before_ they run the Actor.
- Graceful exits: If a free user hits a limit, do not crash the Actor or return a system error. Instead, exit gracefully with a clear [status message](/platform/actors/development/programming-interface/status-messages#communicating-limitations) explaining the limit (e.g., "Free tier limit reached").
- Avoid confusion: Never make a policy restriction look like a bug or platform error.

## Actor analytics

Monitor your Actors' performance through the [Actor Analytics](https://console.apify.com/actors/insights/analytics) dashboard under **Development > Insights > Analytics**.
Expand Down
Loading