Documentation

Everything you need to know about Soniurl

πŸš€Getting Started#

Connecting Facebook#

1Go to the FB Accounts page and click "Generate Invite Link".
2Copy the generated link. Optionally add a label to identify it later (e.g., "Client A account").
3Open the link in your browser (or share it with the Facebook account owner). On the invite page, click "Continue with Facebook".
4Grant Soniurl the required permissions in the Facebook dialog. After authorization, the system will automatically start fetching your ad accounts, BMs, and pages.
TipEach invite link is single-use and expires in 7 days. To connect multiple Facebook profiles, generate a separate link for each one.

First Synchronization#

After Facebook authorization, Soniurl fetches the account structure in the background: ad accounts, Business Managers, and fan pages. This process takes 1-3 minutes.

The Setup Wizard will then open automatically so you can choose which accounts and pages to track. After that, regular data synchronization begins (campaigns, ad sets, ads, metrics). The sync interval depends on your plan β€” from 1 minute (Business) to 15 minutes (Free).

TipYou can trigger a manual sync at any time from the Statistics page using the "Sync Data" button.

Setup Wizard#

After the Facebook profile data is loaded, the Setup Wizard opens automatically:

1Select which ad accounts to track β€” they're grouped by Business Manager. You can filter by status and search by name.
2Select which fan pages to enable for comment monitoring.
3Confirm your selection and complete the setup. Soniurl will begin syncing data for the selected accounts.
TipThe number of accounts and pages is limited by your plan. You can change your selection later in Settings.

πŸ“ŠStatistics#

KPI Cards#

The top of the Statistics page shows key performance indicators as cards with current values and trends compared to the previous period.

Spend β€” total ad spend for the selected period
Impressions β€” total number of ad impressions
Clicks β€” total number of clicks on your ads
CTR β€” click-through rate (clicks / impressions Γ— 100%)
CPC β€” cost per click (spend / clicks)
CPM β€” cost per 1,000 impressions (spend / impressions Γ— 1000)
TipThe set of KPI cards is fully customizable β€” you can choose which metrics to show and drag to reorder them.

Performance Grid#

The main data table shows campaigns, ad sets, and ads with their metrics in a tree hierarchy. Four view modes available: Tree (hierarchy), By Date (daily breakdown), Audience (breakdowns), and Drill (multi-level drill-down).

Columns are sortable β€” click any column header to sort. On a computer you can also reorder columns by dragging them and resize by dragging the column borders; on tablets and phones the order is fixed so that swiping the header scrolls the table.

TipUse the Columns panel in the sidebar to choose which metrics to display. Your column preferences are saved automatically.

Charts#

Switch to the "By Date" view mode to see line charts for your metrics over time: spend, impressions, clicks, CTR, CPC, and CPM. A conversion funnel visualization is also available.

Hover over any data point to see the exact values. Use the period selector to zoom into specific date ranges.

Filters#

Use filters to narrow down the data you see:

Date range β€” select a preset period or custom dates
Ad account β€” filter by specific ad accounts
Status β€” show only active, paused, or all entities
Search β€” find campaigns/ad sets/ads by name

CSV Export#

Export your statistics data to a CSV file for use in spreadsheets or other tools.

1Apply any filters you need β€” only visible data will be exported.
2Click the "CSV" button in the toolbar above the table.
3The CSV file will be downloaded with all visible columns and rows.

Sync & Send Costs#

Soniurl automatically syncs your Facebook ad data at regular intervals. The sync interval depends on your plan β€” from 1 minute (Business) to 15 minutes (Free).

If you use a tracker (Keitaro, Binom, etc.), Soniurl can automatically send cost data to it. This lets you see accurate ROI and profit in your tracker.

TipConfigure cost sending in Settings β†’ Tracker. You can choose which ad accounts to send costs from and how often.

πŸ’ΌAd Accounts#

Ad Accounts Table#

The Ad Accounts page displays all connected ad accounts in a grid. Use the profile picker at the top to filter by Facebook profile or Business Manager. Default visible columns:

Account Name β€” account name with a color health indicator (green = healthy, orange = warning, red = disabled/closed). Clicking the name opens the Statistics page for that account
Funding Source β€” the payment method linked to the account
Currency β€” the account's currency code
Impressions / Clicks / Results / Spend β€” aggregated performance metrics. Results show a breakdown by type (e.g. leads, purchases)
Status β€” account status badge β€” Active, Disabled, Closed, Unsettled, Pending Risk Review, etc.
Timezone β€” the account's timezone with UTC offset
Country β€” country flag and code from the business settings

Additional columns are available in the Columns panel: Campaigns/Adsets/Ads count, Pixels, Spend Cap, Balance, Age, Created date, Tax Status, Disable Reason, and more. Accounts can be grouped by FB Profile or Business Manager.

TipSelect accounts using checkboxes to reveal the action bar at the bottom with View Stats, Auto-Refresh, Set Commission, and Send Costs buttons.

Send Costs to Tracker#

Once your tracker is configured in Settings β†’ Tracker (see the Tracker Integration section), you can send cost data directly from the Ad Accounts page.

1Select the ad accounts you want to send costs for using the checkboxes.
2Click "Send Costs" in the floating action bar at the bottom.
3Choose a date preset (Today, Yesterday, Last 3 days, Last 7 days) or set a custom date range, then click Send.
TipAfter sending, a toast notification confirms the result with a link to view the send logs in Settings β†’ Tracker.

Auto-Refresh#

Auto-refresh keeps your ad account data up to date automatically. The sync interval depends on your plan (from 60 min on Free to 1 min on Business).

To enable or disable auto-refresh: select accounts using checkboxes, then click the "Auto-Refresh" button in the floating action bar. Accounts with auto-refresh enabled show a purple "AUTO" badge next to their name.

TipThe sync interval is set by your plan tier. Upgrading your plan gives you more frequent data updates.

Commissions#

If you manage accounts for clients, you can set a commission percentage that is factored into the statistics. Select accounts using checkboxes, click "Set Commission" in the floating action bar, and enter a percentage (0–100%).

Accounts with a commission show an orange percentage badge next to their name. The commission is applied to all spend from those accounts in the Statistics view.

TipSet to 0 or leave empty to clear the commission.

πŸ‘€FB Accounts#

Profile Management#

The FB Accounts page displays all connected Facebook profiles in a table. Each row shows the profile's assets and status at a glance.

Table columns:

Name β€” avatar, display name, profile ID, email, ad account and pages count badges
Personal Ad Accounts β€” expandable list with name, ID, status (Active/Disabled/Unsettled), currency, timezone, spend cap
Business Managers β€” expandable list with name, ad account count, spend limit, link to Facebook
Pages β€” expandable list of connected fan pages with links to Facebook
Total Spend β€” total spend across all ad accounts
Token Status β€” active (green), expiring (amber), expired (red), or none (gray)
Last Sync β€” relative time since last data sync (hidden by default)
Added β€” date the profile was added (hidden by default)

Available actions:

Generate Invite Link β€” creates a single-use invite link. Send it to the person who needs to connect their Facebook profile. The modal auto-detects when the profile is connected.
Manage Selection β€” opens the setup wizard to choose which ad accounts and Business Managers to track for this profile
Refresh β€” re-fetches the profile's Business Managers, ad accounts, and pages from Facebook
Reconnect β€” generates a new invite link prefilled with the profile name β€” use this to re-authorize an expired or broken token
Disconnect β€” removes the profile and all its data from Soniurl (requires confirmation)
TipPer-row actions (Manage Selection, Refresh, Reconnect, Disconnect) are always visible on the right side of each row. There is no floating action bar β€” all operations are per-profile.

Business Manager Structure#

The table organizes each profile's assets into expandable columns. Personal Ad Accounts shows accounts owned directly by the user. Business Managers shows BMs with their ad account counts and spend limits.

Click any expandable cell to reveal the full list. Each ad account shows its status (Active, Disabled, Unsettled), currency, timezone, and spend cap. Each BM shows a direct link to Facebook and its creation date.

Renaming#

You can give custom names to your Facebook profiles within Soniurl. This doesn't change anything on Facebook β€” it's just a local label for easier identification.

1Double-click the profile name in the table.
2An inline input appears β€” type the new name and press Enter to save, or Escape to cancel.
TipIf you clear the custom name or enter the original Facebook name, Soniurl reverts to showing the original name.

πŸ“„Pages#

Managing Fan Pages#

The Pages section shows all Facebook fan pages accessible through your connected profiles. Pages are displayed in a table with grouping by FB Profile and Business Manager.

Four stats cards at the top show key metrics:

Total Pages β€” count of pages in the current filter
Monitoring β€” pages with webhook monitoring enabled
Auto-Clean On β€” pages with auto-clean enabled
Comments Today β€” total comments received today across all pages

Table columns: Page Name (with avatar, ID, token status, BM/Personal badge, Facebook link), Monitoring (ON/OFF), Auto-Clean (ON/OFF), Clean Mode (Hide/Delete), Followers, Published (YES/NO), Comments, Today.

Profile Filter#

Use the profile picker dropdown at the top to filter pages by source:

All Profiles β€” shows pages from all connected FB profiles
Specific Profiles β€” select one or more profiles via checkboxes
Business Manager β€” drill down into a specific BM under a profile
Personal β€” show only personal pages (no BM) from a profile

The picker shows a tree structure: each profile expands to show its BMs and a Personal group. Token status is indicated by a colored dot (green = active, amber = expiring, red = expired). The active filter is saved in the URL for bookmarking.

TipUse the search box in the picker to quickly find a profile or Business Manager by name.

Monitoring (Webhooks)#

To track comments on a page, enable monitoring. This subscribes the page to Facebook webhooks so new comments appear in real time.

Use the floating action bar at the bottom: select pages with checkboxes, then click Enable Monitoring or Disable Monitoring. Toast notifications confirm success or show partial failures.

TipEach monitored page uses one slot from your plan's page limit. Pages without monitoring won't receive comment updates.

Auto-Clean & Clean Mode#

Auto-Clean automatically moderates incoming comments based on your rules and whitelist. Enable or disable it individually per page or in bulk via the floating action bar.

Clean Mode determines what happens to flagged comments:

Hide Mode β€” hides the comment from public view (the author can still see it, reversible)
Delete Mode β€” permanently removes the comment from Facebook (irreversible)

You can set a Whitelist of comma-separated words in the page drawer β€” comments containing whitelisted words are never auto-moderated. Bulk toggle Auto-Clean and switch Clean Mode via the floating action bar.

TipStart with Hide Mode to safely review what the auto-cleaner catches. Switch to Delete Mode once you're confident in your rules.

πŸ’¬Comments#

Comments Feed#

The Comments section shows a real-time feed of comments from your Facebook pages. New comments arrive instantly via WebSocket β€” no page reload needed.

Six stats cards at the top show: Total, Visible, Hidden, Deleted, Replied, and Today's comments. Stats update automatically after each action.

Comments are loaded via infinite scroll (50 per batch). Threaded replies appear indented under their parent comment with a visible reply count badge.

Page Selection#

Choose which page's comments to view using the dropdown at the top:

All Pages β€” shows comments from all subscribed pages in one combined feed
Single Page β€” select a specific page to see only its comments

The dropdown shows each page with its picture, name, page ID, subscription status (green dot), and auto-clean badge. Use the search box to quickly find a page.

TipThe selected page is saved in the URL (?page=all or ?page=PAGE_ID), so you can bookmark filtered views.

Filters & Search#

Filter comments using the controls above the feed:

Status tabs β€” All, Visible, Hidden, Deleted
Has Links β€” toggle to show only comments containing URLs (single-page mode only)
Post ID filter β€” click a post ID in any comment to filter by that specific post
Search β€” text search across comment content

Filters can be combined. Changing any filter resets the current selection.

Replies & Threading#

Comments display with full threading. Parent comments appear at the top level, replies are indented below with a left border and reply count badge.

1Hover over a comment and click "Reply" to open the reply input.
2Type your reply and click Send. The reply appears immediately in the thread and is posted from the page's identity.
TipReplies are posted as the Facebook page, not your personal profile.

Hide & Delete#

Manage unwanted comments directly from the feed:

Hide β€” hides the comment from public view on Facebook. The author can still see it. A 5-second undo toast appears.
Delete β€” permanently removes the comment from Facebook.
WarningDeleted comments cannot be recovered. Use Hide if you want to keep the option to restore later.

Bulk Actions#

Manage multiple comments at once:

1Select comments using checkboxes, or use "Select all" to select all non-deleted comments.
2The bulk action bar appears showing the count of selected comments.
3Choose an action: Hide, Delete, or Translate. Click "Deselect" to clear the selection.

Translation#

Translate comments into 12 supported languages: English, Russian, Ukrainian, German, French, Spanish, Portuguese, Chinese, Japanese, Arabic, Turkish, Polish.

Two ways to translate:

Per-comment β€” hover over a comment and click the Translate button
Bulk translate β€” select multiple comments, choose the target language from the dropdown in the action bar, and click Translate

Translations appear inline below the original text with a blue border. The source language is auto-detected.

Notifications#

Stay updated about new comments with two notification channels:

Desktop notifications β€” click the bell icon in the top-right to enable browser notifications. New comments trigger a notification with the commenter's name and message preview.
Telegram β€” set up Telegram in Settings to receive comment alerts in your Telegram chat or group.

The bell icon turns green when desktop notifications are active, gray when disabled. Browser notification permission is requested once on first enable.

TipThe WebSocket connection auto-reconnects with exponential backoff β€” you won't miss comments even after brief network interruptions.

🌱Comment seeding#

What seeding is#

Seeding posts comments on your own posts on behalf of your fan pages, following a scenario you write in advance. People don't linger under an ad post with no discussion; a few live comments and replies give social proof and lift engagement.

A seeding task has four parts: author pages, target posts, a scenario of steps and pacing parameters. Once started, Soniurl publishes the comments itself, spread out over time, and shows the status of each one in the dashboard.

Authors β€” any of your pages with a working token; every step has its own author.
Posts β€” pulled from a page, including ad posts and dark posts, or pasted as a list of ids and links.
Scenario β€” steps with a text pool, spintax, images and reply chains.
Presets β€” a scenario is saved once and applied to new posts in one click; it can be shared with a teammate.
AI assistant β€” describes the post, writes a scenario for the product and generates photos for steps using your Replicate key.
Dashboard β€” statuses, errors with a plain-language reason, pause, resume and page replacement.

The section lives in the top menu under "Seeding". On mobile it is in the "More" menu. Available on the Pro plan and higher and on custom plans.

What you need to start#

Check four things before the first task:

Author pages are connected in the "Pages" section and have a page token: the Facebook profile the page is connected through must be its admin, editor or moderator.
Target posts belong to your pages. A scenario won't start on someone else's posts: ownership is checked both in the builder and at start.
The Pro plan or higher, or a custom plan: other plans don't show the section. "Start seeding" and page replacement require an active subscription.
The AI assistant needs your own Replicate key (Settings β†’ AI). Everything else works without it.
TipIf a page has auto-clean enabled, there is nothing to switch off: the task's authors are added to the page whitelist automatically and their comments won't be hidden.

Creating a task step by step#

Click "New task" in the dashboard. The builder has four sections on the left and a "Summary" panel on the right.

1Name. Enter the task name in the page header; it is used in the task list and in presets.
2Participants. Click "Add page" and pick the author pages. Next to each you can see whether auto-clean is enabled. Comments are published on behalf of these pages.
3Posts. On the "From page" tab pick a page and tick posts in the list: it combines regular publications and ad posts, including dark posts, showing the 500 most recent. On the "Paste ID list" tab paste post ids or links, one per line; permalink and pfbid links are recognised automatically. The selection accumulates across pages, up to 5000 posts.
4Scenario. Add steps: each has its own author and a text pool, one text per line. The "Reply" button creates a reply step to the previous one, which makes a conversation chain. Images can be attached to a step.
5Parameters. "Spread between comments" sets the pause between publications, 60 to 300 seconds by default. "Daily cap per page" limits how many comments one page posts per day, 50 by default.
6Summary. On the right you see the total number of comments, the breakdown by author, the duration estimate, the number of chains and a preview of the first step's text for the first posts. The "more" button rerolls the preview.
7Click "Start seeding". To come back later, click "Save draft": the draft appears in the dashboard and posts can be added at start.
TipStart with one or two posts and a short scenario of two or three steps, look at the result in the dashboard, and only then scale up.
WarningOne scenario applies to every selected post: each post gets each step. 12 posts Γ— 3 steps = 36 comments. The text pool rotates across posts, so put several variants into it.

Scenario: steps, texts, spintax, images#

A step is one comment under each post. Root steps are published as standalone comments; reply steps are nested under their parent. The parent is always published before the child, and the next step waits its own spread after the previous one is published.

A typical chain: a question from one page, an answer from another, thanks from a third. The discussion looks alive rather than like a row of identical remarks.

Text pool: every line in the step field is a separate variant. Each post takes the next text in turn, so neighbouring posts get different comments. The more variants, the fewer repeats.

Spintax is switched on with the toggle on the step and adds variety inside one line: a group in curly braces with variants separated by a vertical bar expands into one of them. Groups can be nested. The text is chosen and fixed when the comment is queued.

{Hi|Hello|Good afternoon}! {Ordered|Got} it {yesterday|last week} β€” {happy with it|works great}.

Images: drag a file onto the step card or paste from the clipboard. One image goes with one comment; the step cycles through its set in turn. Up to 20 images per step, up to 8 MB each, images only.

The «¢ Bulk» panel builds the scenario from a single paste. Blocks are separated by a blank line: a block without a marker is a comment, a block starting with «>» is a reply to the previous comment, «>>» is a reply to that reply. Lines inside a block stay the text pool of their step.

Great product, bought it in March Taking it a second time > Where did you order it? > Is delivery slow? >> From the official store, arrived in 3 days Fair price for this quality

A batch with markers is appended to the scenario and never overwrites steps you already built β€” the single exception is the one empty step of a fresh task, which is replaced. A batch without markers behaves as before: blocks fill existing steps in order and extras create new ones. The panel shows the resulting tree and the step counts before you apply it.

Limits: up to 20 steps per scenario, up to 200 texts per step, up to 5000 characters per text.

TipWrite the way people write in comments: short, with typos, without advertising clichΓ©s. The AI assistant can set the style, length and amount of emoji.

Scenario presets#

A finished scenario can be saved and applied to new tasks so you don't rebuild the steps every time.

1In the "Scenario" section click "Save scenario" and name the preset. It appears as a pill above the scenario.
2In a new task click the preset pill: the steps and texts are filled in. If the task already has steps, the builder asks whether to replace them.
3The pill menu offers "Rename", "Pin", "Share" and "Delete". Sharing sends a copy to a team member.

In a copy for a teammate the step authors are reset, because everyone has their own pages: after applying it, pick an author in every step; the builder highlights where it is needed.

AI assistant#

The assistant writes a scenario for a specific post and generates photos for steps. It runs on your Replicate key: charges go to your Replicate account, the platform takes nothing for generations.

1Open Settings β†’ AI, paste the Replicate key and click "Verify and save". Default models for texts and photos are chosen there too, with prices shown next to them.
2In the builder select posts, then click "Assistant". The "Describe from post" button reads the post and fills in "Product" and "About the product"; both can be edited.
3Set the language, who writes, the scenario size (how many root steps and replies to each), variants per step, style, emoji and length. Generated steps are inserted into the scenario and can be edited like any other.
4Photo for a step: pick a scene and a model, adjust the prompt if needed, click "Vary" for another take. The finished photo lands in the step's image set.

The model can be changed for every generation; the price is shown next to the button. Limits are 20 generations per minute and 300 per day.

Tip"Describe from post" only sees the post's text and image. If the product isn't clear from the post, add a couple of sentences in "About the product": the scenario gets noticeably more accurate.
WarningThe cost next to the buttons is an estimate from the Replicate price list, not an exact bill. The app cannot see your Replicate balance: if funds run out, the generation returns a billing error.

Dashboard: statuses and control#

The dashboard shows the task list with status filters on the left and the selected task on the right. Statuses:

draft β€” the task is saved but not started.
running β€” comments are being published on schedule.
paused β€” stopped by you or automatically because a page token expired.
done β€” the queue is finished; you can add posts and continue.

Tiles above the table: "posted", "errors", "skipped", "queued" and "remaining" with a time estimate. The progress bar shows the same shares.

The table lists every comment as a row: the post with a Facebook link, step and chain, author, text, status with a reason, and time. The "Errors", "Queued", "Posted" and "Skipped" filters help find problem rows quickly. Actions in the task header:

Pause / Resume β€” stop and resume the queue without losing progress.
Add posts β€” append new posts to a running or finished task; the scenario applies to them.
Parameters β€” change the spread and the cap on the fly.
Replace page β€” if an author page's token expired, substitute another page in all its steps and not-yet-published comments.
Delete β€” remove the task and its queue; already published comments stay on Facebook.

Yellow banners above the table explain what is going on: "Facebook asked to wait" means the page is paused for a few minutes and the task continues by itself; "Page token expired" asks you to reconnect the page in "Pages" or replace it; "Many errors" suggests checking whether the posts are open for comments.

TipStatuses refresh on their own while the tab is open: the task list every 5 seconds, the table of a running task every 2 seconds.

Safety and limits#

Seeding is built to keep pages safe. What protects them automatically:

Daily cap per page β€” a page-wide counter shared by seeding and comment auto-clean. Default 50, range 1 to 1000; lower is better for fresh pages.
Spread between comments β€” a random pause within the set limits so publications don't go out in a burst.
Pause when Facebook asks β€” if Facebook asks to wait, the page is paused for the time it specifies, the attempt isn't spent, and the task continues by itself.
Action block β€” if Facebook temporarily blocks the page's actions, its comments are postponed for an hour.
Author whitelist β€” on target pages with auto-clean, the task's authors are whitelisted at start and removed when the task is deleted, so auto-clean never hides your own comments.
WarningA new ad page with no organic activity has a very small action budget on Facebook. Many author pages on one such target page will quickly hit pauses: start with a small cap and a short scenario.

Frequently asked questions#

Posts don't load or the list is empty

Most often the page token expired: the profile lost its admin or editor role. Reconnect the page in the "Pages" section and refresh the list. If ad posts didn't load, the builder shows a separate banner: the page needs advertising access.

A comment with the status "No permission or the post is closed for comments"

Facebook didn't let the page under this post: comments are disabled on it, or the page lacks the required permissions. Open the post on Facebook and check the commenting settings.

Only 500 posts are shown in the list

That is the cap per source so the list opens quickly. Add older posts on the "Paste ID list" tab by id or link.

Can I comment on other people's posts

No, seeding only works under posts on your own pages. The builder highlights foreign ids and links as errors and blocks the start.

A task can't be deleted

If some of the task's comments are being published right now, deletion is declined with a request to wait about 30 seconds. Click "Pause", wait for it to finish and try again.

A comment was published twice

A rare case: if publishing was interrupted between Facebook's response and saving the result, the comment may repeat after a restart. The extra one can be hidden or deleted in the "Comments" section.

🎨Creatives#

Creative Analytics#

The Creatives section lets you analyze performance at the creative (ad image/video) level. Each creative is aggregated across all ads and campaigns that use it, so you can see which visuals perform best.

Each row shows the creative thumbnail with a type badge (IMG/VID), title, body text, and usage count (how many ads and campaigns use it). Hover over a thumbnail to see a full-size preview.

Six summary cards at the top display totals: Creatives count (with image/video breakdown), Total Spend, Impressions, Avg CTR, Avg CPC, and Avg CPA.

Metrics#

Each creative displays the following metrics, aggregated across all ads using it:

Spend β€” total spend across all ads using this creative
Impressions β€” total impressions
Clicks β€” total clicks
Link Clicks β€” clicks on the ad link specifically
CTR β€” click-through rate (clicks / impressions)
CPC β€” cost per click
CPM β€” cost per 1,000 impressions
CPA β€” cost per conversion
Conversions / Purchases / Leads / Installs / Registrations β€” conversion metrics broken down by type

Metrics are color-coded with a heatmap: green means above average (for CTR) or below average (for CPC/CPM/CPA), red means the opposite. A Totals row at the bottom shows aggregated values.

TipClick any creative row to expand it and see which specific ads and campaigns are using it, along with per-ad spend, clicks, and status.

How creatives are grouped into rows#

One row is one creative, not one ad. Grouping is based on the file itself: when the same image or the same video runs across different ads, adsets and campaigns, they collapse into a single row and the metrics add up. Ad names do not affect grouping.

How a creative is identified, in order:

Image β€” by the image file. The same picture used in ten ads is one row.
Video β€” by the video cover. If the same clip was uploaded to the account several times, Facebook gives each upload its own id but keeps the cover β€” so re-uploads collapse together instead of multiplying.
Dynamic (catalog) β€” these have no file of their own, products are picked at delivery time, so they are grouped by product set. The row has a Products button.
No creative β€” ads whose file could not be identified. They all land in one shared row.
TipDifferent variations of one creative are different files, so by default they stay separate rows even when named 0al1, 0al2, 0al3. You can merge them manually, see the next subsection.

Merging and splitting manually#

You can adjust the automatic grouping. Every action is reversible and visible only to you.

Merge β€” tick the rows and press the button. Pick the main creative: the rest fold into it and the metrics add up. This is how variations of one creative are brought together.
Split β€” a button on the row. Breaks a group apart so every ad becomes its own row. A Regroup action appears next to it.
Split all β€” toolbar button. Does what Β«SplitΒ» does, for every row of the current table that holds several ads, in one go. Handy when covers of a non-target language glue different creatives together: split all, then Β«Group by nameΒ».
Group by name β€” merges rows whose ad name matches exactly. The names 0al1 and 0al2 differ, so this button leaves them alone.
Ungroup all β€” removes only the automatic name-based merges. Manual merges stay.

If you would rather not merge but still want to see variations together, use tags. Put one tag on every variation and filter by it: the rows stay separate while the Total row at the bottom shows their combined figures.

TipName tags as prefix:value, for example geo:US or offer:Sweeps, and they group themselves in the list.

Downloading the creative file#

Hover a thumbnail in the table β€” a download icon appears in its top-left corner. Clicking it downloads the file itself: the video for a video creative, the image for a static one. On tablets the icon is always visible.

The file name comes from the ad name. In a split group each row downloads its own ad's file rather than the group's sample.

TipCatalog (DPA) creatives have no single file β€” they are a set of products, so those rows carry no download icon. The same goes for a video Facebook serves no direct link for: the download answers Β«This creative has no downloadable fileΒ».

Old and archived creatives#

The table shows whatever had statistics in the selected period. If an ad did not run in that window there will be no row, even though it still sits in the ad account. Widen the date range and the creative comes back.

The regular sync pulls active and paused ads. Facebook does not return Archived and Deleted campaigns by default, so there is a separate Archived button on the Ad accounts page: pick the accounts, set the period, and archived campaigns are pulled together with their statistics β€” their creatives then appear here like any other.

WarningAcross many accounts and a wide period the archive pull can take up to half an hour. You can close the page, the job keeps running in the background.

Filters & Search#

Use date presets (Today, 7D, 14D, 30D, 90D) or set a custom date range. All connected ad accounts are included by default.

The search box filters creatives by title and body text in real time.

TipAdditional columns (Reach, Ads count, Campaigns count) are available in the grid's column panel.

⚑Rules and automation#

Creating a rule#

A rule is an automatic watcher. It monitors a chosen metric (for example, Β«SpendΒ» or Β«CPRΒ») at the level you pick β€” Β«CampaignΒ», Β«Ad SetΒ» or Β«AdΒ» β€” and when the condition is met, it performs an action on its own: it pauses the object, changes the budget or sends a Telegram notification. This way you don't have to watch your accounts around the clock by hand.

Below is a step-by-step guide to creating ONE rule in the Β«Create New RuleΒ» window. To apply rules to many accounts at once, use Β«Rule GroupsΒ» (see below).

What you need before you start
An ad account is connected and at least one sync has run β€” otherwise there are no metrics to check yet.
For actions that change something (pause, budget), the profile must have management access. For notifications it's enough to connect Telegram (Settings β†’ Telegram).
1Open the Β«Campaign RulesΒ» page and, on the Β«Campaign RulesΒ» tab, click Β«New RuleΒ».
2In the Β«Rule NameΒ» field, give it a clear name β€” for example, Β«Pause high-spend campaignsΒ». This is how the rule appears in the list and in the logs.
3Choose the Β«Ad AccountΒ» the rule applies to.
4In the Β«ScopeΒ» block, set the Β«Entity LevelΒ» β€” Β«CampaignΒ», Β«Ad SetΒ» or Β«AdΒ» β€” and in the Β«EntitiesΒ» field leave Β«(all)Β» or click Β«Select specificΒ» to limit the rule to the objects you choose.
5In the Β«ConditionΒ» block, build the trigger from three parts: Β«MetricΒ» + Β«OperatorΒ» + Β«ThresholdΒ», and pick a Β«Time WindowΒ» (the period over which the metric is calculated). More details in the Β«ConditionsΒ» section.
6In the Β«ActionΒ» block, choose the Β«Action TypeΒ»: Β«Pause campaignΒ», Β«Activate campaignΒ», Β«Adjust budgetΒ» or Β«Send Telegram notificationΒ».
7In the Β«SettingsΒ» block, set Β«CooldownΒ», Β«Check everyΒ», Β«Minimum eventsΒ» and, if you like, a Β«ScheduleΒ» β€” this protects you against false and overly frequent triggers (see the Β«Settings and safeguardsΒ» section).
8Click Β«PreviewΒ» to see which objects match the rule right now. Then click Β«Create RuleΒ» β€” or Β«Create pausedΒ» to watch the logs first without changing anything.
TipStart with a single condition and the Β«Send Telegram notificationΒ» action. Confirm from the logs that the rule catches what you want, and only then switch it to Β«PauseΒ» or a budget change.

Conditions#

A condition defines WHEN the rule fires. The primary condition has four parts:

Metric β€” what you measure β€” Β«SpendΒ», Β«CTRΒ», Β«CPRΒ», Β«ResultsΒ», and so on.
Operator β€” how you compare β€” Β«greater thanΒ», Β«less thanΒ», and others.
Threshold β€” the number the metric is compared against.
Time Window β€” the period over which the metric is calculated β€” Β«TodayΒ», Β«Last 3 DaysΒ», and so on.

When assembled, the rule reads like a sentence: Β«IF Metric Operator Threshold over the last Window β€” THEN ActionΒ». On the rule card, that same Β«Time WindowΒ» is labeled in words as Β«over the last …».

Which metrics are available

The Β«MetricΒ» dropdown holds dozens of indicators. The main groups:

Cost β€” Β«SpendΒ», Β«CPCΒ», Β«CPMΒ», Β«CPRΒ» (cost per result), Β«CPLΒ», Β«CPPΒ», Β«CPIΒ», Β«CPRegΒ».
Volume β€” Β«ImpressionsΒ», Β«ClicksΒ», Β«Link ClicksΒ», Β«ReachΒ», Β«LP ViewsΒ», Β«FrequencyΒ».
Quality β€” Β«CTRΒ», Β«Unique CTRΒ».
Results β€” Β«ResultsΒ» (all conversions), Β«LeadsΒ», Β«PurchasesΒ», Β«InstallsΒ», Β«RegistrationsΒ», Β«SubscribesΒ», Β«ContactsΒ».
Tracker β€” metrics with the Β«Tracker:Β» prefix are taken from your tracker β€” Β«Tracker: ROIΒ», Β«Tracker: ProfitΒ», Β«Tracker: CRΒ», Β«Tracker: CPAΒ», Β«Tracker: Cost/LeadΒ», and others. Available when a tracker is connected.
WarningAbout the names: Β«CPRΒ» is the Β«cost per resultΒ» from Facebook's data (don't confuse it with Β«Tracker: CPAΒ» β€” that's a separate metric from the tracker). Β«ResultsΒ» are Facebook conversions; in the form the metric is literally called Β«ResultsΒ», not Β«ConversionsΒ».
Operators
greater than β€” the metric is strictly above the threshold (for example, Spend greater than 50).
less than β€” the metric is strictly below the threshold (for example, CTR less than 0.5).
greater or equal β€” the metric is not below the threshold.
less or equal β€” the metric is not above the threshold.
Time Windows

Available: Β«TodayΒ», Β«YesterdayΒ», Β«Last 3 DaysΒ», Β«Last 7 DaysΒ», Β«Last 14 DaysΒ», Β«Last 30 DaysΒ». Maximum β€” 30 days.

The period is calculated in the ad account's time zone, so Β«TodayΒ» matches what you see in Ads Manager.

Additional conditions and AND / OR logic

Besides the primary condition, you can add Β«Additional ConditionsΒ» with the Β«+ Add conditionΒ» button. Multiple conditions are combined with logic:

AND β€” the rule fires only if ALL conditions are met.
OR β€” ANY one of the conditions is enough.
Group β€” the Β«GroupΒ» button wraps conditions in parentheses so you can mix AND/OR β€” for example, (A AND B) OR C. Β«UngroupΒ» removes the parentheses.

You can compare not only against a number but against an expression too: switch the field into expression mode and type a formula, for example Β«(leads + 1) * 40Β».

TipAlmost always, an additional Β«Spend greater or equal …» condition is your safeguard against false triggers early on, when there's still little data.

Actions#

An action is what the rule does when the condition is met. The Β«Action TypeΒ» field offers:

Pause campaign β€” turns off the object at the chosen level (campaign, ad set or ad). On the rule card it's labeled Β«PauseΒ».
Activate campaign β€” turns a previously paused object back on. On the card it's Β«StartΒ». Usually used with a schedule.
Adjust budget β€” increase, decrease or set an exact daily budget (see the fields below).
Send Telegram notification β€” only sends a notification, changing nothing in the campaigns. On the card it's Β«Notify OnlyΒ». The best choice for a first run.
Fields for the Β«Adjust budgetΒ» action
Budget Change (%) β€” by how many percent to raise/lower the daily budget (or Β«Daily Budget ($)Β» β€” set an exact value).
Min Budget Floor ($/day) β€” the budget won't go below this amount.
Max Budget Ceiling ($/day) β€” the budget won't go above this amount β€” essential when scaling.

Bid actions (Β«Increase BidΒ» / Β«Decrease BidΒ» / Β«Set BidΒ») are available only at the Β«Ad SetΒ» level and only for manual-bid strategies (bid cap / cost cap). On other strategies they are silently skipped.

WarningΒ«Delete New (Protection)Β» is a separate action that DELETES objects created during the schedule window (protection against unauthorized launches/hijacking). This is irreversible β€” use it deliberately and not in ordinary rules.
TipTip: it's safer to launch new rules with the Β«Send Telegram notificationΒ» action and switch to Β«PauseΒ» or a budget change after you've checked the logs.

Settings and safeguards#

The Β«SettingsΒ» block protects against false and overly frequent triggers. The key parameters:

Cooldown β€” how long to wait before the rule can fire again on the same object. Critical for budget actions.
Check every β€” how often the rule checks the metrics (the evaluation interval).
Minimum events β€” the minimum number of events (conversions) before the rule fires at all β€” so it won't cut a campaign on a couple of clicks right at the start.
Schedule β€” by default it Β«Runs 24/7Β». You can choose Β«Set scheduleΒ» β€” the days and hours when the rule is active (for example, Β«StartΒ» on weekdays at 09:00).
Telegram notification β€” send a notification when the rule fires (even if the action is a pause or budget change). Requires a connected Telegram.
Create paused β€” create the rule turned off, so you can watch the logs before it starts acting.
WarningBudget looping: the Β«Increase/Decrease budgetΒ» actions are NOT idempotent β€” +20% at every check over an hour compounds into multiplied growth. For budget rules, always set a Β«CooldownΒ» of at least 1 hour (6–12 is better) and a Β«Max Budget CeilingΒ». The system will show a looping-risk warning.

Ready-made recipes#

Common rules with exact field names β€” you'll assemble each in a minute. Tune the thresholds to your own campaigns.

Stop losses

Entity Level: Campaign Β· Metric: Spend Β· Operator: greater than Β· Threshold: 50 Β· Time Window: Today Β· Action: Pause campaign. Safeguard: set Β«Minimum eventsΒ» so it won't cut at the start.

High CPA (expensive conversion)

Metric: CPR Β· greater than Β· Threshold: 30 Β· Window: Last 3 Days Β· Action: Send Telegram notification. Be sure to add the extra condition Β«Spend greater or equal 30Β» (see the warning below).

Low CTR

Metric: CTR Β· less than Β· Threshold: 0.5 Β· Window: Last 3 Days Β· Action: Pause campaign. Extra condition Β«Impressions greater or equal 1000Β» β€” so the data is meaningful.

Budget guard (watcher)

Metric: Spend Β· greater than Β· Threshold: 100 Β· Window: Today Β· Action: Send Telegram notification. The first Β«safeΒ» rule before auto-pausing.

Frequency cap

Metric: Frequency Β· greater than Β· Threshold: 3 Β· Window: Last 7 Days Β· Action: Pause campaign. Stops audience burnout.

No results

Metric: Results Β· less or equal Β· Threshold: 0 Β· extra condition Β«Spend greater or equal 20Β» Β· Window: Last 3 Days Β· Action: Pause campaign.

Scale the winners

Metric: Tracker: ROI Β· greater or equal Β· Threshold: 2 Β· Action: Adjust budget, Β«Budget Change (%)Β» = 20, Β«Max Budget Ceiling ($/day)Β» = 500. Required: a Β«CooldownΒ» of 6–12 h.

Cheap leads β†’ boost

Metric: CPL Β· less than Β· Threshold: 10 Β· extra condition Β«Leads greater or equal 5Β» Β· Window: Last 7 Days Β· Action: Adjust budget +20%, ceiling $500. Same cooldown safeguard as above.

WarningThe CPR / Β«cost per resultΒ» pitfall: with zero conversions, cost per result is treated as infinity, and a rule like Β«CPR greater than XΒ» will fire falsely. Always add an extra minimum-Β«SpendΒ» condition so the rule fires only when there's real spend.

Templates#

A template is a ready-made rule preset for a typical scenario. On the rules page, open the Β«TemplatesΒ» tab and apply the one you need. Built-in templates:

Stop losses β€” Spend > 50 today β†’ Pause.
High CPA β€” CPR > 30 over 3 days β†’ Notify Only.
Low CTR β€” CTR < 0.5 over 3 days β†’ Pause.
Budget guard β€” Spend > 100 today β†’ Notify Only.
Frequency cap β€” Frequency > 3 over 7 days β†’ Pause.
No results β€” Results = 0 AND Spend > 20 over 3 days β†’ Pause.
CPC optimizer β€” CPC > 5 β†’ Decrease budget by 20% (floor $10).
Expensive leads β€” CPL > 20 β†’ Notify Only.
Stop on expensive lead β€” Ad level: Tracker: Cost/Lead > 50 AND Spend > 30 β†’ Pause.
CPM guard β€” CPM > 30 β†’ Pause.
Scheduled start β€” weekdays at 09:00 β†’ Start.
Lead generator β€” CPL < 10 AND Leads > 5 β†’ Increase budget by 20% (ceiling $500).
Tracker click gap β€” Campaign level: Link Clicks > 50 AND Link Clicks βˆ’ Tracker Clicks > 50 AND Link Clicks > Tracker Clicks Γ— 1.3 today β†’ Notify Only. Catches someone else's ads hidden in your campaign.
Clicks without tracker β€” Ad level: Link Clicks > 30 AND Tracker: Clicks < 1 today β†’ Notify Only. The tracker must receive ad-level sub IDs.

You can also save your own rule as a template, to reuse it and apply it to other accounts.

TipA template is a starting point. Always review and adjust the thresholds to fit your own campaigns and goals.

Voice input#

You can describe a rule in plain words, and Soniurl will assemble it for you.

1Click the microphone icon in the rule creation window (or type the description as text).
2Check that the metric, operator, threshold and action were recognized correctly, fix anything if needed, and save.
TipExamples: Β«Pause campaigns with spend over 50 and zero resultsΒ», Β«Notify me when CPC exceeds 5Β».

Preview#

Before saving, click Β«PreviewΒ» β€” it shows which objects the rule will affect RIGHT NOW.

The list shows the campaigns/ad sets/ads that match the conditions, with their current metric values. If the list is empty or too large β€” adjust the threshold or the window.

Running paused and observing#

To avoid risk, create the rule with the Β«Create pausedΒ» button. It will exist but change nothing β€” handy for watching how it behaves.

After turning it on, keep an eye on the Β«ActivityΒ» tab: every trigger is shown there. You can pause the rule at any time.

WarningFor the first few days, keep the Β«Send Telegram notificationΒ» action and check Β«ActivityΒ». That way you'll spot unexpected behavior early, without breaking anything.

Rule Groups β€” one set of rules for all accounts#

If you have several ad accounts with the same rules in each, you don't need to create them one by one. Create a rule group once, select all the accounts you need β€” and Soniurl will create identical rules in each of them. When you change something in the group, the changes roll out to all accounts at once.

Template Group β€” a set of ready-made templates on the Β«TemplatesΒ» tab. Convenient to assemble once and then apply to new accounts in a single click. Created with the Β«New GroupΒ» button. On its own it creates no rules.
Rule Group β€” on the Β«Rule GroupsΒ» tab it links the chosen templates with the chosen accounts and turns them into real rules (number of templates Γ— number of accounts). This is what answers Β«create once β€” apply to allΒ».
1Open the Β«Rule GroupsΒ» tab and click Β«New GroupΒ». On the Β«ConfigΒ» step, set the name, the entity level (Campaign / Ad Set / Ad) and choose the source: Β«Select templatesΒ» manually or Β«From template groupΒ» (in that case the Β«TemplatesΒ» step is skipped).
2On the Β«AccountsΒ» step, check all the ad accounts to apply the rules to. The Β«Select allΒ» button checks them all at once, and the Β«Hide with rulesΒ» / Β«Show with rulesΒ» filters help you avoid duplicating rules where they already exist.
3On the Β«ScopeΒ» step, choose Β«AllΒ» objects in each account or Β«Select specificΒ» campaigns, ad sets or ads.
4On the Β«PreviewΒ» step, review the totals: the Β«RulesΒ» card shows how many rules will be created (number of templates Γ— number of accounts). Click Β«Create N rulesΒ» β€” the rules will appear in the shared list on the Β«Campaign RulesΒ» tab. A single group holds a maximum of 500 rules.
TipTo change the conditions across all accounts at once, click Β«EditΒ» on the group card β€” the same wizard opens. Change the thresholds, add or remove accounts and save: the edits roll out to all accounts, while rules you paused by hand stay paused. The Β«Activate AllΒ» and Β«Pause AllΒ» buttons toggle the whole group at once.
WarningA group has two delete options. Β«Unlink GroupΒ» deletes only the group β€” the rules themselves remain and keep working standalone. Β«Delete with RulesΒ» deletes the group together with all its rules and their history. Important: if you remove an account from the group, its rules in that group are deleted along with their history β€” this is not a pause.
WarningWhen creating a template group, you can enable Β«Freeze valuesΒ». The group then remembers the current thresholds and keeps working by them, even if you later change the templates themselves. To pull in the new values, re-sync the metrics in the template group editor. Note: turning the freeze off does not restore your previous threshold settings.

Activity log and troubleshooting#

Every check and every action of a rule is recorded. The Β«ActivityΒ» tab is a detailed history: what happened, when, and why.

If a rule Β«didn't fireΒ», check Β«ActivityΒ» β€” the reason is usually one of these:

the condition wasn't met (the metric didn't reach the threshold over the chosen window) or the Β«Minimum eventsΒ» count wasn't reached;
the Β«CooldownΒ» since the last trigger hadn't elapsed;
Facebook rejected the status change (an account checkpoint or no management permissions) β€” the record will contain an error.
TipWhen you first turn a rule on, check Β«ActivityΒ» during the first few days β€” that way you'll catch unexpected behavior early.

πŸ“¦Bundles#

What is a Bundle#

A bundle is a set of automatic rules that manage all the campaigns of a single funnel based on their performance. Once a minute the bundle collects metrics, compares them against your limits and hard stops, and makes decisions: stop unprofitable entities, increase the budget of profitable ones, restart stopped ones, or send an alert.

WarningBy default a bundle acts at the level of INDIVIDUAL AD SETS, not campaigns. You configure and view the bundle at the campaign level, but it is the ad sets inside the matched campaigns that get stopped, restarted, and scaled. This is controlled by the "Action Target" field (action_target): adset (default) or campaign. Exception: when scaling an ad set in a CBO campaign, the budget is changed at the campaign level.

A bundle manages only active entities in the owner's selected ad accounts. Only bundles with the "active" status are evaluated. New bundles are created in Dry Run mode (simulation) by default β€” no real actions are taken until you turn it off.

Setting Up a Bundle: Step by Step#

1Go to the "Bundles" page and click "New Bundle".
2Enter a name and a Funnel ID β€” the value from the ||ID:XXX (or ||ID-XXX) tag in your campaign names. The bundle matches an exact match OR a prefix followed by an underscore, only within the selected accounts.
3Choose the Data Source (Tracker or Facebook β€” where to pull conversions from; default is Tracker) and the Click Source (which clicks to use for CPC; 5 options, default is FB clicks).
4Choose the "Action Target" (the ad set by default!) and configure as needed: limits (CPC / Strict CPC / CPM / CPI / CPL / CPR / CPD), hard stops, scaling, Daily Deposit Target, safety settings, auto-restart, and budget reset.
5Save. By default the bundle is in Dry Run mode β€” no real actions, only simulation logs, until you turn off Dry Run.
TipRun in Dry Run mode for 1–2 days, reviewing the logs, before enabling real actions.

Funnel ID β€” How the Bundle Finds Campaigns#

A bundle is tied to a funnel through the Funnel ID tag in the campaign name.

Format: ||ID:XXX or ||ID-XXX β€” both separators (colon and hyphen) are allowed.
Case doesn't matter (||id:989 will also work); the tag can be placed anywhere in the name, not necessarily at the end.
XXX may contain letters, digits, and underscores.
Example
Campaign Q3 Gambling US ||ID:989
||ID:989 β€” this campaign belongs to funnel 989; a bundle with Funnel ID 989 will pick it up.

A campaign is included in a bundle if its Funnel ID is exactly equal to the bundle's ID OR starts with "bundle ID + underscore" (prefix match for templates with FB macros). Example: bundle 555 will catch 555 and 555_anything, but NOT 5552; bundle 555_SUB4 will catch 555_SUB4_babka1, but not 555_SUB4X.

Matching is limited to the bundle owner's selected ad accounts (and, if specified, a particular list of accounts). Campaigns without an ||ID tag are never included in the funnel. The interface shows a counter of matched campaigns β€” verify that the tag works.

WarningDon't use the same Funnel ID for different offers β€” the metrics will mix and the bundle will make wrong decisions. Don't set an ID that is the beginning of another ID up to the underscore.

Where the Data Comes From#

The conversion source (Data Source) determines where the bundle pulls installs, registrations, leads, and deposits from:

Tracker (default) β€” conversions from the tracker: installs (t_conversions), registrations (t_regs), leads (t_leads), deposits (t_sales, or the t_deposits event when a deposit role is set in the tracker settings). If there is no tracker data for an entity, it falls back to Facebook events.
Facebook β€” events directly from FB: app_install (installs), complete_registration (registrations), lead (leads), purchase (deposits).

The click source (Click Source) β€” which clicks to use for CPC: 5 options β€” fb_clicks (default), fb_link_clicks (link clicks), fb_unique_clicks (FB unique clicks), tracker (tracker clicks), tracker_unique (tracker unique clicks).

Click Source is used not only for the CPC calculation, but also for the "click" stage and the "spend without clicks" hard stop.

WarningWhen you choose a tracker source, if there is no tracker data it counts as 0 clicks β€” with no fallback to Facebook data. A broken tracker can trigger the "spend without clicks" hard stop via its "zero clicks". Choose the source deliberately.

Funnel Stage Cascade#

The bundle determines which funnel stage each entity is in (by the number of events) and applies that stage's primary KPI. The stage is chosen by priority β€” from the deepest to the shallowest; an entity is always in exactly one stage.

Funnel Stages (priority order)
click β†’ install β†’ registration β†’ lead β†’ first_deposit β†’ confirmed_deposit
Click β€” the default stage (no deeper events). Primary KPI β€” Max CPC.
Install β€” has installs. Primary KPI β€” Max CPI; Max CPC becomes a guardrailGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. (alert only).
Registration β€” has registrations. Primary KPI β€” Max CPR; CPC and CPI become guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier..
Lead β€” has leads. Primary KPI β€” Max CPL; CPC and CPI β€” guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier..
First Deposit β€” has β‰₯ 1 deposit. Here it's not a flat limit that applies, but a probe window based on Max CPD (see "Limits"); CPC/CPI/CPL β€” guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier..
Confirmed Deposit β€” deposits β‰₯ the confirmation threshold (default 2). Primary KPI β€” Max CPD with a Γ—1.1 tolerance plus a "stall" check.

As the funnel deepens, the upper metrics (CPC, CPI, CPL) stop halting entities and turn into guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. β€” notifications only, no stopping.

WarningExceptions: cost per registration (CPR) before a deposit, Strict Max CPC, and CPM keep HARD-stopping at any stage β€” these are not guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier..
TipSet limits for all the stages you care about. The bundle automatically focuses on the deepest stage that has data.

Limits (7)#

Limits define the maximum acceptable cost. Five are tied to the funnel stage; two (Strict CPC and CPM) are ceilings that apply at any stage.

Max CPC β€” max cost per click. Hard-stops only at the "click" stage; deeper down it turns into a guardrailGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. (alert when CPC > Max CPC Γ— 3, no stop). Counted after the minimum number of clicks is reached.
Strict Max CPC β€” a strict CPC ceiling that applies at ANY stage: always stops if CPC is above the ceiling. For hard CPC control regardless of funnel depth.
Max CPM β€” CPM ceiling that applies at any stage: stops if CPM is above the ceiling. Counted after the minimum number of impressions is reached.
Max CPI β€” max cost per install. Hard-stops at the "install" stage; deeper down it's a guardrailGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. (CPI Γ— 2.5).
Max CPL β€” max cost per lead. Hard-stops at the "lead" stage and only after the minimum number of leads is reached (default 2); at the deposit stage it's a guardrailGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. (CPL Γ— 2).
Max CPR β€” max cost per registration. Works two ways: (1) as the primary KPI at the "registration" stage; (2) cumulatively before a deposit β€” for any entity without deposits that has registrations β‰₯ the minimum threshold (default 2), even if it's in the "lead/install/click" stage.
Max CPD β€” max cost per deposit β€” not a flat ceiling. On the first deposit a probe window kicks in: the allowed additional spend = the spend at the moment of the first deposit + (a fixed Probe Spend or Max CPD Γ— Probe Factor, default 0.5). At the confirmed-deposit stage (β‰₯ 2 deposits) β€” a hard stop when CPD > Max CPD Γ— 1.1 (10% tolerance) plus a "stall" check (stop if spend since the last deposit has exceeded that same tolerance).
TipSet limits slightly above your target CPA. Each limit has a built-in minimum-data threshold (see "Safety Settings") that prevents stopping too early.

Hard Stops (Emergency Brakes)#

Hard stops are checked BEFORE the stage limits: they trigger when an entity spends money but gets no events. Only ONE hard stop fires per entity per cycle β€” the first one in order: no clicks β†’ no installs β†’ no registrations β†’ no leads β†’ no deposits. If a hard stop fires, the stage limits are not evaluated in that cycle.

Spend without clicks β€” stop if more than $X spent and 0 clicks (per the selected Click Source).
Spend without installs β€” stop if more than $X spent and 0 installs.
Spend without registrations β€” stop if more than $X spent and 0 registrations.
Spend without leads β€” stop if more than $X spent and 0 leads.
Spend without deposits β€” stop if more than $X spent and 0 deposits (FTD).
Funnel spend without deposits (highest priority)
if the total spend of all matched campaigns of this funnel exceeds $X with 0 deposits β€” ALL entities of the funnel are stopped at once (ad sets by default), and the cycle ends. Only the funnel's own campaigns are counted (by Funnel ID), not all campaigns in the account.

Additionally, in the same block, the Strict Max CPC and Max CPM ceilings (see "Limits") work as "always-stops" β€” they stop on CPC/CPM at any stage.

WarningHard stops ignore the minimum-data thresholds (min-gates) β€” they fire purely by the rule "spend > $X and events = 0". They are held back only by "Min spend for evaluation", grace, and cooldown. Spend is compared in dollars (converted to USD).

Scaling (Budget Scaling)#

Scaling automatically INCREASES an entity's daily budget as conversions come in (only up, never down). By default the ad set's budget is changed (or the campaign's β€” for CBO and when action_target=campaign).

Works only if the Scaling Enabled toggle is on (off by default).

Formula (additive)
target budget += Scale First + (number of events βˆ’ 1) Γ— Scale Extra

For each event type (installs, leads, deposits) its own contribution is computed, and they are SUMMED into a single target budget. "First" is a one-time amount for the first event of the type, "Extra" is added for each subsequent one. This is the final target budget, not an increment; the bundle will set it only if it is higher than the current one.

Example
Scale Lead First = $10, Scale Lead Extra = $5
1 lead β†’ target budget $10
2 leads β†’ $10 + (2βˆ’1)Γ—$5 = $15
3 leads β†’ $10 + (3βˆ’1)Γ—$5 = $20
Max Budget β€” the ceiling: final budget = min(sum, Max Budget). Default 0 = no ceiling. Always set Max Budget, otherwise a spike in events will make the budget grow uncontrollably.
Scale Stop After (HH:MM) β€” after this time (in the bundle's time zone) the budget is no longer increased; resets at midnight. A budget that has already been set is not reduced.
Daily Deposit Target β€” as soon as an entity reaches the specified number of deposits for the day, scaling stops for it (0 = no limit).
Suppression β€” scaling is not performed if any limit or hard stop fired in this cycle, nor during grace/cooldown windows. Anti-jitter: a new value is ignored if it differs from the last one by less than $1.
CBO β€” if the ad set is in a CBO campaign, the budget is set on the campaign (with protection against double-scaling the same campaign by multiple ad sets in one cycle).
TipScaling β‰  Budget Reset: scaling is an incremental increase each cycle; budget reset is a fixed value once a day (see "Auto-Restart and Budget Reset").

Safety Settings#

Minimum-data thresholds prevent evaluating a limit until there is enough data. Important: the gates only skip the evaluation of the corresponding limit, but they do NOT skip hard stops.

Min spend for evaluation β€” until an entity has spent at least $X, both hard stops and limits are skipped (default 0).
Min clicks for CPC β€” don't evaluate CPC until the specified number of clicks is reached (off by default).
Min installs for CPI β€” don't evaluate CPI until the specified number of installs is reached (off by default).
Min impressions for CPM β€” the CPM ceiling doesn't fire until impressions are below the threshold (off by default).
Min leads for CPL β€” don't evaluate CPL until the specified number of leads is received (default 2, minimum 1).
Min registrations for CPR β€” don't evaluate CPR until the specified number of registrations is received (default 2).
Probe Spend (probe window) β€” a fixed additional amount allowed after the first deposit (overrides the factor).
Probe Factor β€” the probe window multiplier: probe = Max CPD Γ— factor. Range 0–2 (default 0.5). Works if Max CPD is set and there is still only one deposit.
Confirmed deposits threshold β€” the minimum number of deposits (β‰₯ 2, default 2) at which an entity moves into the confirmed-deposit stage (CPD Γ—1.1 + stall check).
Guardrail multipliers β€” notification thresholds (alert only, no stop): default CPC Γ— 3, CPI Γ— 2.5, CPL Γ— 2 (minimum 1.0). There are no guardrailsGuardrail is a metric in alert-only mode. It notifies you when exceeded but does NOT stop campaigns. Upper funnel metrics (CPC, CPI) become guardrails automatically when deeper conversions (leads, deposits) start arriving. Threshold = limit Γ— multiplier. for CPR, CPD, and CPM β€” only a hard stop.
Action Target β€” the level at which ALL actions are performed (stop, restart, scaling, reset): adset (default) or campaign. By default you look at the campaign, but the actions go to the ad sets. For CBO, scaling is automatically at the campaign level.
Grace period β€” after a restart, an entity is skipped from evaluation for N minutes (default 15).
Cooldown β€” a minimum of N minutes between actions on the same entity (default 30).
Dry Run β€” test mode: all decisions are logged (simulation), but no real actions are performed. On by default for new bundles.
WarningThe eval_scope field (per_campaign / per_adset / per_funnel) is present in the config, but the current engine version does NOT use it β€” granularity is set only by the "Action Target" parameter. Reserved for the future.
TipAdditional settings: the bundle's time zone, priority, notes, the Telegram notifications toggle, and the restriction to a list of ad accounts.

Auto-Restart and Budget Reset#

Auto-restart (OFF by default) restarts stopped entities once a day. It fires only if the auto_restart_daily toggle is on AND a "Restart Time" is set β€” without both conditions nothing happens.

Restart Time (HH:MM) β€” in the bundle's time zone; the restart fires once a day when the dispatcher hits the 5-minute window after the specified time (any time of day, not necessarily morning).
Restart Mode β€” only_bundle_stopped (default) β€” only entities stopped by this bundle; all_stopped β€” entities stopped both by the bundle and manually.
Max restarts per day β€” per entity (default 3); the counter resets once a day. When the limit is reached, the restart is skipped and logged.

A restart returns the entity to the active status, clears the stop reason, and is applied to ad sets (or campaigns β€” per action_target).

Daily budget reset: once a day at the set time, the daily budget is reset to a fixed value that you specify (not to the "initial" one). You need to set both the time and the value.

Budget Reset β€” requires budget_reset_time and budget_reset_value (in USD); fires once a day (5-minute window).
Only upscaled β€” if enabled, the reset is performed only on entities whose budget the bundle raised via scaling during the day.
CBO/ABO β€” for CBO campaigns the budget is set at the campaign level, for ABO β€” on each ad set (determined automatically).
TipThe reset is independent of scaling and clears the accumulated scaling state β€” the next cycle will recompute the budget from scratch.

Statuses, States, and Logs#

Bundle statuses: draft β†’ active (evaluated and acting) ↔ paused; archived (terminal). Only bundles with the active status are evaluated.

paused_reason β€” the reason for an AUTO-pause by the system (currently: token_expired when a Facebook token fails). This is not the same as a manual pause; it is cleared on manual resume.

For each entity the bundle stores: status (active / stopped_by_bundle / stopped_manually), the stop reason, budgets (current, base, and the one set by the bundle), the number of restarts for the day, and the time of the last action. The bundle self-heals: if an entity it stopped is turned on manually in FB β€” it resets its own state and re-evaluates it; if an entity is deleted or paused in FB β€” it marks it so as not to poke it or spam.

Every decision is written to the log: the action type (stop, restart, scale_budget, reset_budget, hard_stop_funnel, skip, alert), the reason (e.g., "CPC $12.5 > limit $8.0 (stage=click)"), a metrics snapshot (spend, clicks, impressions, CPM, installs, registrations, leads, deposits), success/error, and the dry_run flag.

WarningRecords with dry_run = true are a simulation: the bundle shows what it WOULD HAVE DONE, but no real actions are performed in Facebook.

Telegram Notifications#

Notifications arrive on any successfully performed action (stop, restart, scaling, budget reset, funnel stop) or when a guardrail alert fires. They do NOT arrive in Dry Run mode and do NOT arrive on a failed action (an error on the FB side). By default the action is applied to the ad set. The Telegram toggle for a bundle is in its settings.

Tips from Practitioners#

✦Start with Dry Run for 1–2 days and review the logs (marked dry_run=true): make sure stops and scaling fire correctly. In Dry Run, Telegram notifications don't arrive.
✦One Funnel ID = one funnel. Don't reuse an ID for different offers and don't make one ID a prefix of another up to the underscore.
✦Remember the action level: by default it's the AD SETS that get paused and scaled, not the campaign you're looking at. Choose the "Action Target" deliberately.
✦Hard stops + limits together: hard stops catch zero conversions (no clicks/installs/registrations/leads/deposits + funnel stop), limits catch high event cost (CPC, CPM, CPI, CPL, CPR, CPD).
✦Scaling β€” only with Max Budget: the formula is additive (it sums the contributions of installs, leads, and deposits), and during a spike in events the budget grows quickly. Use Scale Stop After so you don't raise the budget late at night.
✦Set up Telegram notifications so you always know when the bundle stopped, restarted, or scaled an entity.

πŸ”—Tracker Integration#

Overview#

Soniurl integrates with tracking platforms (Keitaro, tds.ceo, Binom v1, Binom v2, RedTrack, AIO, ClickFlare) for bidirectional data sync between Facebook Ads and your tracker.

The integration includes three core features:

Cost Sending β€” automatically push Facebook Ads spend data to your tracker
Stats Pulling β€” fetch revenue, conversions, and profit data from your tracker back into Soniurl
Tracker-based Rules β€” create automation rules based on tracker metrics (ROI, conversions, profit, etc.)

Connecting a Tracker#

To connect a tracker, go to Settings β†’ Tracker.

1Pick your tracker type: Keitaro, tds.ceo, Binom v1, Binom v2, RedTrack, AIO, or ClickFlare.
2Enter your tracker URL (e.g. https://your-tracker.com). RedTrack, AIO and ClickFlare need no URL β€” they are cloud-only.
3Enter the API key. Keitaro: Admin β†’ Settings β†’ Security β†’ API Key. Binom: Settings β†’ API. RedTrack and AIO: the token from the tracker's dashboard. ClickFlare: Settings β†’ API keys.
4Click "Test Connection" β€” the system will verify the API and show the number of campaigns found.
TipThe tracker URL is validated for security β€” private IPs and localhost are blocked.

Supported trackers:

Keitaro β€” full support β€” cost sending, stats pulling, auto-detection of campaigns by alias
tds.ceo β€” full support β€” cost sending and stats pulling; its UI and API are Keitaro-compatible
Binom v1 β€” basic support β€” cost sending only via API v1
Binom v2 β€” full support β€” cost sending and stats pulling via API v2
RedTrack β€” cost sending and stats pulling through the api.redtrack.io cloud β€” no URL needed
AIO β€” cost sending to the AIO.tech cloud β€” matching via a custom field (fb_ad_id / fb_adset_id / fb_campaign_id)
ClickFlare β€” stats pulling (including custom conversions as event columns) and campaign-level cost upload through the ClickFlare cloud β€” matching by trackingField custom variables (standard Facebook template)

Entity Mapping#

Soniurl links Facebook ad entities (campaigns, adsets, ads) to tracker campaigns via URL parameters. Configure the following:

Send Level β€” granularity of cost data β€” Campaign, Ad Set, or Ad. Default: Ad. More granular = more accurate tracker data.
Token / Sub ID β€” the URL parameter number that carries the Facebook entity ID. E.g., sub_id_4 means your ad link has ?sub4={ad_id}. Default: 4. Range: 1–20.
Tracker Alias Sub ID (alias_param) β€” the sub ID number in url_tags that carries the tracker campaign identifier β€” numeric ID or text alias. E.g.: sub7=142 (send to campaign #142) or sub7=my_offer (search by alias). The system auto-detects the type. Takes priority over "Auto-detect Alias".
Auto-detect Alias β€” fallback mode: if Tracker Alias Sub ID is not set, Soniurl extracts the campaign alias from the ad URL structure and finds the matching tracker campaign. When disabled, costs are sent to all tracker campaigns.
Timezone β€” used for correct date matching between Facebook (UTC) and your tracker. Select your tracker timezone.
WarningMake sure token_param matches what you configured in your Facebook Ads links. E.g., if you use sub4={ad_id}, select Token 4.

Sending Costs#

Costs can be sent manually or automatically.

1Go to Ad Accounts page and select the accounts.
2Click "Send Costs" in the action bar.
3Choose a date range (Today, Yesterday, Last 3/7 days, or custom) and click Send.

For each entity (ad/adset/campaign), Soniurl calculates the spend from Facebook Insights and sends it to the tracker via the update_costs API.

TipAll sends are logged. View logs at Settings β†’ Tracker β†’ Send Logs. Shows status (success/error/skipped), amounts, and errors.

Pulling Stats from Tracker#

Stats pulling fetches click, conversion, revenue, and profit data from your tracker and stores it in Soniurl. Data is displayed alongside Facebook metrics.

Available tracker metrics:

t_clicks β€” total clicks
t_unique_clicks β€” unique clicks
t_conversions β€” conversions (leads or sales depending on conversion_event setting)
t_revenue β€” revenue ($)
t_profit β€” profit (revenue βˆ’ cost)
t_roi β€” ROI (%) β€” (revenue βˆ’ cost) / cost Γ— 100
t_cr β€” CR (%) β€” conversions / clicks Γ— 100
t_epc β€” EPC ($) β€” revenue / clicks
t_leads β€” leads
t_sales β€” sales
TipPulling is available on Pro plan and above. For manual pull: Settings β†’ Tracker β†’ Pull Stats. Data is grouped by (entity, date) and upserted on each pull.

Automatic Sync#

Soniurl can automatically send costs and pull stats on a schedule.

Auto-send Costs β€” periodic cost sending to tracker. Interval: 10–1440 minutes. Works for selected ad accounts. Date preset: Today, Yesterday, or Today+Yesterday.
Auto-pull Stats β€” periodic data fetching from tracker. Interval: 10–1440 minutes. Available on Pro+ plan. Supported for Keitaro, tds.ceo, Binom v2, RedTrack, AIO and ClickFlare.

Both features are managed via Settings β†’ Tracker. Each auto-refresh cycle checks if the configured interval has passed since the last send/pull.

TipRecommended interval for auto-send: 30 minutes. For auto-pull: 30–60 minutes. Too frequent requests may cause tracker rate-limit errors.

Tracker Metrics in Statistics#

After pulling, tracker data appears in Statistics alongside Facebook metrics. Columns prefixed with "t_" are tracker data: t_clicks, t_conversions, t_revenue, t_profit, t_roi, t_cr, t_epc, t_leads, t_sales.

Tracker metrics are available at all levels: campaigns, ad sets, ads. Data auto-aggregates when navigating between levels (if send_level=ad, metrics roll up to campaign level).

TipFor correct display, ensure send_level in tracker settings matches the level you analyze data at.

Automation Rules with Tracker Data#

You can use tracker metrics as conditions in automation rules. E.g., "If t_roi < 50%, pause the ad" or "If t_conversions > 10, increase budget by 20%".

Available rule metrics: t_clicks, t_unique_clicks, t_conversions, t_revenue, t_profit, t_roi, t_cr, t_epc, t_leads, t_sales. Can be combined with Facebook metrics using AND/OR logic.

TipFor tracker-based rules, enable auto-pull to keep data fresh for each rule evaluation.

Limitations#

Current integration limitations:

Keitaro, tds.ceo, Binom v1, Binom v2, RedTrack, AIO, and ClickFlare are supported. Other trackers are not yet available.
Stats pulling is available for every tracker except Binom v1, which supports cost sending only.
One tracker per user β€” you cannot connect multiple trackers simultaneously.
Stats pulling requires Pro plan or higher. Cost sending requires Starter or higher.
Entity mapping uses URL parameters (sub_id). Keitaro and tds.ceo can match on the native creative_id column instead, and AIO matches on a custom field (fb_ad_id / fb_adset_id / fb_campaign_id), and ClickFlare on the traffic source trackingField variables (standard Facebook template). UTM tags are not supported for mapping.

Google Sheets Export#

Soniurl automatically exports Facebook ad statistics to Google Sheets. Each export creates 4 sheets: Info (summary), Campaigns, Ad Sets, and Ads.

The integration uses a Google Service Account β€” just share your spreadsheet with the provided email. If a tracker (Keitaro/Binom) is connected, its metrics are automatically included.

1Go to Settings β†’ Sheets tab.
2Copy the service account email shown at the top of the page.
3Create a Google Sheet, click "Share", and add the copied email with "Editor" access.
4Paste the sheet URL into the "Spreadsheet URL" field and click "Save".
5Choose the export period: Today, Yesterday, 7/14/30 days, This month. Optionally enable "Append mode" to accumulate historical data.
6Click "Export Now" for manual export. For automatic export, enable the toggle in Auto-Refresh β†’ "Google Sheets Export".
TipBy default, data is overwritten on each export. In append mode, new rows are added to existing ones β€” useful for building history in Google Sheets.

Created sheets:

Info β€” export summary: date, period, accounts list, row counts by level, column list
Campaigns β€” campaign-level statistics
Ad Sets β€” ad set-level statistics
Ads β€” ad-level statistics

Exported Facebook columns:

Date, Account, Entity Name, Entity ID, Status β€” entity and account identification
Impressions, Clicks, Spend, Reach, Frequency β€” reach and spend metrics
CTR, CPC, CPM, Unique Clicks, Link Clicks β€” click efficiency metrics
Results, Cost/Result β€” conversions and cost per result
Purchases, Leads, Registrations β€” conversions by type
Video Views, Likes, Comments, Reactions, App Installs, Landing Page Views β€” user actions

Tracker columns (if connected):

T.Clicks, T.Conversions, T.Revenue, T.Cost, T.Profit β€” core tracker metrics
T.ROI, T.CR, T.EPC, T.Leads, T.Sales β€” calculated tracker metrics
WarningStarter plan or higher is required. Make sure the spreadsheet is shared with the service account email as Editor.

βš™οΈSettings#

Account#

Manage your personal account settings:

Name β€” your display name shown in the dashboard and to team members
Email β€” your login email (can be changed with email verification)
Password β€” change your password or set one if you signed up via OAuth

Active Sessions:

Sessions β€” view all active sessions with device type, browser, OS, IP address, and last activity. Revoke individual sessions or all other sessions at once. Current session is marked with a badge.

Plan & Billing#

View your current plan, usage, and manage your subscription.

Usage bars show how much of your limits you're using:

Ad Accounts β€” used vs maximum allowed
Fan Pages β€” used vs maximum allowed
Rules β€” used vs maximum allowed

Features included in your current plan:

Sync interval (e.g., 15 minutes)
Tracker integration (full or send-only)
Breakdowns
Creative analytics
Telegram alerts
API access with request limits per plan

Active add-ons are displayed with their quantity and monthly price. Payment history shows all transactions with date, plan, period, amount, type, and status (color-coded: green = paid, amber = pending, red = failed).

TipUsage bars turn amber when you're over 80% of a limit. Click "View All Plans" to see a detailed comparison.

Tracker Integration#

Connect Soniurl to your tracking platform to automatically send cost data from Facebook Ads.

1Select your tracker type: Keitaro, tds.ceo, Binom v1, Binom v2, RedTrack, AIO or ClickFlare.
2Enter the tracker API URL and API key.

Configure additional settings:

Send Level β€” granularity of cost data β€” Campaign, Ad Set, or Ad (default: Ad)
Token / Sub ID β€” URL parameter number containing the tracking token (1–20, default: 4)
Timezone β€” timezone used for date matching between Facebook and your tracker
Phantom clicks β€” create a service click in Keitaro for ads with no clicks, so cost can be recorded. Keitaro only. Marked with sub_id_15=phantom, ip=0.0.0.0
Auto-pull stats β€” periodically fetch revenue data from tracker (Keitaro, tds.ceo, Binom v2, RedTrack, AIO, ClickFlare; interval 10–1440 min)
Date Preset β€” date range for auto-pull: Today, Yesterday, or Today + Yesterday
TipUse the "Test Connection" button to verify your tracker is reachable β€” it will show the number of campaigns found.

Telegram Notifications#

Receive instant Telegram notifications when rules trigger actions or new comments appear.

1Go to Settings β†’ Telegram and click "Connect Telegram".
2A link opens in Telegram β€” press "Start" to activate the bot.
3The connection is detected automatically and your Chat ID appears in settings.

Once connected, the following options are available:

Chat ID β€” your personal chat identifier, shown automatically after connection
Test β€” send a test message to verify the bot can reach you
Group Chat ID β€” add the bot to a Telegram group and paste the group's chat ID to receive alerts there too
Remove β€” disconnect Telegram integration entirely
TipEach rule has its own "Send Telegram notifications" toggle β€” you can choose which rules send alerts and which stay silent.

API Keys#

API keys let you access Soniurl data programmatically β€” for custom dashboards, automation, or third-party integrations. Base URL: https://ads.soniurl.com/api/v1/

1Go to Settings β†’ API. Click "Create Key".
2Name your key (e.g., "My Dashboard") and select access scopes.
3Copy the key β€” it's shown only once! Save it securely.
4Use the key in HTTP header: Authorization: Bearer mfk_your_key

Access Scopes:

analytics:read β€” statistics, metrics, daily breakdowns, summaries
ad_accounts:read β€” ad account list and status
campaigns:read β€” campaigns, adsets, ads (read)
campaigns:write β€” pause/enable, change budgets
rules:read β€” automation rules and execution history
bundles:read β€” bundles (read)
bundles:write β€” pause/resume bundles

Available Endpoints:

Entity endpoints are nested under the ad account: use the provider ID with the act_ prefix, exactly as returned by /ad-accounts. Date range is passed as from / to in YYYY-MM-DD.

GET /api/v1/usage β€” current API usage and limits
GET /api/v1/ad-accounts β€” list ad accounts
GET /api/v1/summary β€” summary across all accounts
GET /api/v1/insights β€” flat cross-account rows (account + entity + date) β€” replaces walking campaigns β†’ adsets β†’ ads
GET /api/v1/ad-accounts/{ad_account_id}/campaigns β€” campaigns with metrics for a date range
GET /api/v1/ad-accounts/{ad_account_id}/adsets β€” ad sets with metrics
GET /api/v1/ad-accounts/{ad_account_id}/ads β€” ads with metrics
GET /api/v1/ad-accounts/{ad_account_id}/daily β€” daily breakdown by account
GET /api/v1/ad-accounts/{ad_account_id}/creatives β€” creatives with performance data
GET /api/v1/ad-accounts/{ad_account_id}/tracker β€” tracker metrics (if connected). tracker metrics are also attached to each row of /creatives (object "tracker"); cost-per is computed client-side as spend Γ· the tracker counter
GET /api/v1/ad-accounts/{ad_account_id}/breakdowns β€” audience breakdowns: country, region, impression_device, publisher_platform, age, gender
GET /api/v1/ad-accounts/{ad_account_id}/pixels β€” account pixels ([{id, name}]); ad pixel β€” GET /ads?include=pixel
POST /api/v1/entities/{entity_id}/pause Β· /enable Β· /budget β€” manage: pause, enable, change budget
GET /api/v1/rules Β· /api/v1/bundles β€” rules, bundles and their logs
GET /api/v1/team β€” team and members roster (id, email, role, limits)
GET Β· POST /api/v1/team/invitations Β· PATCH /api/v1/team/invitations/{invitation_id}/limits Β· DELETE /api/v1/team/invitations/{invitation_id} β€” invitations: list, create (response carries invite_url; optional buyer caps max_ad_accounts / max_rules / max_fan_pages β€” applied when the invitee joins), edit caps on a pending invite, revoke
PATCH /api/v1/team/members/{user_id}/role Β· PATCH /api/v1/team/members/{user_id}/limits Β· DELETE /api/v1/team/members/{user_id} β€” member role (admin/teamlead/member), personal limits, removal from the team (opt. ?wipe_data=true β€” irreversible wipe of FB profiles and tracker before the kick)
GET /api/v1/team/lead-assignments · PUT /api/v1/team/leads/{lead_user_id}/buyers — teamlead→buyers map and full replace of a lead's roster
GET Β· POST /api/v1/seeding/tasks Β· GET Β· PATCH Β· DELETE /api/v1/seeding/tasks/{task_id} β€” seeding tasks: list with progress, scenario creation, update, delete
POST /api/v1/seeding/tasks/{task_id}/start Β· /pause Β· /replace-author Β· GET /api/v1/seeding/tasks/{task_id}/jobs β€” start with posts, pause, replace author page, comment queue with statuses
GET /api/v1/seeding/author-pages Β· POST /api/v1/seeding/resolve-posts Β· GET Β· POST /api/v1/seeding/assets Β· DELETE /api/v1/seeding/assets/{asset_id} β€” author pages, post link resolution, images for steps

Daily Request Limits:

Starter β€” 1 000 requests/day
Growth β€” 2 500 requests/day
Pro β€” 5 000 requests/day
Business β€” 20 000 requests/day

All requests require the Authorization: Bearer mfk_... header. Responses are JSON. Rate limit exceeded returns 429. Limits reset at midnight UTC.

WarningThe full key is shown only once when created. If lost β€” revoke the old key and create a new one.
TipKeep API keys secret. Never publish them or commit to version control. Create separate keys with minimal scopes for different integrations.

Team#

Create a team to share your plan with colleagues. Team members work under the owner's subscription and limits.

Why use a team
One plan for everyone β€” the owner pays once and all buyers work under their subscription β€” no separate plan per person.
Per-buyer limits β€” the owner sets each buyer's cap on ad accounts, rules and pages β€” the shared pool is split fairly and no one drains it.
Full owner visibility β€” all buyers' accounts and stats in one place; the owner can open a buyer's account via Β«Log in asΒ» to help with setup.
Add people fast β€” invite a buyer by email and they immediately work under your plan, with no separate payment (within your team slots).
Shared add-ons β€” extra slots and accounts bought on the owner instantly expand the whole team.

As the team owner, you can:

Invite β€” send an invitation by email β€” the member receives a link to join
Bulk Invite β€” invite up to 20 people at once by entering emails separated by commas or new lines
Per-member limits β€” set individual max ad accounts and max rules for each member
Usage dashboard β€” see how many ad accounts, rules, fan pages, and team slots are used across the team
Login as β€” access a team member's account to help them set things up (2-hour session)
Pending invitations β€” view, resend, or cancel invitations that haven't been accepted yet (valid for 7 days)
Remove from team β€” drop a member from the team: access is revoked, their account and data stay
Delete team β€” disband the team entirely β€” all members are removed

As a team member, you can:

View members β€” see the list of team members and the owner
View your usage β€” see your own ad accounts, rules usage, and limits set by the owner
Leave team β€” leave the team at any time
TipMembers with active paid subscriptions must cancel them first before joining a team β€” they'll use the owner's plan instead.

Referral Program#

Earn credits by referring new users to Soniurl. Share your referral link, and when someone signs up and subscribes, you both get credits.

Your referral link is shown with a Copy button. Click the Edit button to customize your referral code (3-32 characters, letters and numbers only).

Four stats cards show your referral performance:

Balance β€” your current credit balance in USD
Total Earned β€” lifetime earnings from referrals
Clicks β€” how many people clicked your referral link
Signups β€” how many people registered through your link

The Referrals table lists each referred user (masked name) with their date, status (Active/Expired/Disabled), and amount earned. Transaction History shows all credit movements with descriptions and amounts.

TipCredits can be used to pay for your subscription or extend your billing period.

✨Bulk Actions#

Selecting Items#

Bulk actions let you manage multiple campaigns, ad sets, or ads at once. Start by selecting the items you want to modify.

Click the checkbox on any row to select it individually.
Use the header checkbox to select/deselect all visible items.
A floating action bar appears at the bottom of the screen with available actions and a count of selected items.

Pause / Activate#

Quickly pause or activate multiple entities at once.

1Select the campaigns, ad sets, or ads you want to modify.
2Click "Pause" or "Activate" in the floating action bar.
3Confirm the action. All selected items will be updated on Facebook.

Budget & Bids#

Change budgets or bids for multiple entities at once. Three modes available:

Set to β€” set an exact budget/bid value for all selected items
Increase by β€” increase current budget/bid by a fixed amount or percentage
Decrease by β€” decrease current budget/bid by a fixed amount or percentage
TipBudget changes are sent to Facebook immediately. Double-check the amounts before confirming.

Rename#

Rename multiple entities using find-and-replace or templates. Useful for standardizing naming conventions across campaigns.

You can use variables like {name}, {index}, and {id} in the rename template.

TipPreview the results before applying β€” the rename dialog shows what each name will look like after the change.

Duplicate#

Create copies of selected campaigns, ad sets, or ads.

1Select items and click "Duplicate" in the action bar.
2Choose the number of copies (1, 3, 5, 10, or custom up to 20).
TipDuplicated items are created as paused. Review them before activating.

Delete#

Permanently delete selected entities from Facebook. This removes them from both Soniurl and Facebook.

WarningDeletion is permanent and cannot be undone. All statistics and data associated with deleted items will be lost on Facebook.

πŸ’ŽPricing & Plans#

Plan Comparison#

Soniurl offers five plans:

Free β€” 1 ad account, 1 fan page, 3 rules, 60-minute sync. No tracker, no creative analytics, no Telegram alerts.
Starter ($29/mo) β€” 5 ad accounts, 3 fan pages, 25 rules, 15-minute sync. Tracker (send only), creative analytics, Telegram alerts.
Growth ($49/mo) β€” 10 ad accounts, 5 fan pages, 40 rules, 10-minute sync. Tracker (send only), creative analytics, Telegram alerts.
Pro ($79/mo) β€” 20 ad accounts, 10 fan pages, 50 rules, 5-minute sync, team of 2 (owner + 1 member). Full tracker (send + pull), breakdowns, creative analytics.
Business ($149/mo) β€” 50 ad accounts, 30 fan pages, 200 rules, 1-minute sync, team of 3 (owner + 2 members). All features included.

Billing Periods#

Choose between four billing periods: Month, Quarter (5% off), Half-Year (10% off), or Year (15% off). Longer periods mean a lower per-month price.

Your subscription auto-renews at the end of each period. You can upgrade to a higher plan at any time β€” the difference is prorated for the remaining days.

TipSwitch to annual billing to save 15%. The discount is calculated and shown immediately on the Pricing page.

Promo Codes#

Enter a promo code on the Pricing page to get a discount. Promo codes can offer a percentage discount or a fixed dollar amount off.

Some promo codes may be restricted to specific plans or billing periods. The code is validated when you click Apply.

Credits#

Credits are earned through the referral program (10% commission from each referred user's payments). Your credit balance is shown at the top of the Pricing page.

Credits are applied during checkout β€” they reduce the amount you need to pay. If your credit balance covers the full amount, no payment is required.

TipCredits never expire. You can see your exact balance on the Pricing page.

Add-ons#

If you need more capacity beyond your plan limits, you can purchase add-ons. Available only on paid plans with an active subscription:

+5 Ad Accounts β€” $10, prorated to the remaining days of your billing period
+5 Fan Pages β€” $5, prorated to remaining days
+1 Team Member β€” $10, prorated to remaining days
+25 Rules β€” $5, prorated to remaining days
TipEach add-on can be purchased up to 10 times. The price shown is prorated based on how many days are left in your current billing period.

Payment#

All payments are processed via cryptocurrency (Cryptomus). After confirming your order, you'll be redirected to an invoice page where you can pay with any supported cryptocurrency.

The invoice is valid for 1 hour. After payment, the system automatically detects the transaction and activates your plan.

Documentation Β· Soniurl